CS巴别塔(1)

Qt的Unit Test Framework简介

Posted in Uncategorized by Kenny Yuan on 2009/06/18

在国内的编程界,QT常常是不入程序员的法眼的,但平时能够听到的批评却有很多——大部分是对着MOC的。 其实QT有许多的好东西,比如在内部使用BSP管理数百万级别绘图对象的Graphics View Framework (这里说的BSP就是游戏编程中用的那个BSP)。除管理海量对象、3维变形、动画管理等功能之外,Graphics View Framework还能基于OpenGL渲染,而不用编写任何gl-开头的函数。

本文要介绍的是QT中的轻量级Unit Test Framework。既然要介绍的是代码框架,我就少喷方块字,直接先上一碟appetizer先:

代码

sample.cpp的内容:

01  #include <QtTest/QtTest>

02  class My1stUT : public QObject
03  {
04      Q_OBJECT

05  private slots:
06      void initTestCase()
07      {
08      }

09      void cleanupTestCase()
10      {
11      }

12      void testAdd()
13      {
14          QVERIFY(1 + 1 == 2);

15          QBENCHMARK
16          {
17              QString (100 * 1024 * 1024, '6');
18              QString (100 * 1024 * 1024, '4');
19          }
20      }
21  };

22  QTEST_MAIN(My1stUT)
23  #include "sample.moc"

上 面的代码构成了一个完整的单元测试。其中,slots是一个扩展关键字,Q_OBJECT用来声明一些专有的macro,#include用来包含头文件 和MOC的结果,QTEST_MAIN用来生成程序的主入口函数:main(int argc, char** argv)。

程序的主要 部分是三个member functions:initTestCase, cleanupTestCase和testAdd。其中,前两个名字是固定的,被测试系统默认调用的函数:initTestCase函数是第一个执行的测 试函数,用来为测试准备环境,如果没有需要,这个函数可以不写。cleanupTestCase的作用是在退出测试前清理资源,如果用不上,这个函数也可 以不写。

testAdd是实际的用户编写的测试函数,可以写任意多个函数,每个函数的名字也可以任意取(不一定要以test-开头)。这 些函数都会被当成测试用例,在最终生成的可执行程序中运行。与某些C++的测试框架不同,在这里我们不需要去任何地方注册这些测试用例。另外,这些函数的 名字可以在命令行中作为参数,用来手工指定运行哪一个测试。

testAdd中的程序行就是要编写的单元测试了,可以使用QCOMPARE和QVERIFY进行测试断言,还可以用QBENCHMARK测试性能。

编译

编译的过程也很简单,新建一个文件夹,比如名叫test,将sample文件放入,然后运行
1. qmake -project “QT += testlib”
2. qmake
3. make
即可得到可执行程序test.exe(此程序的名字取决于文件夹的名字)

运行

在命令行敲入test.exe -silent,得到如下结果:

Testing My1stUT

RESULT : My1stUT::testAdd():
1,141 msec per iteration (total: 1141, iterations: 1)
Totals: 3 passed, 0 failed, 0 skipped

大功告成!最后介绍一下test.exe的参数(这些参数都是QTEST_MAIN这个macro自动生成的,不用手工编写任何代码)

Usage: test.exe [options] [testfunction[:testdata]]…
By default, all testfunctions will be run.

options:
-functions : Returns a list of current testfunctions
-xml       : Outputs results as XML document
-lightxml  : Outputs results as stream of XML tags
-o filename: Writes all output into a file
-silent    : Only outputs warnings and failures
-v1        : Print enter messages for each testfunction
-v2        : Also print out each QVERIFY/QCOMPARE/QTEST
-vs        : Print every signal emitted
-eventdelay ms    : Set default delay for mouse and keyboard simulation to ms milliseconds
-keydelay ms      : Set default delay for keyboard simulation to ms milliseconds
-mousedelay ms    : Set default delay for mouse simulation to ms milliseconds
-keyevent-verbose : Turn on verbose messages for keyboard simulation
-maxwarnings n    : Sets the maximum amount of messages to output.
0 means unlimited, default: 2000

Benchmark related options:
-tickcounter    : Use CPU tick counters to time benchmarks
-eventcounter   : Counts events received during benchmarks
-minimumvalue n : Sets the minimum acceptable measurement value
-iterations  n  : Sets the number of accumulation iterations.
-median  n      : Sets the number of median iterations.
-vb             : Print out verbose benchmarking information.

-help      : This help

附录

没有提及的其它主要特性
1、在命令行给出测试数据
2、编程方式提供的GUI键鼠事件测试(非屏幕录制方式)
3、线程安全:框架产生的错误消息是线程安全的

最后还要说一句:QT的正确读法是cute,不要读成queue-tee

Advertisements
Tagged with:

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: