(此处为人肉维护的镜像,原文请见:http://csbabel.wordpress.com/ 翻墙请用Google Reader查看:http://csbabel.wordpress.com/feed/ )
在国内的编程界,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 {
0 4 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