Qt单元测试框架

来源:互联网 发布:分布式的文档数据库是 编辑:程序博客网 时间:2024/06/10 20:24
原文出自:http://blog.csdn.net/zhu_xz/article/details/5076157

QTestLib 框架提供了一个简单易用的单元测试框架,需要在工程文件中添加Qt+=testlib。先看一个简单的例子

[cpp] view plaincopy
  1. #include <QtTest/QtTest>  
  2. class TestQString: public QObject  
  3. {  
  4.   Q_OBJECT  
  5. private slots:  
  6.   // 每个private slot函数都是会被自动调用的测试函数  
  7.   void testToLower();  
  8.   // 以“_data”结尾的函数向对应的测试函数提供测试数据  
  9.   void testToLower_data();  
  10. };  
  11. void TestQString::testToLower()  
  12. {  
  13.   // 获取测试数据  
  14.   QFETCH(QString, string);  
  15.   QFETCH(QString, result);  
  16.   // 如果输入的两个参数不同,则会被认为测试失败  
  17.   QCOMPARE(string.toLower(), result);  
  18. }  
  19. void TestQString::testToLower_data()  
  20. {  
  21.   // 添加数据列  
  22.   QTest::addColumn<QString>("string");  
  23.   QTest::addColumn<QString>("result");  
  24.   // 添加测试数据  
  25.   QTest::newRow("lower") << "hello" << "hello";  
  26.   QTest::newRow("mixed") << "HeLlO" << "hello";  
  27.   QTest::newRow("upper") << "HELLO" << "hello";  
  28. }  
  29. // 用于构建可执行的测试程序  
  30. QTEST_MAIN(TestQString)  
  31. #include "testqstring.moc"  

 

此外,Qt还提供了以下四个会被自动调用的private slot:
initTestCase():在测试开始前被调用
cleanupTestCase():在测试结束后被调用
init():每个测试函数执行前被调用
cleanup():每个测试函数执行后被调用

测试完成后输出的结果如下所示:

[javascript] view plaincopy
  1. ********* Start testing of TestQString *********  
  2. Config: Using QTest library 4.5.3, Qt 4.5.3  
  3. PASS   : TestQString::initTestCase()  
  4. PASS   : TestQString::testToLower()  
  5. PASS   : TestQString::cleanupTestCase()  
  6. Totals: 3 passed, 0 failed, 0 skipped  
  7. ********* Finished testing of TestQString *********  

 

为了测试GUI组件 ,可以使用诸如QTest::keyClick()函数,通过内部事件传递,来模拟本地窗口系统的事件。例如:

[cpp] view plaincopy
  1. // 代码取自 http://qt.nokia.com/doc/qtestlib-tutorial4-testgui-cpp.html  
  2. #include <QtGui>  
  3. #include <QtTest/QtTest>  
  4. class TestGui: public QObject  
  5. {  
  6.   Q_OBJECT  
  7. private slots:  
  8.   void testGui_data();  
  9.   void testGui();  
  10. };  
  11. void TestGui::testGui_data()  
  12. {  
  13.   QTest::addColumn<QTestEventList>("events");  
  14.   QTest::addColumn<QString>("expected");  
  15.   // 添加按键事件  
  16.   QTestEventList list1;  
  17.   list1.addKeyClick('a');  
  18.   QTest::newRow("char") << list1 << "a";  
  19.   QTestEventList list2;  
  20.   list2.addKeyClick('a');  
  21.   list2.addKeyClick(Qt::Key_Backspace);  
  22.   QTest::newRow("there and back again") << list2 << "";  
  23. }  
  24. void TestGui::testGui()  
  25. {  
  26.   QFETCH(QTestEventList, events);  
  27.   QFETCH(QString, expected);  
  28.   QLineEdit lineEdit;  
  29.   // 模拟按键事件,并比较结果  
  30.   events.simulate(&lineEdit);  
  31.   QCOMPARE(lineEdit.text(), expected);  
  32. }  
  33. QTEST_MAIN(TestGui)  
  34. #include "testgui.moc"  

 

最后看看如何测试benchmark :

[cpp] view plaincopy
  1. void TestQString::testBenchmark()  
  2. {  
  3.   QString str("HeLlO");  
  4.   // 以下代码被测试benchmark  
  5.   QBENCHMARK  
  6.   {  
  7.     str.toLower();  
  8.   }  
  9. }  

 

得到如下输出:

[javascript] view plaincopy
  1. RESULT : TestQString::testBenchmark():  
  2. 0.00062 msec per iteration (total: 41, iterations: 65536)  

 

该输出表示测试共进行了65536次,共耗时41毫秒,每次测试的平均时间为0.00062毫秒。

原创粉丝点击