qt 单元测试不知道是什么东西,先纪录下来,等以后再研究。
QTestLib 框架提供了一个简单易用的单元测试框架,需要在工程文件中添加Qt+=testlib。先看一个简单的例子 :
- #include <QtTest/QtTest>
- class TestQString: public QObject
- {
- Q_OBJECT
- private slots:
- // 每个private slot函数都是会被自动调用的测试函数
- void testToLower();
- // 以“_data”结尾的函数向对应的测试函数提供测试数据
- void testToLower_data();
- };
- void TestQString::testToLower()
- {
- // 获取测试数据
- QFETCH(QString, string);
- QFETCH(QString, result);
- // 如果输入的两个参数不同,则会被认为测试失败
- QCOMPARE(string.toLower(), result);
- }
- void TestQString::testToLower_data()
- {
- // 添加数据列
- QTest::addColumn<QString>("string");
- QTest::addColumn<QString>("result");
- // 添加测试数据
- QTest::newRow("lower") << "hello" << "hello";
- QTest::newRow("mixed") << "HeLlO" << "hello";
- QTest::newRow("upper") << "HELLO" << "hello";
- }
- // 用于构建可执行的测试程序
- QTEST_MAIN(TestQString)
- #include "testqstring.moc"
此外,Qt还提供了以下四个会被自动调用的private slot:
initTestCase():在测试开始前被调用
cleanupTestCase():在测试结束后被调用
init():每个测试函数执行前被调用
cleanup():每个测试函数执行后被调用
测试完成后输出的结果如下所示:
- ********* Start testing of TestQString *********
- Config: Using QTest library 4.5.3, Qt 4.5.3
- PASS : TestQString::initTestCase()
- PASS : TestQString::testToLower()
- PASS : TestQString::cleanupTestCase()
- Totals: 3 passed, 0 failed, 0 skipped
- ********* Finished testing of TestQString *********
为了测试GUI组件 ,可以使用诸如QTest::keyClick()函数,通过内部事件传递,来模拟本地窗口系统的事件。例如:
- // 代码取自 http://qt.nokia.com/doc/qtestlib-tutorial4-testgui-cpp.html
- #include <QtGui>
- #include <QtTest/QtTest>
- class TestGui: public QObject
- {
- Q_OBJECT
- private slots:
- void testGui_data();
- void testGui();
- };
- void TestGui::testGui_data()
- {
- QTest::addColumn<QTestEventList>("events");
- QTest::addColumn<QString>("expected");
- // 添加按键事件
- QTestEventList list1;
- list1.addKeyClick('a');
- QTest::newRow("char") << list1 << "a";
- QTestEventList list2;
- list2.addKeyClick('a');
- list2.addKeyClick(Qt::Key_Backspace);
- QTest::newRow("there and back again") << list2 << "";
- }
- void TestGui::testGui()
- {
- QFETCH(QTestEventList, events);
- QFETCH(QString, expected);
- QLineEdit lineEdit;
- // 模拟按键事件,并比较结果
- events.simulate(&lineEdit);
- QCOMPARE(lineEdit.text(), expected);
- }
- QTEST_MAIN(TestGui)
- #include "testgui.moc"
最后看看如何测试benchmark :
- void TestQString::testBenchmark()
- {
- QString str("HeLlO");
- // 以下代码被测试benchmark
- QBENCHMARK
- {
- str.toLower();
- }
- }
得到如下输出:
- RESULT : TestQString::testBenchmark():
- 0.00062 msec per iteration (total: 41, iterations: 65536)
该输出表示测试共进行了65536次,共耗时41毫秒,每次测试的平均时间为0.00062毫秒。