将你的文件保存在云,与你的团队成员一同协作。
使用说明
一、关于SQLite
SQLite是一个进程库,实现了一个自包含的,无服务器,零配置,事务性的SQL数据库引擎。SQLite的代码属于公共领域,因此可以免费用于任何目的,商业或私人。SQLite是世界上部署最广泛的数据库,其应用程序数量超出我们的数量,包括几个备受瞩目的项目。
SQLite是一个嵌入式SQL数据库引擎。与大多数其他SQL数据库不同,SQLite没有单独的服务器进程。SQLite直接读写普通磁盘文件。具有多个表,索引,触发器和视图的完整SQL数据库包含在单个磁盘文件中。数据库文件格式是跨平台的-您可以在32位和64位系统之间或在big-endian和little-endian体系结构之间自由复制数据库。这些功能使SQLite成为应用程序文件格式的流行选择。SQLite数据库文件是美国国会图书馆推荐的存储格式。认为SQLite不能替代Oracle但作为fopen()的替代品
SQLite是一个紧凑的库。启用所有功能后,库大小可能小于600KiB,具体取决于目标平台和编译器优化设置。(64位代码更大。一些编译器优化,如积极的函数内联和循环展开可能导致目标代码更大。)在内存使用和速度之间存在权衡。SQLite通常运行得越快,你给它的内存就越多。然而,即使在低内存环境中,性能通常也相当不错。根据它的使用方式,SQLite可以比直接文件系统I/O更快。
SQLite在每次发布之前都经过了非常仔细的测试,并且声誉非常可靠。大多数SQLite源代码纯粹用于测试和验证。自动化测试套件可运行数百万个涉及数亿个单独SQL语句的测试用例,并实现100%的分支测试覆盖率。SQLite可以优雅地响应内存分配失败和磁盘I/O错误。交易是ACID即使因系统崩溃或电源故障而中断。所有这些都通过使用模拟系统故障的特殊测试装置的自动化测试来验证。当然,即使进行了所有这些测试,仍然存在漏洞。但与一些类似的项目(特别是商业竞争对手)不同,SQLite对所有错误都是开放和诚实的,并提供了错误列表和每分钟代码更改的时间顺序。
SQLite代码库由一名在SQLite全职工作的国际开发人员团队提供支持。开发人员继续扩展SQLite的功能并增强其可靠性和性能,同时保持与已发布的接口规范,SQL语法和数据库文件格式的向后兼容性。任何想要它的人都可以免费获得源代码,但也可以获得专业支持。
SQLite项目于2000-05-09开始。未来总是难以预测,但开发人员的意图是在2050年之前支持SQLite。设计决策是为了实现这一目标。
我们开发人员希望您发现SQLite很有用,我们恳请您使用它:制作快速,可靠且易于使用的优质产品。在原谅他人的同时,为自己寻求宽恕。就像你免费获得SQLite一样,也可以自由地给予,支付债务。
二、如何测试SQLite
1、测试线束
有三个独立的测试工具用于测试核心SQLite库。每个测试工具的设计,维护和管理都与其他测试工具分开设计。
在TCL测试是最古老的一套SQLite的测试。它们包含在与SQLite核心相同的源树中,而SQLite核心则与公共域相同。TCL测试是开发过程中使用的主要测试。TCL测试使用TCL脚本语言编写。TCL测试工具本身由用于创建TCL接口的26.1KSLOCC代码组成。测试脚本包含在1307个文件中,总大小为15.5MB。有40870个不同的测试用例,但许多测试用例都是参数化并运行多次(使用不同的参数),因此在完整的测试运行中会执行数百万次单独的测试。
所述TH3测试工具是一组专有的测试中,用C语言编写的是提供100%的分支测试覆盖率(和100%MC/DC测试覆盖)到核心SQLite库。TH3测试旨在在嵌入式和专用平台上运行,这些平台不容易支持TCL或其他工作站服务。TH3测试仅使用已发布的SQLite接口。TH3由大约57.9MB或792.3KSLOC的C代码实现43049个不同的测试用例。但是,TH3测试的参数化程度很高,因此全覆盖测试运行大约160万个不同的测试实例。提供100%分支测试覆盖率的案例构成了总TH3测试套件的子集。在发布之前进行浸泡测试可以进行数亿次测试。有关TH3的其他信息是单独提供。
在SQL逻辑测试或SLT测试工具是用来运行对阵双方SQLite和其他几个SQL数据库引擎的SQL语句的数量巨大,并确认他们都得到同样的答案。SLT目前将SQLite与PostgreSQL,MySQL,MicrosoftSQLServer和Oracle10g进行比较。SLT运行720万个查询,包括1.12GB的测试数据。
除了三个主要的测试工具之外,还有其他一些小程序可以实现专门的测试。
“speedtest1.c”程序估算了典型工作负载下SQLite的性能。
“mptester.c”程序是对多个进程同时读写单个数据库的压力测试。
“threadtest3.c”程序是同时使用SQLite的多个线程的压力测试。
“fuzzershell.c”程序用于运行一些模糊测试。
在每次发布SQLite之前,上述所有测试必须在多个平台上以及在多个编译时配置下成功运行。
在每次签入SQLite源代码树之前,开发人员通常运行Tcl测试的子集(称为“veryquick”),其中包含大约142.6万个测试用例。非常快速的测试包括除异常,模糊和浸泡测试之外的大多数测试。非常快速测试背后的想法是它们足以捕获大多数错误,但也只需几分钟而不是几个小时。
2、异常测试
异常测试是用于在出现问题时验证SQLite的正确行为的测试。构建一个在全功能计算机上格式良好的输入上正常运行的SQL数据库引擎是相对容易的。构建一个能够对无效输入做出明智反应并且在系统故障后继续运行的系统更加困难。异常测试旨在验证后一种行为。
内存外测试
与所有SQL数据库引擎一样,SQLite广泛使用malloc()(有关其他详细信息,请参阅SQLite中有关动态内存分配的单独报告。)在服务器和工作站上,malloc()在实践中从未失败,因此正确处理out-内存(OOM)错误并不是特别重要。但是在嵌入式设备上,OOM错误非常普遍,而且由于SQLite经常在嵌入式设备上使用,因此SQLite能够优雅地处理OOM错误非常重要。
通过模拟OOM错误来完成OOM测试。SQLite允许应用程序使用sqlite3_config(SQLITE_CONFIG_MALLOC)替换替代的malloc()实现,...)界面。TCL和TH3测试工具都能够插入一个修改后的malloc()版本,可以在一定数量的分配后操作失败。这些已检测的malloc可以设置为仅失败一次然后再次开始工作,或者在第一次失败后继续失败。OOM测试在循环中完成。在循环的第一次迭代中,检测到的malloc在第一次分配时被操作失败。然后执行一些SQLite操作并进行检查以确保SQLite正确处理OOM错误。然后将仪表化的malloc上的故障时间计数器增加1并重复测试。循环继续,直到整个操作运行完成,而不会遇到模拟的OOM故障。像这样的测试运行两次,
2.1I/O错误测试
I/O错误测试旨在验证SQLite是否对失败的I/O操作做出了明智的响应。I/O错误可能是由于完整的磁盘驱动器,磁盘硬件故障,使用网络文件系统时的网络中断,SQL操作过程中发生的系统配置或权限更改,或其他硬件或操作系统故障造成的。无论原因是什么,重要的是SQLite能够正确响应这些错误并且I/O错误测试试图验证它是否存在。
I/O错误测试在概念上类似于OOM测试;模拟I/O错误并进行检查以验证SQLite是否正确响应模拟错误。通过插入新的虚拟文件系统对象来模拟TCL和TH3测试工具中的I/O错误,该对象经过专门操作以在一定数量的I/O操作之后模拟I/O错误。与OOM错误测试一样,I/O错误模拟器可以设置为仅失败一次,或者在第一次失败后连续失败。测试在循环中运行,慢慢增加故障点,直到测试用例运行完成且没有错误。循环运行两次,一次将I/O错误模拟器设置为仅模拟单个故障,第二次设置为在第一次故障后将所有I/O操作设置为失败。
在I/O错误测试中,在禁用I/O错误模拟失败机制后,将使用PRAGMAintegrity_check检查数据库,以确保I/O错误未引入数据库损坏。
2.2碰撞测试
崩溃测试旨在证明如果应用程序或操作系统崩溃或者在数据库更新过程中出现电源故障,SQLite数据库不会损坏。SQLite中另一篇名为AtomicCommit的白皮书描述了SQLite为防止崩溃后数据库损坏所采取的防御措施。碰撞测试旨在验证这些防御措施是否正常运行。
当然,使用真正的电源故障进行碰撞测试是不切实际的,因此碰撞测试是在仿真中完成的。插入备用虚拟文件系统,允许测试工具在崩溃后模拟数据库文件的状态。
在TCL测试工具中,碰撞模拟在单独的过程中完成。主要测试过程产生一个子进程,它运行一些SQLite操作,并在写操作的中间随机崩溃。特殊的VFS随机重新排序并破坏不同步的写操作,以模拟缓冲文件系统的影响。在孩子死亡之后,原始测试过程打开并读取测试数据库,并验证子项尝试的更改是成功完成还是完全回滚。该INTEGRITY_CHECKPRAGMA用来确保没有数据库损坏发生。
TH3测试工具需要在嵌入式系统上运行,而嵌入式系统不一定能够生成子进程,因此它使用内存中的VFS来模拟崩溃。内存中的VFS可以操纵一系列I/O操作后制作整个文件系统的快照。崩溃测试在循环中运行。在循环的每次迭代中,创建快照的点都会前进,直到被测试的SQLite操作运行完成而不会访问快照。在循环中,在测试中的SQLite操作完成之后,文件系统被恢复为快照并且引入随机文件损坏,这是在断电之后期望看到的各种损坏的特征。然后打开数据库并进行检查以确保它格式正确并且事务要么完成运行要么完全回滚。对于每个快照,循环的内部重复多次,每次都有不同的随机损坏。
2.3复合破坏试验
SQLite的测试套件还探索了堆叠多个故障的结果。例如,运行测试以确保在尝试从先前崩溃中恢复时发生I/O错误或OOM故障时的正确行为。