热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

SQLite如何测试

原文http:www.sqlite.orgtesting.html目录1.介绍   1.1.执行总结2.测试套件3.异常测试   3.1内存溢出测试   3.2I

原文 http://www.sqlite.org/testing.html

目录

1. 介绍

    1.1. 执行总结

2. 测试套件

3.异常测试

    3.1 内存溢出测试

    3.2 I/O错误测试

    3.3 crash测试

    3.4 复合破坏测试

4. 模糊测试(盲测?)

    4.1 SQL模糊

        4.1.1 使用The American Fuzzy Lop Fuzzer模糊

    4.2 残缺数据库文件

    4.3 边界值测试

5. 回归测试

6. 资源泄露自动检测

7. 测试覆盖率

    7.1. 语句(statement)与分支覆盖

    7.2. 保护(defensive)代码的覆盖测试

    7.3. 强制覆盖边界值和布尔数组测试

    7.4. 分支覆盖与MC/DC

    7.5.度量分支覆盖

    7.6.突变测试

    7.7.全覆盖测试的经验

8. 动态分析

    8.1. 断言

    8.2. valgrind  // 是一款用于内存调试、内存泄漏检测以及性能分析的软件开发工具

    8.3.Memsys2

    8.4. 互斥断言

    8.5.每日测试

    8.6. 未定义的行为检查

9. 禁掉优化的测试

10. 检查表

11. 静态分析

12. 总结

 

1. 介绍

SQLite的稳定性和健壮性在某种程度上通过全面和仔细的测试来达成的。

SQLite 3.12.0版本大约由116.3k(116300)行 C代码构成。对比来看,这个项目有787倍数量的测试代码与脚本,91577.3k(91577300)行。

1.1. 执行总结

三个独立开发的测试套件

100%分支覆盖

数百万测试用例

内存溢出测试

I/O错误测试

宕机与掉电测试

模糊测试

边界值测试

禁用优化后测试

回归测试

残缺数据库测试

断言的扩展和运行期检查

Valgrind分析

未定义行为金叉

检查表

2. 测试套件

有三个独立的测试套件用来测试SQLite的核心库。每一个测试套件都被单独的设计、维护和管理。

1. TCL tests是最老的用于SQLite的测试集。他们被包含在与SQLite 核心相同的公共域源码树中。TCL tests主要用于开发阶段。TCL tests用TCL脚本语言编写。TCL test套件自身含有用于创建TCL接口的24.7k 行C代码。共1038个文件,12.8MB大小,37706个不同的测试案例,其中大部分测试用例是参数化的,可以用不同的参数多次执行,以使得一个全量测试能运行百万个测试用例。

2. TH3测试套件是一个专有测试,用c编写,针对SQLite core提供100%分支覆盖测试(100%MC/DC测试覆盖)。因为TH3测试套件设计用在嵌入式和特殊的平台上,所以不能容易的支持TCL和工作站的服务。TH3测试仅仅用于发布的SQLite接口。TH3由55.6MB文件,758.5K行C代码组成,实现了40100不同的测试用例。TH3测试是大量参数话的,所以一次全量的测试大概运行1.5kk个不同的测试实例。TH3测试套件的一个子集提供100%分支覆盖。A soak test(浸泡测试) prior to release does hundreds of millions of tests.TH3更多信息可以参见这里。

3. SQL逻辑测试,或者简称为SLT测试,该测试套件用于运行大量的SQL语句在不同的数据库引擎与SQLite之间对比,并验证他们能得到想用的结果。SLT目前对比的数据库包括PostgreSQL、MySQL,SQL Server和oracle 10g。SLT运行7.2kk个查询,含有1.12GB测试数据。

除这个三个主要的测试套件之外,还有几个小程序用来实现特殊的测试。

4. speedtest1.c用来测试在典型工作负载的情况下的SQLite的消耗的性能。

5. mptester.c用来测试多线程并发情况下读写一个数据库的情况。

6. threadtest3.c用来压测多线程同时使用SQLite的情况。

7. fuzzershell.c用来运行一些模糊测试。

在发布SQLite之前,以上所有的测试必须在多平台、多种编译配置的情况下运行成功。

开发者在代码提交到代码库之前,需要运行一个TCL tests的测试子集(被称作veryquick测试),大约有135.5k测试用例。veryquick tests包括大部分测试,除了异常、模糊、和soak test(浸泡测试)。veryquick tests能抓到充分的错误,而且只要几分钟而不是几小时。

