原文 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 宕机测试

未完

SQLite如何测试的更多相关文章

  1. Sqlite注入测试

    测试了一个网站是Sqlite数据库,还装有安全狗,绕过了防护,找到Payload,写了一个Python脚本来跑表,这里总结一下: 取得sqlite数据库里所有的表名 查询table,type 段是't ...

  2. SQLite剖析之动态内存分配

    SQLite通过动态内存分配来获取各种对象(例如数据库连接和SQL预处理语句)所需内存.建立数据库文件的内存Cache.保存查询结果. 1.特性    SQLite内核和它的内存分配子系统提供以下特性 ...

  3. 【转】Sqlite 混合模式程序集是针对“v2.0.50727”版的运行时生成的,在没有配置其他信息的情况下,无法在 4.0 运行时中加载该...

    开发环境: vs2010+.net framework 4.0+ System.Data.SQLite.DLL (2.0)今天在做Sqlite数据库测试,一运行程序在一处方法调用时报出了一个异常 混合 ...

  4. SQLite手工注入方法小结

    SQLite 官网下载:www.sqlite.org/download.html sqlite管理工具:http://www.yunqa.de/delphi/products/sqlitespy/in ...

  5. 有关SQLite的substr函数的笔记

    官方参考文档:SQLite Query Language: Core Functions http://www.sqlite.org/lang_corefunc.html 测试SQL语句: ,) AS ...

  6. 『开源重编译』System.Data.SQLite.dll 自适应 x86 x64 AnyCPU 重编译

    背景: > System.Data.SQLite.dll 程序集 不能良好的支持 AngCPU 格式 System.Data.SQLite.dll 在 适应 x86 和 x64 有三个方案: & ...

  7. sqlite初识

    最近在部署PHP网站项目的时候,发现项目并没有使用传统的三大关系型数据库,而是采用了sqlite数据库,以前的时候,也见过sqlite,但是并没有深入了解其功能和用法,好奇心驱使,决定好好研究一下sq ...

  8. DICOM医学图像处理:深入剖析Orthanc的SQLite,了解WADO & RESTful API

    背景: 上一篇博文简单翻译了Orthanc官网给出的CodeProject上“利用Orthanc Plugin SDK开发WADO插件”的博文,其中提到了Orthanc从0.8.0版本之后支持快速查询 ...

  9. js -- 操作sqlite数据库

    最近看到一个使用js来操作sqlite数据库的,测试了一下,具体使用的是 js操作类: https://github.com/kripken/sql.js/(sqlite js 驱动) 异步请求:ht ...

随机推荐

  1. 300ms延时

    具体参考:http://www.jianshu.com/p/6e2b68a93c88 一,简单粗暴型:禁用缩放 <meta name="viewport" content=& ...

  2. iOS 启动画面 代码自定义

    先来看一个可能会遇到的问题: 如果你已经删除了xcode为你的项目自动生成的LaunchScreen.storyboard, 然后你在测试你的app的时候发现,屏幕里出现了黑色的区域,如上图(画红线的 ...

  3. [转]如何解决外边距margin叠加的问题探讨

    两个或多个毗邻的普通流中的块元素垂直方向上的 margin 会折叠,那么如何使元素上下margin不折叠呢?下面的方法或许对大家有所帮助 一.首先你要知道什么情况下会触发:两个或多个毗邻的普通流中的块 ...

  4. 3Sum——leetcode

    Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Find all un ...

  5. 数论 - Pairs(数字对)

    In the secret book of ACM, it’s said: “Glory for those who write short ICPC problems. May they live ...

  6. js判断是iOS还是Android

    <script type="text/javascript"> var ua = navigator.userAgent.toLowerCase(); if (/iph ...

  7. [LintCode] Reverse Words in a String 翻转字符串中的单词

    Given an input string, reverse the string word by word. For example,Given s = "the sky is blue& ...

  8. for循环

    1.使用for循环输出矩形 public static void print1(int h,int w){        for(int i=0; i<h; i++){            f ...

  9. 【Scala】尾递归优化

    以递归方式思考 递归通过灵巧的函数定义,告诉计算机做什么.在函数式编程中,随处可见递归思想的运用.下面给出几个递归函数的例子: object RecursiveExample extends App{ ...

  10. Daily Scrum02 12.10

    不同于往常,今天我们在中午体育课后,就简单的进行了一次小组会议,主要是讨论了一下,我们的单词软件的查询功能的优化的进度与暂时达到的效果,界面的各个按钮等元素的素材的准备有点拖慢,由于要反复修改,查看效 ...