QTestLib是Qt提供的一種針對(duì)基于Qt編寫(xiě)的程序或庫(kù)的單元測(cè)試框架。QTestLib提供了單元測(cè)試框架的基本功能,并提供了針對(duì)GUI測(cè)試的擴(kuò)展功能。
為敘州等地區(qū)用戶提供了全套網(wǎng)頁(yè)設(shè)計(jì)制作服務(wù),及敘州網(wǎng)站建設(shè)行業(yè)解決方案。主營(yíng)業(yè)務(wù)為成都網(wǎng)站制作、做網(wǎng)站、外貿(mào)營(yíng)銷(xiāo)網(wǎng)站建設(shè)、敘州網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專(zhuān)業(yè)、用心的態(tài)度為用戶提供真誠(chéng)的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會(huì)得到認(rèn)可,從而選擇與我們長(zhǎng)期合作。這樣,我們也可以走得更遠(yuǎn)!QTestLib是為了簡(jiǎn)化QT程序或庫(kù)的單元測(cè)試工作而設(shè)計(jì)的。
QTestLib特性如下:
A、輕量級(jí):QTestlib只包含6000行代碼和60個(gè)導(dǎo)出符號(hào)
B、自包含:對(duì)于非GUI測(cè)試,QTestlib只需要Qt核心庫(kù)的幾個(gè)符號(hào)。
C、快速測(cè)試:QTestlib不需要特殊的測(cè)試執(zhí)行程序,不需要為測(cè)試而進(jìn)行特殊的注冊(cè)。
D、數(shù)據(jù)驅(qū)動(dòng)測(cè)試:一個(gè)測(cè)試程序可以在不同的測(cè)試數(shù)據(jù)集上執(zhí)行多次。
E、基本的GUI測(cè)試:QTestlib提供了模擬鼠標(biāo)和鍵盤(pán)事件的功能。
F、基準(zhǔn)測(cè)試:QTestLIB支持基準(zhǔn)測(cè)試并提供多種測(cè)量后端。
G、IDE友好:QTestlib的輸出信息可以被Visual?Studio和KDevelop解析。
H、線程安全:錯(cuò)誤報(bào)告是線程安全的、原子性的。
J、類(lèi)型安全:對(duì)模板進(jìn)行了擴(kuò)展使用,防止由隱式類(lèi)型轉(zhuǎn)換引起的錯(cuò)誤。
K、易擴(kuò)展:用戶自定義類(lèi)型可以容易地加入到測(cè)試數(shù)據(jù)和測(cè)試輸出中。
所有公有的方法都在QTest命名空間中。另外,QSignalSpy類(lèi)為Qt的信號(hào)和槽提供了簡(jiǎn)單的內(nèi)省機(jī)制。
默認(rèn)測(cè)試結(jié)果以純文本形式顯示在控制臺(tái)(應(yīng)用程序輸出標(biāo)簽),不夠直觀,可使用AutoTest插件實(shí)現(xiàn)可視化效果。
通過(guò)Help->About Plugins->Utilities,選中AutoTest,重啟Qt Creator,然后在下方會(huì)多出TestResults的標(biāo)簽,可直接在此標(biāo)簽點(diǎn)擊上方的運(yùn)行按鈕運(yùn)行所有測(cè)試,同時(shí)在“Tools-Tests-Run All Tests”也可運(yùn)行所有測(cè)試。
此插件可以在運(yùn)行單元測(cè)試后以紅、綠色表示明確標(biāo)記處運(yùn)行結(jié)果,并且以Case為單位顯示,可以展開(kāi)看到具體每一個(gè)測(cè)試用例的結(jié)果。
原理:輸入測(cè)試數(shù)據(jù)表和結(jié)果數(shù)據(jù)表,與實(shí)際值比較。
測(cè)試類(lèi)需要從QObject類(lèi)繼承,類(lèi)中需要加入一個(gè)或者多個(gè)私有槽。每一個(gè)私有槽都是一個(gè)測(cè)試函數(shù),但有4種私有槽不能作為測(cè)試函數(shù),它們由測(cè)試框架執(zhí)行,可為整個(gè)測(cè)試程序或當(dāng)前測(cè)試函數(shù)進(jìn)行初始化和清除操作。
initTestCase():在第一個(gè)測(cè)試函數(shù)執(zhí)行前調(diào)用。
cleanupTestCase():在最后一個(gè)測(cè)試函數(shù)執(zhí)行后調(diào)用。
init():在每一個(gè)測(cè)試函數(shù)執(zhí)行前調(diào)用。
cleanup():在每一個(gè)測(cè)試函數(shù)執(zhí)行后調(diào)用。
如果initTestCase()函數(shù)執(zhí)行失敗,任何測(cè)試函數(shù)都不會(huì)執(zhí)行。如果init()函數(shù)執(zhí)行失敗,緊隨其后的測(cè)試函數(shù)不會(huì)被執(zhí)行,測(cè)試會(huì)繼續(xù)處理下一個(gè)測(cè)試函數(shù)。
QTest::qExec(QObject* testClassObject)函數(shù)用于執(zhí)行測(cè)試對(duì)象中所有的測(cè)試函數(shù)。
對(duì)于一個(gè)要測(cè)試的目標(biāo)函數(shù),需要使用兩個(gè)函數(shù)進(jìn)行測(cè)試:testFunctionName()和testFunctionName_data()。
testFunctionName_data:數(shù)據(jù)提供,在函數(shù)體中寫(xiě)入測(cè)試數(shù)據(jù)。
testFunctionName:測(cè)試的實(shí)體,讀取testFunctionName_data函數(shù)中的數(shù)據(jù)表,并逐行進(jìn)行測(cè)試。如果測(cè)試結(jié)果與數(shù)據(jù)表中的結(jié)果不同,則認(rèn)為測(cè)試失敗。
數(shù)據(jù)由QTest::addColumn < T > (name)和QTest::newRow(name) << input << result來(lái)構(gòu)建一個(gè)數(shù)據(jù)表,其中的列可以被獲取,然后將表中對(duì)應(yīng)的數(shù)據(jù)按行測(cè)試,并與表中的結(jié)果列進(jìn)行對(duì)比。
對(duì)于GUI交互操作的測(cè)試,則將數(shù)據(jù)設(shè)置為事件列表,供模擬測(cè)試。QTestlib提供了模擬鼠標(biāo)和鍵盤(pán)事件的功能。
QTest提供一系列宏來(lái)進(jìn)行數(shù)據(jù)的通信。
QBENCHMARK
QBENCHMARK_ONCE
QCOMPARE(actual, expected)
QEXPECT_FAIL(dataIndex, comment, mode)
QFAIL(message)
QFETCH(type, name)
QFINDTESTDATA(filename)
QSKIP(description)
QTEST(actual, testElement)
QTEST_APPLESS_MAIN(TestClass)
QTEST_GUILESS_MAIN(TestClass)
QTEST_MAIN(TestClass)
QTRY_COMPARE(actual, expected)
QTRY_COMPARE_WITH_TIMEOUT(actual, expected, timeout)
QTRY_VERIFY2(condition, message)
QTRY_VERIFY(condition)
QTRY_VERIFY2_WITH_TIMEOUT(condition, message, timeout)
QTRY_VERIFY_WITH_TIMEOUT(condition, timeout)
QVERIFY2(condition, message)
QVERIFY(condition)
QVERIFY_EXCEPTION_THROWN(expression, exceptiontype)
QWARN(message)
QTest提供了QTEST_MAIN()作為測(cè)試的啟動(dòng)宏,構(gòu)建一個(gè)main函數(shù),在main函數(shù)內(nèi)調(diào)用QTest::qExec(QObject testClassObject),也可以直接調(diào)用QTest::qExec(QObject testClassObject)來(lái)啟動(dòng)測(cè)試。
假設(shè)要測(cè)試QString類(lèi)的行為。首先,需要一個(gè)用于包含測(cè)試函數(shù)的必須從QObject繼承的類(lèi):
#include
class TestQString: public QObject
{
Q_OBJECT
private slots:
void toUpper();
};
注意:需要包含QTest頭文件,并且測(cè)試函數(shù)必須聲明為私有槽,便于測(cè)試框架找到并執(zhí)行它們。
void TestQString::toUpper()
{
QString str = "Hello";
QVERIFY(str.toUpper() == "HELLO");
}
QVERIFY()宏將計(jì)算傳入的表達(dá)式的值。如果為真,則測(cè)試函數(shù)繼續(xù)進(jìn)行;否則會(huì)向測(cè)試日志中增加一條描述錯(cuò)誤的信息,并且該測(cè)試函數(shù)會(huì)停止執(zhí)行。
但是如果需要向測(cè)試日志中增加更詳細(xì)的輸出信息,應(yīng)該使用QCOMPARE()宏:
void TestQString::toUpper()
{
QString str = "Hello";
QCOMPARE(str.toUpper(), QString("HELLO"));
}
寫(xiě)完測(cè)試程序后就需要執(zhí)行測(cè)試程序。假設(shè)將測(cè)試程序命名為testqstring.cpp并保存在一個(gè)空目錄中,可以使用qmake生成一個(gè)工程文件和一個(gè)Makefile文件。
myTestDirectory$ qmake -project "QT += qtestlib"
myTestDirectory$ qmake
myTestDirectory$ make
執(zhí)行自動(dòng)測(cè)試的語(yǔ)法形式:testname?[options]?[testfunctions[:testdata]]...
testname:測(cè)試項(xiàng)目的可執(zhí)行文件
testfunctions:包含要執(zhí)行的測(cè)試函數(shù)名,如果不指定testfunctions,所有的測(cè)試函數(shù)都會(huì)執(zhí)行。如果測(cè)試函數(shù)名之后加上了測(cè)試數(shù)據(jù)行的名字,則測(cè)試函數(shù)執(zhí)行時(shí)只會(huì)使用該行測(cè)試數(shù)據(jù)。
列如:/myTestDirectory#?StringTest toUpper
使用所有的測(cè)試數(shù)據(jù)執(zhí)行toUpper測(cè)試函數(shù)。/myTestDirectory$?StringTest??toUpper??toInt:zero
使用所有的測(cè)試數(shù)據(jù)執(zhí)行toUpper測(cè)試函數(shù),使用行名為zero的測(cè)試數(shù)據(jù)執(zhí)行toInt測(cè)試函數(shù)(如果對(duì)應(yīng)的測(cè)試數(shù)據(jù)不存在,相關(guān)的測(cè)試執(zhí)行時(shí)就會(huì)失?。?br/>/myTestDirectory$?WidgetTest??-vs??-eventdelay??500
執(zhí)行WidgetTest測(cè)試程序,輸出每一個(gè)信號(hào)發(fā)射信息,在每次模擬鼠標(biāo)/鍵盤(pán)事件之后等待500毫秒。
選項(xiàng)
下列命令行參數(shù)可以被接受:
-help
輸出命令行參數(shù)的幫助信息。
-functions?
輸出測(cè)試中的所有測(cè)試函數(shù)。
-o?filename?
將輸出信息寫(xiě)入到執(zhí)行文件中,而不是打印到標(biāo)準(zhǔn)輸出上。
-silent?
沉默地輸出,只顯示警告、錯(cuò)誤和最少的狀態(tài)信息。
-v1?
詳細(xì)輸出;輸出每次進(jìn)入或離開(kāi)測(cè)試函數(shù)的信息。
-v2?
詳細(xì)輸出;也輸出每個(gè)QCOMPARE()和QVERIFY()信息。
-vs?
輸出發(fā)出的所有信號(hào)。
-xml?
將輸出格式化成XML格式,而不是普通文本
-lightxml?
輸出成XML標(biāo)簽流。
-eventdelay?ms?
如果鍵盤(pán)或鼠標(biāo)模擬(QTest::keyClick(),QTest::mouseClick()等)不指定延遲時(shí)間,則使用該參數(shù)(以毫秒為單位)作為延遲時(shí)間。
-keydelay?ms
與-eventdelay的作用一樣,但只影響鍵盤(pán)模擬的延遲時(shí)間,不影響鼠標(biāo)模擬的延遲時(shí)間。
-mousedelay?ms?
與-eventdelay的作用一樣,但只影響鼠標(biāo)模擬的延遲時(shí)間,不影響鍵盤(pán)模擬的延遲時(shí)間。
-keyevent-verbose?
詳細(xì)輸出鍵盤(pán)模擬信息。
-maxwarnings?numberBR?
設(shè)置警告信息的大數(shù)量,0表示不限制,默認(rèn)值為2000。
目前為止,采用硬編碼的方式將測(cè)試數(shù)據(jù)寫(xiě)到測(cè)試函數(shù)中。如果增加更多的測(cè)試數(shù)據(jù),那么測(cè)試函數(shù)會(huì)變成:
QCOMPARE(QString("hello").toUpper(), QString("HELLO"));
QCOMPARE(QString("Hello").toUpper(), QString("HELLO"));
QCOMPARE(QString("HellO").toUpper(), QString("HELLO"));
QCOMPARE(QString("HELLO").toUpper(), QString("HELLO"));
為了不使測(cè)試函數(shù)被重復(fù)的代碼弄得凌亂不堪, QTestLib支持向測(cè)試函數(shù)增加測(cè)試數(shù)據(jù),僅需要向測(cè)試類(lèi)增加另一個(gè)私有槽:
class TestQString: public QObject
{
Q_OBJECT
private slots:
void toUpper_data();
void toUpper();
};
為測(cè)試函數(shù)提供數(shù)據(jù)的函數(shù)必須與測(cè)試函數(shù)同名,并加上_data后綴。為測(cè)試函數(shù)提供數(shù)據(jù)的函數(shù)類(lèi)似這樣:
void TestQString::toUpper_data()
{
QTest::addColumn("string");
QTest::addColumn("result");
QTest::newRow("all lower") << "hello" << "HELLO";
QTest::newRow("mixed") << "Hello" << "HELLO";
QTest::newRow("all upper") << "HELLO" << "HELLO";
}
首先,使用QTest::addColumn()函數(shù)定義測(cè)試數(shù)據(jù)表的兩列元素:測(cè)試字符串和在該測(cè)試字符串上調(diào)用QString::toUpper()函數(shù)期望得到的結(jié)果。
然后使用 QTest::newRow()函數(shù)向測(cè)試數(shù)據(jù)表中增加一些數(shù)據(jù)。每組數(shù)據(jù)都會(huì)成為測(cè)試數(shù)據(jù)表中的一個(gè)單獨(dú)的行。
QTest::newRow()函數(shù)接收一個(gè)參數(shù):將要關(guān)聯(lián)到該行測(cè)試數(shù)據(jù)的名字。如果測(cè)試函數(shù)執(zhí)行失敗,名字會(huì)被測(cè)試日志使用,以引用導(dǎo)致測(cè)試失敗的數(shù)據(jù)。然后將測(cè)試數(shù)據(jù)加入到新行:首先是一個(gè)任意的字符串,然后是在該行字符串上調(diào)用 QString::toUpper()函數(shù)期望得到的結(jié)果字符串。
可以將測(cè)試數(shù)據(jù)看作是一張二維表格。在這個(gè)例子里,它包含兩列三行,列名為string 和result。另外,每行都會(huì)對(duì)應(yīng)一個(gè)序號(hào)和名稱(chēng):
index name string result
0 all lower "hello" HELLO
1 mixed "Hello" HELLO
2 all upper "HELLO" HELLO
測(cè)試函數(shù)需要被重寫(xiě):
void TestQString::toUpper()
{
QFETCH(QString, string);
QFETCH(QString, result);
QCOMPARE(string.toUpper(), result);
}
TestQString::toUpper()函數(shù)會(huì)執(zhí)行兩次,對(duì)toUpper_data()函數(shù)向測(cè)試數(shù)據(jù)表中加入的每一行都會(huì)調(diào)用一次。
首先,調(diào)用QFETCH()宏從測(cè)試數(shù)據(jù)表中取出兩個(gè)元素。QFETCH()接收兩個(gè)參數(shù): 元素的數(shù)據(jù)類(lèi)型和元素的名稱(chēng)。然后用QCOMPARE()宏執(zhí)行測(cè)試操作。
使用這種方法可以不修改測(cè)試函數(shù)就向該函數(shù)加入新的數(shù)據(jù)。
像以前一樣,為使測(cè)試程序能夠單獨(dú)執(zhí)行,需要加入下列代碼:
QTEST_MAIN(TestGui)
QTEST_MAIN()宏將擴(kuò)展成一個(gè)簡(jiǎn)單的main()函數(shù),該main()函數(shù)會(huì)執(zhí)行所有的測(cè)試函數(shù)。
QTestlib單元測(cè)試提供GUI操作函數(shù),可對(duì)控件發(fā)送消息后檢測(cè)執(zhí)行結(jié)果,比如QTest::keyClick(),QTest::mouseClick()等等
QTestlib具有測(cè)試GUI的一些特性。QTestLib發(fā)送內(nèi)部Qt事件,而不是模擬本地窗口系統(tǒng)事件,因此運(yùn)行測(cè)試程序不會(huì)對(duì)機(jī)器產(chǎn)生任何副作用。
#include
#include
class TestGui: public QObject
{
Q_OBJECT
private slots:
void testGui();
};
唯一的區(qū)別是除了要加入QTest命名空間之外,需要包含QtGui類(lèi)的定義。
void TestGui::testGui()
{
QLineEdit lineEdit;
QTest::keyClicks(&lineEdit, "hello world");
QCOMPARE(lineEdit.text(), QString("hello world"));
}
在測(cè)試函數(shù)實(shí)現(xiàn)中,創(chuàng)建一個(gè)QLineEdit,使用QTest::keyClicks()函數(shù)模擬在行編輯框中輸入“hello world”字符串。
注意: 為了正確測(cè)試快捷鍵,控件必須顯示出來(lái)。
QTest::keyClicks()在控件上模擬一連串的鍵盤(pán)敲擊操作。另外,每次鍵盤(pán)敲擊后,可以指定延遲時(shí)間(以毫秒為單位)。同樣,也可以用 QTest::keyClick()、QTest::keyPress()、QTest::keyRelease()、QTest::mouseClick()、QTest::mouseDClick()、QTest::mouseMove()、QTest::mousePress() 和QTest::mouseRelease()函數(shù)來(lái)模擬相應(yīng)的GUI事件。
最后,使用QCOMPARE()宏來(lái)檢驗(yàn)行編輯框的文本是否與預(yù)期的一致。
像前面一樣,為使測(cè)試程序能夠單獨(dú)執(zhí)行,需要加入下列代碼:QTEST_MAIN(TestGui)
QTEST_MAIN()宏將擴(kuò)展成一個(gè)簡(jiǎn)單的main()函數(shù),該main()函數(shù)會(huì)執(zhí)行所有的測(cè)試函數(shù)。
在本節(jié)中,將展示如何模擬GUI事件,以及如何存儲(chǔ)一系列GUI事件以及如何在組件上重復(fù)這些GUI事件。
將一系列GUI事件保存起來(lái)并重復(fù)觸發(fā)的方法與數(shù)據(jù)驅(qū)動(dòng)測(cè)試程序的方法很類(lèi)似。所要做的只是向測(cè)試類(lèi)增加一個(gè)提供測(cè)試數(shù)據(jù)的函數(shù):
class TestGui: public QObject
{
Q_OBJECT
private slots:
void testGui_data();
void testGui();
};
像前面一樣,為測(cè)試函數(shù)提供數(shù)據(jù)的函數(shù)必須與該測(cè)試函數(shù)同名,并加上_data后綴。
void TestGui::testGui_data()
{
QTest::addColumn("events");
QTest::addColumn("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 << "";
}
首先,用QTest::addColumn()函數(shù)定義測(cè)試數(shù)據(jù)表的元素:一個(gè)GUI事件列表,以及在控件上應(yīng)用該事件列表預(yù)期得到的結(jié)果。注意第一個(gè)元素的類(lèi)型是QTestEventList。
QTestEventList可以保存將來(lái)要使用的GUI事件,并可以在任意控件上重復(fù)觸發(fā)這些事件。
在目前的提供測(cè)試數(shù)據(jù)的函數(shù)中,創(chuàng)建了兩個(gè)QTestEventLists。第一個(gè)鏈表包括了一個(gè)敲擊“a“鍵事件,調(diào)用QTestEventList::addKeyClick()函數(shù)向鏈表中加入該事件。然后用QTest::newRow()函數(shù)給該行數(shù)據(jù)指定一個(gè)名字,并把事件隊(duì)列和期望結(jié)果輸入到測(cè)試數(shù)據(jù)表中。
第二個(gè)鏈表包括兩次鍵盤(pán)敲擊:一個(gè)“a“,然后是一個(gè)“backspace“。同樣用 QTestEventList::addKeyClick()函數(shù)將事件加入隊(duì)列,用QTest::newRow()將事件隊(duì)列和期望的結(jié)果加入測(cè)試數(shù)據(jù)表中,并為該行指定一個(gè)名字。
void TestGui::testGui()
{
QFETCH(QTestEventList, events);
QFETCH(QString, expected);
QLineEdit lineEdit;
events.simulate(&lineEdit);
QCOMPARE(lineEdit.text(), expected);
}
TestGui::testGui()函數(shù)會(huì)執(zhí)行兩次,對(duì)在TestGui::testGui_data()函數(shù)中創(chuàng)建的每一行測(cè)試數(shù)據(jù)都執(zhí)行一次。
首先,用QFETCH()宏從測(cè)試數(shù)據(jù)集中取出兩個(gè)元素。QFETCH()宏接收兩個(gè)參數(shù):元素的數(shù)據(jù)類(lèi)型和元素的名字。然后創(chuàng)建了一個(gè)QLineEdit,調(diào)用 QTestEventList::simulate()函數(shù)在控件上觸發(fā)事件隊(duì)列。
最后,用QCOMPARE()宏檢測(cè)行編輯框的內(nèi)容是否與期望的一致。
像以前一樣,為使測(cè)試程序能夠單獨(dú)執(zhí)行,需要加入下列代碼:QTEST_MAIN(TestGui)
QTEST_MAIN()宏將擴(kuò)展成一個(gè)簡(jiǎn)單的main()函數(shù),該main()函數(shù)會(huì)執(zhí)行所有的測(cè)試函數(shù)。
為了編寫(xiě)一個(gè)基準(zhǔn)測(cè)試程序,需要使用QBENCHMARK宏來(lái)擴(kuò)展測(cè)試函數(shù)。一個(gè)基準(zhǔn)測(cè)試函數(shù)通常由初始化代碼和一個(gè)QBENCHMARK宏組成,QBENCHMARK宏包含了需要被測(cè)試的代碼。
測(cè)試函數(shù)會(huì)對(duì)QString::localeAwareCompare()函數(shù)進(jìn)行基準(zhǔn)測(cè)試。
void TestBenchmark::simple()
{
QString str1 = QLatin1String("This is a test string");
QString str2 = QLatin1String("This is a test string");
QCOMPARE(str1.localeAwareCompare(str2), 0);
QBENCHMARK {
str1.localeAwareCompare(str2);
}
}
初始化部分將在函數(shù)的開(kāi)頭被完成,但時(shí)鐘并不在這點(diǎn)運(yùn)行。內(nèi)嵌在QBENCHMARK宏中的代碼將被估量,并且為了得出精確的測(cè)量將會(huì)被重復(fù)數(shù)次。
當(dāng)創(chuàng)建對(duì)多個(gè)數(shù)據(jù)輸入進(jìn)行比較的基準(zhǔn)測(cè)試時(shí),數(shù)據(jù)函數(shù)是有用的。
void TestBenchmark::multiple_data()
{
QTest::addColumn("useLocaleCompare");
QTest::newRow("locale aware compare") << true;
QTest::newRow("standard compare") << false;
}
測(cè)試函數(shù)使用輸入數(shù)據(jù)決定什么被基準(zhǔn)測(cè)試。
void TestBenchmark::multiple()
{
QFETCH(bool, useLocaleCompare);
QString str1 = QLatin1String("This is a test string");
QString str2 = QLatin1String("This is a test string");
int result;
if (useLocaleCompare)
{
QBENCHMARK {
result = str1.localeAwareCompare(str2);
}
}
else
{
QBENCHMARK {
result = (str1 == str2);
}
}
}
“if(useLocaleCompare)”開(kāi)關(guān)放在QBENCHMARK宏外部避免測(cè)量開(kāi)銷(xiāo)。每個(gè)基準(zhǔn)測(cè)試函數(shù)可以有一個(gè)在用的QBENCHMARK宏。
A、單元測(cè)試類(lèi)中建議不要出現(xiàn)私有成員,尤其是指針,同時(shí)不建議在測(cè)試函數(shù)中建立被測(cè)類(lèi)的指針,而是直接建立被測(cè)類(lèi)的對(duì)象,在測(cè)試結(jié)束后容易遺忘指針。若需要指針,在initTestCase函數(shù)中new,在cleanupTestCase函數(shù)中delete。
B、若某個(gè)測(cè)試函數(shù)中出現(xiàn)了new,一定記著delete,且務(wù)必讓delete在第一個(gè)斷言前出現(xiàn),因?yàn)閿嘌允『瘮?shù)就回立刻結(jié)束,并把當(dāng)前函數(shù)標(biāo)記為測(cè)試失敗。若delete在第一個(gè)斷言之后,而第一個(gè)斷言失敗則不會(huì)執(zhí)行之后的delete。
C、若測(cè)試類(lèi)必須有私有成員,必須注意一個(gè)測(cè)試類(lèi)中的所有函數(shù)公用私有成員,不會(huì)在每個(gè)測(cè)試之前刷新?tīng)顟B(tài)。
D、若被測(cè)類(lèi)為單例,欲對(duì)其內(nèi)所有函數(shù)做單元測(cè)試,會(huì)出現(xiàn)測(cè)試第一個(gè)函數(shù)可以保證測(cè)試環(huán)境為初始狀態(tài),后續(xù)測(cè)試會(huì)因?yàn)閱卫脑?,?dǎo)致測(cè)試時(shí)建立在之前操作后的環(huán)境下。欲解決此問(wèn)題,需要?jiǎng)h除單例。
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專(zhuān)為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。