之前c++代碼用過cppunit,然後開始用gtest,對于qt代碼,第一次嘗試使用qttest架構。
要使用qttest,首先需要在.pro檔案中增加配置,讓qmake知道要添加qt測試架構:
[cce]
config += qtestlib
[/cce]
然後,就可以建立一個cpp檔案,編寫測試代碼了:
[cce lang=”cpp”]
#include <qttest/qttest>
#include "../src/twitterapi.h"
class twitterapitest : public qobject
{
q_object
private slots:
void testrequesttoken();
};
void twitterapitest::testrequesttoken()
setting s;
s.twitterurl = "https://api.twitter.com/1";
twitterapi api(&s);
qsignalspy spy(&api, signal(authurlcreated(bool,qstring,token*)));
bool result = api.authurl();
qverify(result);
qtest::qwait(10000);
qverify(spy.isvalid());
qcompare(spy.count(), 1);
qlist<qvariant> arguments = spy.takefirst();
qverify(arguments.at(0).tobool() == true);
qdebug() << arguments.at(1);
}
qtest_main(twitterapitest)
#include "twitterapitest.moc"
qttest相關的函數和宏都在qttest/qttest中,直接都include進來即可,我主要用到了裡面的qsignalspy類。
測試類和普通qt類一樣,需要繼承qobject,所有的測試函數,都聲明為私有槽函數(private slots)。這裡的測試函數,主要使用了qsignalspy類,可以用這個類來檢測對應的信号是否已經發出,還可以擷取信号的參數。qttest還提供了一些斷言宏,具體可以檢視assistant中qtest的文檔。
每個測試類都需要使用qtest_main宏生成一個最終的main函數,make之後會生成一個對應的可執行檔案。最後,如果測試類聲明和實作在一個cpp檔案中,需要手工include生成的moc檔案。
感覺qttest沒有像cmake中的test那樣好的和makefile進行結合,沒有增加執行測試的階段。需要手工運作生成的可執行程式:
jinlingjie@babydragon ~/work/aflatoxin-build-desktop-qt_in_path___ $ ./aflatoxin
********* start testing of twitterapitest *********
config: using qtest library 4.8.1, qt 4.8.1
pass : twitterapitest::inittestcase()
qwarn : twitterapitest::testrequesttoken() don’t know how to handle ‘token*’, use qregistermetatype to register it.
qdebug : twitterapitest::testrequesttoken() oauth head: “oauth oauth_callback=”——-“,oauth_consumer_key=”———–“,oauth_nonce=”———–“,oauth_signature=”———–“,oauth_signature_method=”hmac-sha1″,oauth_timestamp=”1333445034″,oauth_version=”1.0″”
qwarn : twitterapitest::testrequesttoken() content-type missing in http post, defaulting to application/octet-stream
qdebug : twitterapitest::testrequesttoken() request token reply: “oauth_token=———&oauth_token_secret=———–&oauth_callback_confirmed=true”
qdebug : twitterapitest::testrequesttoken() qvariant(qstring, “https://api.twitter.com/oauth/authorize?oauth_token=————-“)
pass : twitterapitest::testrequesttoken()
pass : twitterapitest::cleanuptestcase()
totals: 3 passed, 0 failed, 0 skipped
********* finished testing of twitterapitest *********
轉載自:https://coolex.info/blog/306.html