1. 程式人生 > >【Qt】QTest:編譯Qt單元測試程式

【Qt】QTest:編譯Qt單元測試程式

一、使用方法
1、測試程式原始碼

TestQString.pro

QT       += testlib
QT       -= gui
TARGET = tst_TestQStringTest
CONFIG   += console
CONFIG   -= app_bundle
TEMPLATE = app
SOURCES += tst_TestQStringTest.cpp
DEFINES += SRCDIR=\\\"$$PWD/\\\"

tst_TestQStringTest.cpp

#include <QString>
#include <QtTest>
class TestQStringTest : public QObject { Q_OBJECT public: TestQStringTest(); private Q_SLOTS: void toUpper_data(); void toUpper(); }; TestQStringTest::TestQStringTest() { } void TestQStringTest::toUpper_data() { QTest::addColumn<QString>("string"); QTest::addColumn<QString>("result"
); QTest::newRow("all lower") << "hello" << "HELLO"; QTest::newRow("mixed")<<"Hello"<<"HELLO"; QTest::newRow("all upper")<<"HELLO"<<"HELLO"; } void TestQStringTest::toUpper() { QFETCH(QString, string); QFETCH(QString, result); QCOMPARE(string.toUpper(), result)
; } QTEST_APPLESS_MAIN(TestQStringTest) #include "tst_TestQStringTest.moc"
2、預設輸出結果
********* Start testing of TestQStringTest *********
Config: Using QtTest library 5.6.3, Qt 5.6.3 (x86_64-little_endian-lp64 shared (dynamic) release build; by GCC 4.9.1 20140922 (Red Hat 4.9.1-10))
PASS   : TestQStringTest::initTestCase()
PASS   : TestQStringTest::toUpper(all lower)
PASS   : TestQStringTest::toUpper(mixed)
PASS   : TestQStringTest::toUpper(all upper)
PASS   : TestQStringTest::cleanupTestCase()
Totals: 5 passed, 0 failed, 0 skipped, 0 blacklisted
********* Finished testing of TestQStringTest *********
3、命令列引數詳解

$ ./tst_TestQStringTest -help
使用方法:./tst_TestQStringTest [選項] [被測函式[:測試的資料]]…
tst_TestQStringTest :是編譯的單元測試程式名;
預設情況下,不指定函式名,將執行所有的測試函式。

-o 檔名,格式 : 將輸出結果儲存到指定格式的檔案中,可以指定多個輸出日誌,不指定將輸出到標準輸出。
有效格式如下:
txt : 純文字
csv : CSV 格式(適用於基準測試)
xunitxml : XUnit格式
xml : XML 文件格式
lightxml : XML標記流

-silent : 安靜模式,只記錄失敗和錯誤;

$ ./tst_TestQStringTest -silent
Testing TestQStringTest
Totals: 5 passed, 0 failed, 0 skipped, 0 blacklisted

預設列印資訊如下

$ ./tst_TestQStringTest
********* Start testing of TestQStringTest *********
Config: Using QtTest library 5.6.3, Qt 5.6.3 (x86_64-little_endian-lp64 shared (dynamic) release build; by GCC 4.9.1 20140922 (Red Hat 4.9.1-10))
PASS   : TestQStringTest::initTestCase()
PASS   : TestQStringTest::toUpper(all lower)
PASS   : TestQStringTest::toUpper(mixed)
PASS   : TestQStringTest::toUpper(all upper)
PASS   : TestQStringTest::cleanupTestCase()
Totals: 5 passed, 0 failed, 0 skipped, 0 blacklisted
********* Finished testing of TestQStringTest *********

-v1 : 列印每個函式,資訊如:INFO : TestQStringTest::initTestCase() entering

$ ./tst_TestQStringTest -v1
********* Start testing of TestQStringTest *********
Config: Using QtTest library 5.6.3, Qt 5.6.3 (x86_64-little_endian-lp64 shared (dynamic) release build; by GCC 4.9.1 20140922 (Red Hat 4.9.1-10))
INFO   : TestQStringTest::initTestCase() entering
PASS   : TestQStringTest::initTestCase()
INFO   : TestQStringTest::toUpper() entering
PASS   : TestQStringTest::toUpper(all lower)
PASS   : TestQStringTest::toUpper(mixed)
PASS   : TestQStringTest::toUpper(all upper)
INFO   : TestQStringTest::cleanupTestCase() entering
PASS   : TestQStringTest::cleanupTestCase()
Totals: 5 passed, 0 failed, 0 skipped, 0 blacklisted
********* Finished testing of TestQStringTest *********

-v2 : 除了列印v1的資訊,還會列印QVERIFY/QCOMPARE/QTEST函式資訊

