热门标签 | 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 宕机测试

未完


推荐阅读
  • ANSI最全介绍linux终端字体改变颜色等ANSI转义序列维基百科,自由的百科全书由于国内不能访问wiki而且国内关于ANSI的介绍都是简短的不能达到,不够完整所以转wiki到此 ... [详细]
  • 本文探讨了如何利用 Application 对象在 PHP 应用程序中共享数据,特别是在多用户环境中保持数据的一致性和安全性。文章还介绍了 Application 对象的基本结构、方法和事件,并提供了实际应用示例。 ... [详细]
  • 本文提供了详细的指导,帮助开发者了解如何使用PHP插件进行网站内容的翻译,特别是针对WordPress插件和主题的汉化及多语言支持。 ... [详细]
  • 远程访问用户 Kindle通过电子书实现控制
    介绍自2007年以来,亚马逊已售出数千万台Kindle,令人印象深刻。但这也意味着数以千万计的人可能会因为这些Kindle中的软件漏洞而被黑客入侵。他 ... [详细]
  • 本文详细介绍了MySQL表分区的概念、类型及其在实际应用中的实施方法,特别是针对Zabbix数据库的优化策略。 ... [详细]
  • 第三周课堂测试1、使用汇编语言编写指令时,用一些简单的容易记忆的符号来代替二进制指令,比机器语言更为方便,属于高级语言。(B ... [详细]
  • KNN算法在海伦约会预测中的应用
    本文介绍如何使用KNN算法进行海伦约会的预测。我们将从数据导入、数据预处理、数据可视化到最终的模型训练和测试进行全面解析。 ... [详细]
  • 本文介绍如何使用 Oracle 数据库的 EXPDP 工具导出特定用户下的所有数据。包括登录系统用户、创建导出目录、授权访问权限及执行导出操作的具体步骤。 ... [详细]
  • 深入理解Redis集群机制
    本文旨在深入探讨Redis集群的工作原理,包括其架构设计、数据分布策略、节点通信及故障恢复机制等方面的内容。 ... [详细]
  • 本文详细解析了LeetCode第581题——最短无序连续子数组的解决方案,重点介绍了贪心算法的应用及其具体实现步骤。 ... [详细]
  • 本文探讨了归并排序算法在求解逆序数问题中的应用,并对比分析了两种实现方法。第一种方法使用指针和动态数组,存在内存管理上的风险;而第二种方法通过引入临时数组简化了实现过程,提高了代码的健壮性和可读性。 ... [详细]
  • 大数据SQL优化:全面解析数据倾斜解决方案
    本文深入探讨了大数据SQL优化中的数据倾斜问题,提供了多种解决策略和实际案例,旨在帮助读者理解和应对这一常见挑战。 ... [详细]
  • 本文深入探讨 JavaScript 中的 String 类型及其常见操作方法,包括字符串的创建、转换以及一些常用的字符串处理函数。 ... [详细]
  • 本文探讨了Thrift作为一款支持多语言的服务开发框架,其在体积、功能、扩展性以及多协议支持等方面的显著优势。特别地,Thrift作为一种RPC(远程过程调用协议)框架,非常适合用于构建可扩展且低耦合的分布式服务系统。文章通过多种编程语言对Thrift服务进行了性能测试,并提供了详细的测试结果。 ... [详细]
  • 本文探讨了如何在微信小程序中有效更新深层嵌套的对象数组中的特定字段值,特别是在页面初始化加载时对首个对象中的grade属性进行重新赋值的方法。 ... [详细]
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社区 版权所有