3. 异常测试

异常测试被设计用来验证当SQLite遇到一些错误时能否有合适的处理行为。在一个功能齐全的电脑上,并且保证输入正确的情况下构建一个SQL数据库引擎是相对容易的。构建一个能对非法输入稳健的响应,并能在系统损坏时继续工作的系统是难很多的。异常测试被用来验证下面这些行为。

3.1 内存溢出测试

SQLite,和所有的SQL数据库引擎一样,大范围的使用malloc。在服务器和工作站上,malloc从不失败,这样正确处理OOM错误就不是那么的重要了。但是在嵌入式设备上,自从SQLite被频繁的用于嵌入式设备上,OOM错误是一个令人恐惧的平常错误,那么SQLite能优雅的处理OOM错误将显得尤为重要。

OOM测试通过模拟OOM错误达成。SQLite允许一个应用程序通过sqlite3配置接口来替换malloc的实现。TCL和TH3测试套件都能插入一个修改版本的malloc工具,使得在大量分配动作后失败。这种malloc能被置成只失败一次后继续工作或者失败后继续失败。OOM测试在循环中执行。在循环的第一轮迭代里…未完

3.2 I/O错误测试

I/O错误测试是寻找验证SQLite能为健壮的处理I/O操作失败。I/O错误可能源自磁盘空间满了、损坏的磁盘硬件、使用网络文件系统时网络断开、SQL操作过程中系统配置或者权限发生了变化或者其他硬件和操作系统故障。不论什么原因引起,SQLite能正确地处理这些I/O错误是非常重要的。

I/O错误测试和OOM测试在概念上很相似。通过模拟I/O错误来检查验证SQLite对这些模拟的I/O错误能否正确处理。在TCL和TH3测试套件中,通过在一系列的I/O操作后插入一个专门的用于模拟I/O错误的虚拟的文件系统对象。和OOM测试一样,模拟I/O错误可以设置单次失败,或多次失败。测试运行在循环中,逐渐增加失败的点,直至测试用例没有错误的跑结束。这循环会被执行两次,一次是仅仅单次模拟I/O错误,另一次是一直模拟I/O错误。

在I/O错误测视里,当I/O错误模拟失败机制被禁用后,数据库将被使用PRAGMA integrity check测试,以确保I/O错误没有引入数据腐败(玷污?损坏,脏数据?)

3.3 宕机测试

未完


推荐阅读
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • C语言注释工具及快捷键,删除C语言注释工具的实现思路
    本文介绍了C语言中注释的两种方式以及注释的作用,提供了删除C语言注释的工具实现思路,并分享了C语言中注释的快捷键操作方法。 ... [详细]
  • 本文介绍了Perl的测试框架Test::Base,它是一个数据驱动的测试框架,可以自动进行单元测试,省去手工编写测试程序的麻烦。与Test::More完全兼容,使用方法简单。以plural函数为例,展示了Test::Base的使用方法。 ... [详细]
  • 本文介绍了在Windows环境下如何配置php+apache环境,包括下载php7和apache2.4、安装vc2015运行时环境、启动php7和apache2.4等步骤。希望对需要搭建php7环境的读者有一定的参考价值。摘要长度为169字。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 本文介绍了Linux Shell中括号和整数扩展的使用方法,包括命令组、命令替换、初始化数组以及算术表达式和逻辑判断的相关内容。括号中的命令将会在新开的子shell中顺序执行,括号中的变量不能被脚本余下的部分使用。命令替换可以用于将命令的标准输出作为另一个命令的输入。括号中的运算符和表达式符合C语言运算规则,可以用在整数扩展中进行算术计算和逻辑判断。 ... [详细]
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
  • Linux服务器密码过期策略、登录次数限制、私钥登录等配置方法
    本文介绍了在Linux服务器上进行密码过期策略、登录次数限制、私钥登录等配置的方法。通过修改配置文件中的参数,可以设置密码的有效期、最小间隔时间、最小长度,并在密码过期前进行提示。同时还介绍了如何进行公钥登录和修改默认账户用户名的操作。详细步骤和注意事项可参考本文内容。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
author-avatar
奔跑的饼干的饼干桶_698
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有