$ ./tst_TestQStringTest -v2
********* Start testing of TestQStringTest *********
Config: Using QtTest library 5.6.3, Qt 5.6.3 (x86_64-little_endian-lp64 shared (dynamic) release build; by GCC 4.9.1 20140922 (Red Hat 4.9.1-10))
INFO   : TestQStringTest::initTestCase() entering
PASS   : TestQStringTest::initTestCase()
INFO   : TestQStringTest::toUpper() entering
INFO   : TestQStringTest::toUpper(all lower) QCOMPARE(string.toUpper(), result)
  Loc: [../TestQString/tst_TestQStringTest.cpp(35)]
PASS   : TestQStringTest::toUpper(all lower)
INFO   : TestQStringTest::toUpper(mixed) QCOMPARE(string.toUpper(), result)
  Loc: [../TestQString/tst_TestQStringTest.cpp(35)]
PASS   : TestQStringTest::toUpper(mixed)
INFO   : TestQStringTest::toUpper(all upper) QCOMPARE(string.toUpper(), result)
  Loc: [../TestQString/tst_TestQStringTest.cpp(35)]
PASS   : TestQStringTest::toUpper(all upper)
INFO   : TestQStringTest::cleanupTestCase() entering
PASS   : TestQStringTest::cleanupTestCase()
Totals: 5 passed, 0 failed, 0 skipped, 0 blacklisted
********* Finished testing of TestQStringTest *********

-vs : 列印訊號和槽資訊

$ ./tst_TestQStringTest -vs
********* Start testing of TestQStringTest *********
Config: Using QtTest library 5.6.3, Qt 5.6.3 (x86_64-little_endian-lp64 shared (dynamic) release build; by GCC 4.9.1 20140922 (Red Hat 4.9.1-10))
INFO   : TestQStringTest::initTestCase() Signal: QThread(7f3c80) started ()
PASS   : TestQStringTest::initTestCase()
PASS   : TestQStringTest::toUpper(all lower)
PASS   : TestQStringTest::toUpper(mixed)
PASS   : TestQStringTest::toUpper(all upper)
PASS   : TestQStringTest::cleanupTestCase()
Totals: 5 passed, 0 failed, 0 skipped, 0 blacklisted
********* Finished testing of TestQStringTest *********

-functions : 列印測試程式中的測試函式列表

$ ./tst_TestQStringTest -functions
toUpper()

-datatags : 列印測試程式中測試資料列表

$ ./tst_TestQStringTest -datatags
TestQStringTest toUpper all lower
TestQStringTest toUpper mixed
TestQStringTest toUpper all upper

-eventdelay ms : 設定模擬滑鼠和鍵盤的預設延時時間,單位毫秒
-keydelay ms : 設定模擬鍵盤的預設延時時間,單位毫秒
-mousedelay ms : 設定模擬滑鼠的預設延時時間,單位毫秒
-maxwarnings n : 設定最大輸出行數,預設2000,0表示不限制
-nocrashhandler : 禁用崩潰處理程式,用於除錯崩潰

基準測試相關選項:
-callgrind : 使用callgrind來計時基準測試
-perf : 使用事件來計時基準測試
-perfcounter name : 使用名為“name”的計數器
-perfcounterlist : 列出可用的計數器
-tickcounter : 使用CPU計數器計時基準測試
-eventcounter : 統計在基準測試期間收到的事件
-minimumvalue n :設定可接受的最小測量值
-minimumtotal n : 設定測試函式重複執行的最小可接受總數
-iterations n : 設定累計迭代次數.
-median n : 設定中值迭代的次數.
-vb : 列印詳細的基準測試資訊.
-help : help資訊

二、基準測試

1、什麼是基準測試

