1、第第16章章 Qt 5单元测试框架单元测试框架QTestLib框架框架QTestLib框架框架Trolltech公司提供的QTestLib是一种针对基于Qt编写的程序或库的单元测试工具。QTestLib提供了单元测试框架的基本功能,并提供了针对GUI测试的扩展功能。QTestLib的特性,见表16.1。特 性详 细 描 述轻量级QTestLib 只包含 6000行代码和60个导出符号自包含对于非GUI测试,QTestLib只需要Qt核心库的几个符号快速测试QTestLib不需要特殊的测试执行程序,不需要为测试而进行特殊的注册数据驱动测试一个测试程序可以在不同的测试数据集上执行多次基本的GUI测
2、试QTestLib提供了模拟鼠标和键盘事件的功能IDE友好QTestLib的输出信息可以被Visual Studio和KDevelop解析线程安全错误报告是线程安全的、原子性的类型安全对模板进行了扩展使用,以防止由隐式类型转换引起的错误易扩展用户自定义类型可以容易地加入测试数据和测试输出中第第16章章 Qt 5单元测试框架单元测试框架简单的简单的Qt单元测试单元测试简单的简单的Qt单元测试单元测试【例】【例】(简单)(CH1601)首先实现计算圆面积的类,然后编写代码检查该类是否完成了相应的功能。(1)建立Qt单元测试框架,步骤如下。选择“文件”“新建文件或项目”菜单项,出现如图16.1所示的
3、对话框,选择“其他项目”“Qt单元测试”选项,单击“Choose.”按钮。简单的简单的Qt单元测试单元测试为测试项目命名,“名称”为“AreaTest”,连续单击“下一步”按钮,直至出现如图16.2所示的对话框,选择项目需要包含的模块。简单的简单的Qt单元测试单元测试单击“下一步”按钮,在如图16.3所示的对话框中设置将要创建的测试类的基本信息。其中,其中,“类名”命名为“TestArea”,“测试槽”(即待测试的函数)命名为“toAreaTest”,依次单击“下一步”按钮,直至单击“完成”按钮。简单的简单的Qt单元测试单元测试(2)计算圆面积类的具体实现步骤如下。在项目名上单击鼠标右键,选择
4、“添加新文件.”选项,在如图16.4所示的“新建文件”对话框中,选择新建“C+Header File”,单击“Choose.”按钮,在弹出的对话框中填写文件的“名称”为“area”。简单的简单的Qt单元测试单元测试头文件“area.h”的具体代码如下:#include class Area:public QObject Q_OBJECTpublic:Area()Area()Area(const Area&area)m_r=area.m_r;Area(int r)m_r=r;double CountArea()return 3.14*m_r*m_r;private:double m_r;简单的简
5、单的Qt单元测试单元测试(3)测试代码所在的源文件“tst_testarea.cpp”的具体内容如下:#include#include#include area.hclass TestArea:public QObject Q_OBJECTpublic:TestArea();private Q_SLOTS:void toAreaTest();/(a);TestArea:TestArea()void TestArea:toAreaTest()Area area(1);QVERIFY(qAbs(area.CountArea()-3.14)0.0000001);/(b)QVERIFY2(true,F
6、ailure);QTEST_APPLESS_MAIN(TestArea)/(c)#include tst_testarea.moc“简单的简单的Qt单元测试单元测试其中,其中,(a)toAreaTest()函数是测试函数,初始化对象的半径为1。(b)QVERIFY(qAbs(area.CountArea()-3.14)0.0000001):使用QVERIFY()宏判断半径为1的面积是否为3.14。由于浮点数不能直接比较,所以取值为给定值和实际值的绝对值,只要这两者之差小于0.0000001,就认为结果是正确的。QVERIFY()宏用于检查表达式是否为真,如果表达式为真,则程序继续运行;否则测试
7、失败,程序运行终止。如果需要在测试失败的时候输出信息,则使用QVERIFY2()宏,用法如下:QVERIFY2(condition,message);QVERIFY2()宏在“condition”条件验证失败时,输出信息“message”。(c)QTEST_APPLESS_MAIN(TestArea):QTEST_APPLESS_MAIN()宏实现main()函数,并初始化QApplication对象和测试类,按照测试函数的运行顺序执行所有的测试。简单Qt单元测试输出结果如图16.5所示。第第16章章 Qt 5单元测试框架单元测试框架数据驱动测试数据驱动测试数据驱动测试数据驱动测试【例】【例】
8、(简单)(CH1602)测试字符串转换为全小写字符的功能。(1)建立单元测试框架(操作方法同前),具体设置如下。项目名称:TestQString。测试类名:TestQString。测试槽:testToLower。生成源文件:tst_testqstring.cpp。(2)源文件“tst_testqstring.cpp”的具体代码。其中,其中,(a)void testToLower():每个private slot都是一个被QTest:qExec()自动调用的测试函数。(b)void testToLower_data():用于提供测试数据。初始化数据的函数名和测试函数名一样,但增加了后缀“_dat
9、a()”。(c)QCOMPARE(string.toLower(),result):QCOMPARE(actual,expected)宏使用“等号”操作符比较实际值(actual)和期望值(expected)。如果两个值相等,则程序继续执行;如果两个值不相等,则产生一个错误,且程序不再继续执行。数据驱动测试数据驱动测试(3)测试结果如图16.6所示。数据驱动测试数据驱动测试【例】【例】(简单)(CH1603)测试计算圆面积的功能。(1)建立单元测试框架(操作方法同前),具体设置如下。项目名称:AreaTest2。测试类名:TestArea。测试槽:toArea。生成源文件:tst_testar
10、ea.cpp。(2)新建C+头文件“area.h”,其具体代码。其中,其中,(a)Q_DECLARE_METATYPE(Area):该宏将Area定义为元类型,这样所有基于模板的函数都可以使用Area。而QTest中用到了模板函数addColumn(),因此必须使用Q_DECLARE_ METATYPE()宏使模板函数可以识别Area类。数据驱动测试数据驱动测试(3)在源文件“tst_testarea.cpp”中完成测试工作,其具体实现代码。其中,其中,(a)QFETCH(Area,area):通过QFETCH()宏获取所有数据。(b)QVERIFY(qAbs(area.CountArea()
11、-r)0.0000001):QVERIFY()宏将根据数据的多少决定函数运行多少次。(c)QTest:addColumn(area):此处建立了两列数据,area列为Area对象。(d)QTest:addColumn(r):r列是相应的Area对象中计算圆面积半径的期望值。(e)QTest:newRow(1)Area(1)3.14:测试数据通过QTest:newRow()函数加入。(4)测试结果如图16.7所示。第第16章章 Qt 5单元测试框架单元测试框架简单性能测试简单性能测试简单性能测试简单性能测试【例】【例】(简单)(CH1604)编写性能测试代码。(1)建立单元测试框架(操作方法同前),具体设置如下。项目名称:TestQString2。测试类名:TestQString2。测试槽:testBenchmark。生成源文件:tst_testqstring2.cpp。(2)源文件“tst_testqstring2.cpp”的具体代码。(3)测试结果如图16.8所示。