NTSE、TNT引擎研发之自动化测试实践

2月 19th, 2013

背景介绍

软件自动化测试,是软件测试中的一类分支。自动化测试是把以人为驱动的测试行为转化为机器执行的一种过程。通常,在设计了测试用例并通过评审之后,由测试人员根据测试用例中描述的规程一步步执行测试,得到实际结果与期望结果的比较。在此过程中,为了节省人力、时间或硬件资源,提高测试效率,便引入了自动化测试的概念。

 

基于NTSE、TNT项目的特点:

  • 软件需求变动不频繁

    NTSE是MySQL的一个非事务存储引擎,TNT是MySQL的事务存储引擎。两个项目在立项之初,就已经确定了项目的特性及主要功能。NTSE项目从2008年6月至今,其核心功能几乎没有变化。

  • 项目周期长

    NTSE、TNT均为数据库的存储引擎,研发难度大,周期长。其中,NTSE引擎从2008年6月立项,到目前为止已经历经5年左右时间,发布了多个版本。TNT引擎从2011年9月立项,至今也有了一年半左右时间。而且,两个项目还会一直进行持续研发,项目周期非常长。

  • 测试脚本可重复使用

    由于NTSE、TNT项目的核心功能相对稳定,因此很多测试用例,可以重复使用。例如:NTSE早期开发的测试框架与测试代码,在新的TNT引擎中仍旧能够正常运行。

    与此同时,数据库系统已经是非常成熟的系统,市场上已经有了大量自动化性能测试工具,这些工具也能够用于测试NTSE、TNT引擎。

NTSE、TNT项目以上三个显著的特点,非常符合软件自动化测试的基本需求。因此,在项目的研发过程中,大量使用了自动化测试技术,达到了很好的测试效果。

如何进行自动化测试

在NTSE、TNT项目的长时间研发、测试过程中,经过不断的总结与改进,提取出一系列通用测试逻辑,设计标准的自动化测试框架,转换为自动化测试。

一个测试能否以自动化方式进行?如何设计一个自动化测试框架?以NTSE、TNT的项目经验来说,必须满足以下条件:

  • 测试用例,必须是需要反复执行的

    如果一个测试用例,只需要执行一两次,那么就没有必要将其设计为自动化测试用例。

  • 测试用例,必须有明确的测试逻辑

    测试用例有何功能?输入、输出是什么?相同测试逻辑的所有测试用例,可以被统一到一个自动化测试框架之中,方便后续的管理与维护。

  • 自动化测试框架,必须可以自动验证测试的正确性

    自动化运行测试用例,但是却不能自动判断测试用例运行的正确与否,这样的自动化测试是无意义的。自动化测试,必须能够自动检测测试用例运行的成功与否。

  • 自动化测试框架,必须能够收集足够的信息与运行结果

    自动化测试,无论最终成功与否,必须能够将运行结果及时反馈,通知项目的负责人。于此同时,自动化测试过程中尽量多的采集各种信息是必要的,能够帮助项目人员更好的定位问题所在,并作对应的修复。

根据以上的原则,NTSE、TNT项目目前维护着7种自动化测试,如下图所示:
NTSE TNT自动化测试
这7种自动化测试,根据其功能划分,又可以分为3类:

  • 自动回归测试

    NTSE/TNT Unit Test与MySQL Test属于自动回归测试类型。其中,NTSE/TNT Unit Test属于研发人员编写的单元测试,验证代码每个功能模块的正确性,除此之外,还验证代码是否存在内存泄漏,统计代码的覆盖率等,每晚运行,第二天邮件发出运行结果;NTSE/TNT MySQL Test是MySQL提供的测试框架,以标准的SQL测试存储引擎的功能是否有效,同为每晚运行,第二天邮件通知结果。

  • 自动性能/稳定性测试

    Blogbench/TPCC Test属于自动性能测试。其中,Blogbench为团队自主研发的模拟网易博客应用的测试工具,TPCC则为标准的数据库测试工具。这两个测试工具,均可以测试各种压力场景下的NTSE、TNT引擎的稳定性与性能情况。在此基础上,团队还开发了自动化的系统信息采集工具,采集测试过程中的系统表现,指导进一步的系统优化。

  • 自动可用性测试

    余下的3个,崩溃恢复测试/并发DDL测试/TCPCopy Test,属于自动可用性测试。NTSE、TNT发布的版本,是否达到了可用性需求?是否足够稳定?是否能够处理各种场景?

    为了回答这些问题,团队设计了以上三种自动化测试。自动崩溃恢复测试,用于验证各种崩溃场景下,系统的可恢复性;并发DDL测试,用于验证系统是否支持并发DDL操作;TCPCopy Test,模拟的是网易在线博客应用,用于验证系统处理在线应用的稳定性。

    所有这3个测试,若测试出错均会发出邮件通知。若未报错,则7*24小时无间断运行。