度娘:https://baike.baidu.com/item/基準測試/5876292?fr=aladdin
基準測試是 指通過設計科學的測試方法、測試工具和測試系統,實現對一類測試物件的某項效能指標進行定量的和可對比的測試。例如,對計算機CPU進行浮點運算、資料訪問的頻寬和延遲等指標的基準測試,可以使使用者清楚地瞭解每一款CPU的運算效能及作業吞吐能力是否滿足應用程式的要求;
再如對資料庫管理系統的ACID(Atomicity, Consistency, Isolation, Durability, 原子性、一致性、獨立性和永續性)、查詢時間和聯機事務處理能力等方面的效能指標進行基準測試,也有助於使用者挑選最符合自己需求的資料庫系統。
從以上兩個例子我們可以看出,可測量、可重複、可對比是基準測試的三大原則,其中可測量是指測試的輸入和輸出之間是可達的,也就是測試過程是可以實現的,並且測試的結果可以量化表現;可重複是指按照測試過程實現的結果是相同的或處於可接受的置信區間之內,而不受測試的時間、地點和執行者的影響;可對比是指一類測試物件的測試結果具有線性關係,測試結果的大小直接決定效能的高低。
對於可再現性,基準測試是最好的方法。
在開發階段前期,應該使用基準測試來確定應用程式中是否出現效能倒退。基準測試可以在一個相對短的時間內收集可重複的結果。進行基準測試的最好方法是,每次測試改變一個且只改變一個引數。例如,如果想知道增加JVM記憶體是否會影響應用程式的效能,就逐次遞增JVM記憶體(例如,從1024 MB增至1224 MB,然後是1524 MB,最後是2024 MB),在每個階段收集結果和環境資料,記錄資訊,然後轉到下一階段。這樣在分析測試結果時就有跡可循。
基準測試的關鍵是要獲得一致的、可再現的結果。可再現的結果有兩個好處:減少重新執行測試的次數;對測試的產品和產生的數字更為確信。使用的效能測試工具可能會對測試結果產生很大影響。假定測試的兩個指標是伺服器的響應時間和吞吐量,它們會受到伺服器上的負載的影響。伺服器上的負載受兩個因素影響:同時與伺服器通訊的連線(或虛擬使用者)的數目,以及每個虛擬使用者請求之間的考慮時間的長短。很明顯,與伺服器通訊的使用者越多,負載就越大。同樣,請求之間的考慮時間越短,負載也越大。這兩個因素的不同組合會產生不同的伺服器負載等級。記住,隨著伺服器上負載的增加,吞吐量會不斷攀升,直到到達一個點。
當軟體系統中增加了1個新模組,此時需要做基準測試,以判斷新的模組對整個軟體系統的效能影響。
基準測試程式(Benchmark)用來測量機器的硬體最高實際執行效能,以及軟體優化的效能提升效果,可分為微基準測試程式(Microbenchmark)和巨集基準測試程式(Macrobenchmark)。微基準測試程式用來測量一個計算機系統的某一特定方面,如CPU定點/浮點效能、儲存器速度、I/O速度、網路速度或系統軟體效能(如同步效能);巨集基準測試程式用來測量一個計算機系統的總體效能或優化方法的通用性,可選取不同應用,如Web服務程式、資料處理程式以及科學與工程計算程式。
為了達到上述目標,基準測試程式需要滿足如下條件:首先。基準測試程式包含最常見的計算、通訊和訪存模式,能夠為實際的應用程式預測不同高效能運算系統性能排名;其次,能指導高效能運算系統和應用的改進,亦即在基準測試程式上有效的優化方法能移植到實際應用中。

2、例子原始碼

benchmarkTest.pro

QT       += testlib
QT       -= gui
TARGET = tst_BenchmarkTest
CONFIG   += console
CONFIG   -= app_bundle
TEMPLATE = app
SOURCES += tst_BenchmarkTest.cpp
DEFINES += SRCDIR=\\\"$$PWD/\\\"

tst_BenchmarkTest.cpp

#include <QString>
#include <QtTest>
#include <QDebug>

class BenchmarkTest : public QObject
{
	Q_OBJECT

public:
	BenchmarkTest();

private Q_SLOTS:
	void initTestCase();
	void cleanupTestCase();
	void toUpper_data();
	void toUpper();
};

BenchmarkTest::BenchmarkTest()
{
}

void BenchmarkTest::initTestCase()
{
	qDebug() << "=====start test=====";
}

void BenchmarkTest::cleanupTestCase()
{
	qDebug() << "=====stop test=====";
}

void BenchmarkTest::toUpper_data()
{
	QTest::addColumn<QString>("string");
	QTest::addColumn<QString>("result");

	QTest::newRow("all lower") << "hello" << "HELLO";
	QTest::newRow("all upper")<<"HELLO"<<"HELLO";
	QTest::newRow("mixed")<<"Hello"<<"HELLO";
}

void BenchmarkTest::toUpper()
{
	QFETCH(QString, string);
	QFETCH(QString, result);

	QCOMPARE(string.toUpper(), result);

	QBENCHMARK {
		string.toUpper();
	}
}

QTEST_APPLESS_MAIN(BenchmarkTest)

#include "tst_BenchmarkTest.moc"
3、輸出結果
********* Start testing of BenchmarkTest *********
Config: Using QtTest library 5.6.3, Qt 5.6.3 (x86_64-little_endian-lp64 shared (dynamic) release build; by GCC 4.9.1 20140922 (Red Hat 4.9.1-10))
QDEBUG : BenchmarkTest::initTestCase() =====start test=====
PASS   : BenchmarkTest::initTestCase()
PASS   : BenchmarkTest::toUpper(all lower)
RESULT : BenchmarkTest::toUpper():"all lower":
     0.00048 msecs per iteration (total: 63, iterations: 131072)
PASS   : BenchmarkTest::toUpper(all upper)
RESULT : BenchmarkTest::toUpper():"all upper":
     0.00020 msecs per iteration (total: 54, iterations: 262144)
PASS   : BenchmarkTest::toUpper(mixed)
RESULT : BenchmarkTest::toUpper():"mixed":
     0.00020 msecs per iteration (total: 54, iterations: 262144)
QDEBUG : BenchmarkTest::cleanupTestCase() =====stop test=====
PASS   : BenchmarkTest::cleanupTestCase()
Totals: 5 passed, 0 failed, 0 skipped, 0 blacklisted
********* Finished testing of BenchmarkTest *********