小。速度很快。可靠。
选择任意三个选项。
TH3型

1概述

SQLite测试线束#3(以下简称“TH3”)是三条测试线束用于测试SQLite。TH3满足以下目标:

TH3最初仅用于验证测试,但随后用于开发测试和调试事实证明,在这些角色中也很有帮助。全面覆盖在工作站上测试不到五分钟,因此在日常维护期间用作快速回归测试SQLite代码库的。

1.1.历史

TH3源于对SQLite的测试塞班系统.在TH3之前,所有SQLite测试都使用TCL公司脚本语言,但TCL不会(轻易)在SymbianOS上编译,这使得测试变得困难。第一次尝试为了解决这个问题,使用了“TH1”(测试线束#1)脚本语言-在可在SymbianOS上编译和运行的更便携的表单,以及这足以运行SQLite测试。TH1型无法作为SQLite的标准测试工具生存下来,但它确实发现了作为用于自定义的脚本语言化石版本控制系统。还有一个“测试线束#2”,试图使用操作符前缀标记创建简单的脚本语言驾驶考试。TH3是第三次尝试。

大约在同一时间,一些航空电子设备制造商表达了对SQLite的兴趣,这促使SQLite开发人员设计TH3以支持严格的测试标准DO-178B型.

2008年9月25日制定了TH3的第一个代码。在接下来的10个月里,经过不懈努力,TH3实现了2009年7月25日,100%MC/DC。TH3代码不断改进扩大。

截至2018-05-19,TH3源树包括在1709个单独的文件中有超过500000行源代码。

2操作

TH3是一个测试程序生成器。TH3的输出是一个程序在C代码中实施,旨在链接到测试中的SQLite库。生成的测试在目标平台上编译并运行程序以进行验证SQLite在该平台上的正确操作。

TH3的输入是用C或SQL编写的测试模块小型配置确定如何初始化SQLite的文件。这个TH3包包括1444测试模块和超过47种配置(截至2018-05-19)。新模块和配置可以添加以定制专门应用的TH3。每次运行TH3时,它都会读取要生成的可用测试模块和配置文件的子集一个自定义C程序,在所有指定的配置。SQLite的完整测试通常包括运行TH3多次生成涵盖不同测试程序SQLite操作的各个方面,然后将所有测试程序与一个通用的SQLite库,并在目标平台上单独运行它们。

TH3中没有任意限制。可以生成一个包含所有测试模块和所有配置文件的单个测试程序。然而,这样的测试程序可能太大,无法在嵌入式系统上部署平台。(截至2018-05-19,全面TH3测试超过850000条线路58MB C代码。)TH3提供了打破测试库的能力模块变成更小、更容易消化的块。

每个单独的测试模块可能包含数十个、数百个或数千个单独测试的结果。测试模块可以用C语言编写,也可以作为SQL或两者的混合。大约三分之二的现有测试模块是使用纯SQL编写,其余部分使用纯C或组合C语言和SQL语言。

每个测试模块文件都包含一个描述情况的标题在此情况下测试有效。对于特定配置,只有运行与配置兼容的模块。

三。生成测试程序

TH3程序生成器是一个名为“mkth3.tcl公司".要生成测试程序,只需运行此脚本并提供上包含测试模块和配置的文件的名称命令行。测试模块是使用“.测试“后缀和配置是使用“.cfg“后缀.Amkth3.tcl的典型调用可能如下所示:

tclsh mkth3.tcl*.test*.cfg>testprog1.c

mkth3.tcl脚本的输出是一个C程序,其中包含运行测试所需的一切-除了SQLite库本身。生成的测试程序包含测试使用的所有支持接口的实现模块,其中包含main()驱动测验。要将测试程序转换为可执行文件,只需根据SQLite编译:

cc-o测试程序1测试程序1.c sqlite3.c

上面显示的编译步骤只是代表性的。在工作装置中,通常需要在上指定优化参数和编译时开关编译器命令行。

对于嵌入式系统的测试,mkth3.tcl脚本和编译器上述步骤在普通工作站上使用交叉编译器,则生成的测试程序为传输到要运行的设备上。

生成测试程序后,它将在没有参数的情况下运行执行测试。进度信息和错误诊断出现在标准输出上。(可以做出其他输出安排对缺乏标准的嵌入式设备使用编译时选项输出通道。)如果没有,程序返回零错误和非零(如果检测到任何问题)。

单个TH3测试程序运行的典型输出如下所示:

与SQLite 3.8.11 2015-05-15 04:13:15 56 ef98a04765c34c2c2f3ed7a6f032f3b886e-DSQLITE_COVERAGE_TEST测试-DSQLITE_NO_SYNC(同步)-DSQLITE_系统_分配-DSQLITE_THREADSAFE=1配置开始c1。开始c1.pager08结束c1.pager08开始c1.build33结束c1.build33开始c1.orderby01结束c1.orderby01…15014行输出被省略。。。。开始64k.syscall01结束64k.syscall01开始64k.build01结束64k.build01开始64k.auth01结束64k.auth01配置结束64k。使用的TH3内存:6373738配置开始wal1。开始wal1.wal37端壁1.壁37配置端墙1。使用的TH3内存:100961已达到所有226个VDBE覆盖点th3:213.741秒内,1442264次测试中有0次错误。64位小型发动机th3:SQLite 3.8.11 2015-05-15 04:13:15 ef98a04765c34c2f3ed7a6f032f3b886e

输出以SQLITE_源ID(再次交叉检查sqlite3_sourceid())对于测试中的SQLite和报告中使用的编译时间选项通过sqlite3_compileoption_get()输出以摘要结束测试结果的重复SQLITE_源ID.如有检测到错误,额外的行详细说明了问题。错误报告行始终以单个空格字符开头,以便可以使用以下方法从大型输出文件中快速提取:

grep“^”

默认输出显示每个配置的开始和结束和测试模块组合。在上述示例中,“c1”和“64k”是配置和“pager08”、“build33”、“orderby01”等都是测试模块。编译时和运行时选项可以增加或减少输出量。可以通过显示每个测试用例中的每个测试用例来增加输出测试模块。可以降低输出逐步:忽略测试模块的启动和停止,忽略配置会启动和停止,最后会忽略所有输出。

3.1.测试自动化脚本

TH3附带了额外的TCL脚本,有助于自动化测试工作站上的过程。“th3make”脚本自动运行“mkth3.tcl”然后运行测试程序并检查结果。th3make的参数包括所有“*.test”测试模块和测试中包含的“*.cfg”配置。附加th3make选项可能导致使用不同的编译器(GCC、Clang、MSVC),以使用不同的输出详细级别在valgrind下运行测试程序,使用gcov等。th3make脚本还接受“*.rc”文件名作为论据。这些*.rc文件只是其他参数的集合通常一起用于单一目的。例如,“quick.rc”文件包含一组八个参数,用于快速运行(3分钟)全覆盖测试。这允许操作员键入“./th3make-quick.rc”作为键入所有必需命令行选项的快捷方式。这个以下是40多个可用*.rc文件中的几个:

TH3存储库还包括“multitest.tcl”脚本TCL脚本用于自动化工作站上的TH3测试。Multitest.tcl公司自动编译SQLite,然后跑步/th3通过各种对齐重复进行,并捕获简洁摘要屏幕中的输出。典型的multitest.tcl运行生成如下输出:

./multitest.tcl-q--作业3开始时间:2018-05-19 03:17:12 UTC文件mkdir sqlite3bldcd sqlite3bldexec sh/ramdisk/sqlite/configure文件副本-force config.h/配置.hexec使sqlite3.c干净文件重命名sqlite3.c/方形3.c文件重命名sqlite3.h/平方米3.hexec生成干净的sqlite3.c OPTS=-DSQLITE_ENABLE_UPDATE_DELETE_LIMIT=1文件重命名sqlite3.c/sqlite3udl.cexec生成干净的sqlite3.c OPTS=-DSQLITE_SMALL_STACK=1文件重命名sqlite3.c/sqlite3s.c光盘。。*******************************************************************************t01:覆土厚度。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。好的(00:03:42)t02:cov.rc++STAT4++反序列化-D_HAVE_SQLITE_CONFIG_H……确定(00:04:45)t03:vfs冠状病毒rc。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。好的(00:03:59)t04:演示rc。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。好的(00:00:05)t07:测试.rc/th3private/*.测试。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。好的(00:00:21)t08:测试.rc/th3private/*.test++STAT4…………..Ok(00:01:41)t05:快速rc。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。好的(00:04:26)t09:quick.rc~TEST_REALLOC_RESTRESS-函数化字符。。。。。。。。。。。。。好的(00:05:39)t10:quick.rc~THREADSAFE=0-DLONGDOUBLE_TYPE=双。。。。。。。。。。。好的(00:03:24)t06:quick.rc扩展.rc-D_HAVE_SQLITE_CONFIG_H…………好的(00:09:03)t11:quick.rc sqlite3ss.c~MAX_ATTACHED=125…………..好的(00:04:39)t12:quick.rc~BYTEORDER=0++RTREE。。。。。。。。。。。。。。。。。。。。。。。。。。。。。好的(00:07:28)t13:quick.rc~DISABLE_INTRINSIC++RTREE。。。。。。。。。。。。。。。。。。。。。。。好的(00:07:31)t16:quick.rc~TRACE_SIZE_LIMIT=15 cov1/main16.测试。。。。。。。。。。。。好的(00:00:22)t14:quick.rc~DIRECT_OVERFLOW_READ-符号字符。。。。。。。。。。。。。。好的(00:04:35)t15:quick.rc~UNTESTABLE~EXTRA_IF超低。。。。。。。。。。。。。。。。。。。。。好的(00:01:44)t17:quick.rc~MAX_MMAP_SIZE=0…………..好(00:04:46)t18:quick.rc++NULL_TRIM++OFFSET_SQL_FUNC。。。。。。。。。。。。。。。。。。。。好的(00:04:47)t19:quick.rc++BATCH_ATOMIC_WRITE++反序列化。。。。。。。。。。。。。。。好的(00:05:41)t20:lean1.rc快速rc。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。好的(00:03:09)t22:test.rc对齐2.rc sqlite3udl.c…………..好(00:44:22)t21:test.rc对齐1.rc。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。好的(01:02:32)t23:memdebug1.rc扩展名.rc。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。好的(01:49:58)t25:valgrind1.rc-O3扩展rc。。。。。。。。。。。。。。。。。。。。。。。。。。。。好的(00:56:08)t24:memdebug2.rc扩展名.rc。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。好的(01:43:34)t27:试验-ex1.rc。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。好的(00:45:00)t26:valgrind2.rc-O3扩展rc。。。。。。。。。。。。。。。。。。。。。。。。。。。。好的(01:02:52)t29:试验-ex3.rc。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。好的(00:31:48)t28:test-ex2.rc。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。好的(01:12:03)t30:测试-ex4.rc。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。好的(01:09:47)t32:test.rc对齐4.rc-m32 CC=叮当声。。。。。。。。。。。。。。。。。。。。。。。好的(00:48:31)t31:test.rc alignment3.rc sqlite3udl.c好的(01:22:29)t34:test.rc对齐6.rc。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。好的(00:35:31)t33:test.rc线路5.rc延伸段rc。。。。。。。。。。。。。。。。。。。。。。。好的(00:59:33)t35:test.rc对齐7.rc。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。好的(00:44:10)t40:fast.rc alignment2.rc sqlite3udl.c…………..好的(00:15:46)t39:fast.rc alignment1.rc extensions.rc-m32…………..好(00:33:19)t36:test.rc ~ MUTATION_test测试。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。好的(00:35:45)t42:fast.rc对齐4.rc。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。好的(00:13:03)t43:快速rc校准5.rc。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。好的(00:13:32)t44:fast.rc对齐6.rc。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。好的(00:11:41)t41:fast.rc alignment3.rc sqlite3udl.c好的(00:26:31)t45:fast.rc对齐7.rc。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。好的(00:12:57)t46:fast.rc-fsanitize=未定义。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。好的(00:38:18)*******************************************************************************bella(07:16:01)3个岩芯的44次take和198583082次测试中有0次失败SQLite 3.24.0 2018-05-18 17:58:33 c6071ac99cfa4b6272ac4d739fc61a85acb544f6c1c2a

如上所示,一次运行tcl调用th3make数十次,需要12到24个时间CPU小时数。输出的中间部分显示了每个个人th3make跑步以及该make的结果和经过的时间。单独试运行的所有构建产品和输出都是子目录中的捕获以进行测试后分析。底部的两行摘要显示了错误和测试的总数在所有的3次跑步和总的经过时间,以及SQLITE_源IDSQLite版本的信息测试。此摘要信息记录在释放检查表最终测试期间。

在multitest.tcl输出中应用缩写,以便每个th3make调用都可以放在一个80列的输出行中。省略了首字母“th3make”动词。“~”是“-DSQLITE_”的缩写,“++”代表“-DSQLITE_ENABLE”。因此,multitest.tcl输出行

quick.rc~DISABLE_INTRINSIC++RTREE

真的意味着

th3快速.rc-DSQLITE_DISABLE_INTRINSIC-DSQLITE_ENABLE_TREE

4测试覆盖范围

使用可用TH3测试模块的一个特定子集(“cov1”测试)获得的SQLite100%分支测试覆盖率和100%MC/DC公司按测量值通过覆盖测试在Linux x86和x86_64硬件上。自年以来的所有SQLite版本版本3.6.17(2009-08-10)已按照本标准进行测试。SQLite开发人员致力于保持100%的分行覆盖率和MC/DCSQLite的未来版本。

用于获得100%分支测试覆盖率的cov1测试集只是一个当前使用TH3实现的测试子集。新的测试模块包括定期添加。

5突变测试

TH3源树包含脚本化名称“突变测试.tcl”自动化了突变试验.

variation-test.tcl脚本负责以下内容的所有细节进行突变测试:

  1. 脚本将TH3测试线束编译为机器代码(“TH3.o”),如果必要的。
  2. 该脚本将sqlite3.c源文件编译为汇编语言(“sqlite3.s”)。
  3. 该脚本循环遍历汇编语言文件中的指令定位分支机构。
    1. 该脚本制作原始sqlite3.s文件的副本。
    2. 编辑副本以将分支指令更改为no-op或无条件跳转。
    3. sqlite3.s的副本被组装到sqlite3.o中,然后链接再次使用th3.o生成“th3”可执行文件。
    4. 运行“th3”二进制文件并检查输出是否有错误。
  4. 该脚本显示了上一步每个周期的进度,然后在末尾显示“幸存者”的摘要。“幸存者”是指TH3未检测到的突变。

突变测试可能很慢,因为每次测试最多需要5次在快速工作站上运行分钟,每个测试有两个分支指令,以及超过20000条分支指令。努力用于加快操作。例如,TH3是在这样的发现第一个错误时立即退出的方式,以及在这些突变中,许多周期只发生在几秒钟后。然而,variation-test.tcl脚本包括命令行选项来限制测试的代码行范围,以便变异测试只需要对那些最近发生了变化。

6TH3许可证

SQLite本身位于公共领域可以用于任何目的。但TH3是专有的,需要许可证。

尽管开源用户不能直接访问TH3SQLite的用户间接受益于TH3,因为SQLite的每个版本都是在多个平台(Linux、Windows、WinRT、Mac、,OpenBSD)。所以任何使用官方发布的人SQLite可以放心地部署其应用程序已经使用TH3对其进行了测试。他们根本无法重新运行这些测试没有购买TH3许可证。

此页面上次修改时间2022-01-08 05:02:57联合技术公司