Qt單元測試框架,使用於基於Qt的應用程序和庫,先從一個簡單的demo工程說起吧。
我們可以通過QtCreator來創建一個簡單的Qt單元測試工程,夏天到了,這個demo工程的名字就叫Summer好了,創建過程中其它選項默認,完成后生成兩個文件:Summer.pro和tst_summertest.cpp,先來看一下這兩個文件。
Summer.pro——
- QT += testlib
- QT -= gui
- TARGET = tst_summertest
- CONFIG += console
- CONFIG -= app_bundle
- TEMPLATE = app
- SOURCES += tst_summertest.cpp
- DEFINES += SRCDIR=\\\"$$PWD/\\\"
Summer.pro文件中的QT+=testlib是必須的。
tst_summertest.cpp——
- #include <QString>
- #include <QtTest>
- class SummerTest : public QObject
- {
- Q_OBJECT
- public:
- SummerTest();
- private Q_SLOTS:
- void testCase1();
- };
- SummerTest::SummerTest()
- {
- }
- void SummerTest::testCase1()
- {
- QVERIFY2(true, "Failure");
- }
- QTEST_APPLESS_MAIN(SummerTest)
- #include "tst_summertest.moc"
然后來編譯運行(使用QtCreator)一下,結果如下:
- ********* Start testing of SummerTest *********
- Config: Using QtTest library 5.3.1, Qt 5.3.1
- PASS : SummerTest::initTestCase()
- PASS : SummerTest::testCase1()
- PASS : SummerTest::cleanupTestCase()
- Totals: 3 passed, 0 failed, 0 skipped
- ********* Finished testing of SummerTest *********
在Summer工程中,C++代碼里include了<QtTest>頭文件,文件結尾處include了對應的.moc文件,測試類SummerTest要繼承自QObject類或QObject的子類,需使用Q_OBJECT宏,測試方法testCase1()應標識為私有槽。
QTEST_APPLESS_MAIN(SummerTest)宏實際上是一個main()函數,其定義如下:
- #define QTEST_APPLESS_MAIN(TestObject) \
- int main(int argc, char *argv[]) \
- { \
- TestObject tc; \
- return QTest::qExec(&tc, argc, argv); \
- }
看到了吧,非常簡單,先是實例化一個SummerTest對象,然后調用QTest::qExec(),執行私有槽標識的所有測試方法,這里是testCase1(),QTest是個namespace,留心上面的SummerTest工程運行結果的話,會發現多了兩個東東,initTestCase()和cleanupTestCase(),它們是測試框架自帶的,即使不顯式定義也會被調用,有點像C++的默認構造函數,前者在第一個測試方法執行前被調用,后者在最后一個測試方法執行后被調用,測試框架還提供了init()和cleanup(),它們分別在每一個測試方法執行的前后被調用,不顯式定義時是不會執行的。除了QTEST_APPLESS_MAIN()外,測試框架還提供了兩個類似的宏,QTEST_MAIN()和QTEST_GUILESS_MAIN(),用法相同。
Summer工程的編譯運行也可以通過命令行來完成,有時候效果更好。
1、$qmake Summer.pro
使用qmake命令編譯Summer.pro,生成MakeFile文件。
2、$make
使用make命令編譯MakeFile,生成tst_summertest可執行文件,為什么可執行文件是tst_summertest而不是別的什么呢,這是因為在Summer.pro文件中指定了TARGET=tst_summertest,當然也可以設置成其它值。
3、$./tst_summertest
執行st_summertest,log輸出到了終端,那么log可以輸出到指定文件嗎,答案是可以的,命令格式如下:
$./tst_summertest -o output_path
這時,log輸出到了output_path指定的文件中,終端上不再顯示log。
http://blog.csdn.net/ieearth/article/details/44964437