自动化测试带来哪些优势

NTSE、TNT项目在实施了各种自动化测试之后,确确实实收到了很好的效果,在保证软件质量的同时,极大的提高了研发与测试的效率。

  • 自动化测试,降低了测试过程中的人力成本,提高了测试效率

    NTSE、TNT项目组成员,从手工化测试中解放出来。以崩溃恢复测试为例,需要模拟的崩溃恢复场景超过15个,运行时间从几秒,几分钟至几小时不等。若未搭建自动化测试框架,引入自动化测试,那么项目组成员中,必须有1人24小时不间断的搭建崩溃恢复测试环境,设定不同的崩溃恢复场景,等待系统崩溃之后,验证恢复的正确性,若通过验证,则重新搭建环境,开始新一轮的循环。

    针对崩溃恢复测试,就需要一位研发人员全力投入,不仅如此,还需要24小时连续的工作,这明显得不偿失。

    在引入自动化崩溃恢复测试之后,只需要运行一个脚本,所有的测试场景均自动运行,自动崩溃,自动恢复,自动校验恢复的正确性。如有出错则发出报警信息,若没有报错则一直7*24小时运行,极大的提升了测试效率,也提升了发现Bug的概率。

  • 自动化测试,起到了回归测试的功能,保证了软件的Regression Bug数量减少

    针对NTSE、TNT这类代码规模较大,持续研发的大型项目,研发过程中一个最担忧的问题,就是随着新功能、新改进的加入,破坏了原有代码的逻辑,产生了Regression Bug(原有代码出现Bug)。由于测试往往着眼于新功能的测试,因此Regression Bug是较难发现的。

    NTSE、TNT项目中采用的Unit Test与MySQL Test两个自动化测试框架,每晚自动运行,测试代码的原有功能是否仍旧正确,运行结果每天都会通过邮件形式发给项目中的每一个成员。对于潜在的Regression Bug,做到了当天代码提交,当晚发现,第二天解决,提高了代码质量。

  • 自动化测试,在测试过程中收集了大量的软件内部运行情况与系统信息,帮助进一步优化软件的性能与稳定性

    NTSE、TNT是自主研发的数据库引擎,而数据库则是最基础的软件之一。一个数据库软件是否足够优秀,有两个最基本的指标:性能与稳定性。稳定性是前提,不稳定的数据库,无法得到应用推广;性能是标准,在保证稳定性的前提下,评价不同数据库的优劣,往往会以基准测试(例如:TPCC,Sysbench)的性能为选择的标准。

    NTSE、TNT项目中采用的Blogbench、TPCC自动化测试,一来可用于测试产品在不同场景下的性能与稳定性表现。并且,在测试的过程中,测试脚本还自动采集了系统CPU、I/O各指标,并绘制为趋势图。根据每天采集的这些细粒度的系统信息,可以更好的发觉软件的瓶颈所在,做到有的放矢的优化,进一步提高系统的稳定性与性能指标。例如:下图为自动化TPCC测试过程中采集的CPU、I/O信息。



  • 通过自动化测试框架运行自动化测试,减少了人工测试犯错的可能性

    自动化测试,可显著减少人工测试犯错的可能性,这个是显而易见的。尤其是在面对相同测试任务的重复运行时,疲倦程度会指数级上升,进而带来测试质量的下降,而自动化测试刚好能够弥补此类人工犯错的问题。

 

篇后语

2013年,NTSE、TNT项目将在各个功能模块上做优化与改进。例如:NTSE引擎将会新增Online Add Column功能;行级缓存的Dump/Restore功能等。TNT引擎将会优化I/O,CPU的稳定性;新增表级/语句级的事务/非事务切换功能等。所有的这些,均需要借助于已有的自动化测试工具,保证代码质量,优化系统性能,并且也会根据新的需求新增自动化测试,进一步提高两个项目的测试效率。

 

  1. 藏章博客
    2月 21st, 201315:03

    这方面了解太少了,看来要加强。

  2. 超然台上仙
    2月 27th, 201316:04

    阅读innodb源码日志系统部分碰到一些问题,想请教一下以理清某些概念:
    1. 日志提交的顺序是与mtr提交的顺序一致的,但是怎么保证mtr的提交顺序与对应操作的产生顺序一致呢(即先开始的操作一定先提交吗?有没有可能先开始的操作后提交)。
    2.一个mtr中每次对同一个页进行修改都会产生一份特别的提交日志记录吗。
    3.锁方面的设计开发完成后如何进行测试。
    望不吝赐教。