亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        基于QtTest的自動化單元測試

        2017-05-11 17:29:06朱健
        價值工程 2017年14期
        關(guān)鍵詞:單元測試自動化

        朱健

        摘要: Qt是跨平臺的應(yīng)用軟件開發(fā)框架,Qt Test是Qt框架的單元測試庫?;赒t Test的單元測試可以進行功能和性能測試。持續(xù)集成系統(tǒng)可以自動化單元測試的構(gòu)建、部署、運行和結(jié)果統(tǒng)計過程。工程實踐表明:基于Qt Test的單元測試與持續(xù)集成系統(tǒng)的結(jié)合可以降低軟件的缺陷率,優(yōu)化軟件架構(gòu)的設(shè)計,提高軟件工程的自動化。

        Abstract: Qt is a cross platform application development framework. Qt Test is the unit testing library provided by Qt framework. The Qt Test based unit testing can be used for functionality and benchmarking testing. Continuous integration system can automate the build, deployment, run and result statistic processes of unit testing. The engineering practice shows the combination of Qt Test based unit testing and continuous integration system can be used for decreasing the defect rate of software, optimizing the design of software architecture, improving the automation of software engineering.

        關(guān)鍵詞: 單元測試;Qt;持續(xù)集成;自動化

        Key words: unit testing;Qt;continuous integration;automation

        中圖分類號:TP31 文獻標(biāo)識碼:A 文章編號:1006-4311(2017)14-0216-04

        0 引言

        基于Qt框架的大型應(yīng)用軟件通常包括用戶界面,業(yè)務(wù)邏輯,工具庫,UI組件庫,平臺適配層等,軟件規(guī)模大,邏輯復(fù)雜,通常進行層次化和模塊化設(shè)計,軟件的整體穩(wěn)定性和效率與每個基礎(chǔ)模塊的代碼質(zhì)量息息相關(guān)。單元測試是對軟件模塊的功能測試,可及早發(fā)現(xiàn)軟件設(shè)計和實現(xiàn)中的問題,便于問題的定位[2]。為了降低軟件的缺陷率,業(yè)界提出并實施了測試驅(qū)動開發(fā)(Test Driven Development)方法,該方法主張先開發(fā)單元測試程序,由單元測試結(jié)果驅(qū)動軟件的設(shè)計和編碼,以到達(dá)更具針對性的架構(gòu)設(shè)計和更低的首次發(fā)布缺陷率[6,7]。所以單元測試是大型尤其是采用測試驅(qū)動開發(fā)的Qt軟件工程的必然要求。

        在工程實踐中常用的通用單元測試框架包括:適用于C++語言的CppUnit[3],適用于Java語言的JUnit[2]等。但是基于Qt的軟件大都依賴于Qt對C++語言的擴展,如信號-槽(signal-slot)機制,屬性(property)機制,元對象(meta-object)框架等;構(gòu)建過程依賴于Qt特有的工具鏈(如qmake,moc等);運行過程依賴于Qt特有的基礎(chǔ)類庫,所以很難使用CppUnit等通用單元測試框架對基于Qt的軟件進行單元測試。而Qt Test是Qt框架的單元測試模塊,可以與Qt的工具鏈、基礎(chǔ)類庫、應(yīng)用框架、集成開發(fā)環(huán)境(IDE)等良好結(jié)合[5]。

        1 Qt Test單元測試框架分析

        1.1 Qt Test單元測試原理

        在Qt Test單元測試體系中,每個測試文件是一個測試集合,測試集合是一個繼承自QObject的測試對象(Test Object),測試對象的每個私有槽(private slot)都是一個測試函數(shù)。Qt Test單元測試框架通過QObject::metaObject()獲取測試對象的QMetaObject屬性,通過QMetaObject::method()依次獲取測試對象的私有槽,逐個調(diào)用并輸出測試結(jié)果。一個典型的測試對象可以用如下的類定義:

        class TestSuite : public QObject {

        Q_OBJECT

        public:

        TestSuite();

        private Q_SLOTS:

        void initTestCase();

        void cleanupTestCase();

        void testcase1();

        void testcase2();

        };

        其中initTestCase()和cleanupTestCase()是兩個特殊的測試函數(shù),initTestCase()在測試程序開始運行時調(diào)用,主要用于準(zhǔn)備測試環(huán)境,包括構(gòu)造測試相關(guān)的對象、樁對象、其他基礎(chǔ)Qt庫對象,初始化局部變量,進行數(shù)據(jù)庫連接,準(zhǔn)備測試數(shù)據(jù)等。cleanupTestCase()在測試程序結(jié)束運行前調(diào)用,是initTestCase()的逆過程,用于銷毀測試過程中構(gòu)造的對象資源,刪除測試運行過程中生成的數(shù)據(jù)等。其余的私有槽都是獨立測試函數(shù),測試函數(shù)的實現(xiàn)需要根據(jù)測試?yán)鞒踢M行一系列的操作,驗證功能和性能要求是否達(dá)到預(yù)期。

        每個Qt Test測試文件最終構(gòu)建成一個單元測試程序,單元測試程序可以獨立運行,不需要運行工具(Test Runner),可以在資源受限的嵌入式Linux設(shè)備上運行。單元測試的運行流程如圖1:測試程序啟動后,測試框架通過QTest::qExec()運行測試對象。首先,測試對象的initTestCase()被調(diào)用;之后測試對象的各個測試函數(shù)會被依次調(diào)用,并記錄測試結(jié)果;最后cleanupTestCase()被調(diào)用,測試結(jié)果輸出,單元測試結(jié)束。

        1.2 Qt Test單元測試內(nèi)容

        1.2.1 功能性測試

        單元測試的基本功能是進行功能性的測試,通過調(diào)用待測對象的接口,完成測試?yán)?guī)定的流程,比對期望值和實際值,并輸出測試結(jié)果。Qt Test提供一系列宏,用于在測試代碼中比對期望值與實際值。例如,QVERIFY(expr)用于校驗二元表達(dá)式expr,若expr為假(false)則判定當(dāng)前測試?yán)?;QCOMPARE(value1, value2)用于判斷兩個值value1,value2是否相等,若不相等則判定測試?yán) ?/p>

        在功能性覆蓋率達(dá)到100%的情況下,需要進一步提高代碼路徑覆蓋率。為提高單個測試?yán)瘮?shù)的代碼路徑覆蓋率,可以采用數(shù)據(jù)驅(qū)動測試(Data Driven Test)方法:即設(shè)計多組數(shù)據(jù),多次運行該測試?yán)瘮?shù),以提高測試效率??筛鶕?jù)待測模塊的代碼實現(xiàn)、測試?yán)男枨笠?guī)約,設(shè)計出覆蓋邊界條件、錯誤處理分支的測試數(shù)據(jù)集,提高單元測試的代碼路徑覆蓋率。Qt Test支持?jǐn)?shù)據(jù)驅(qū)動測試:實現(xiàn)以"_data"為結(jié)尾的測試函數(shù)為同名測試函數(shù)提供測試數(shù)據(jù),測試代碼通過QFETCH獲取測試數(shù)據(jù)。以下代碼構(gòu)造了{(lán)20, 23, "Type A"}, {2000, 2098, "Type B"}兩組數(shù)據(jù)對代碼中的算法Classifier::doClassifier()進行了測試。

        void TestSuite::testcase1_data() {

        QTest::addColumn("inputX");

        QTest::addColumn("inputY");

        QTest::addColumn("result");

        // 第一組測試數(shù)據(jù)

        QTest::newRow << 20 << 23 << QString("Type A");

        // 第二組測試數(shù)據(jù)

        QTest::newRow << 2000 << 2098 << QString("Type B");

        }

        void TestSuite::testcase1() {

        // 獲取數(shù)據(jù)并測試

        QFETCH(int, inputX);

        QFETCH(int, inputY)

        QFETCH(QString, result);

        QString type = Classifier::doClassify(inputX, inputY);

        QVERIFY(type == result);

        }

        1.2.2 GUI測試

        通常的GUI測試主要是黑盒測試,通過模擬鍵盤、鼠標(biāo)事件驅(qū)動GUI應(yīng)用程序運行,捕捉屏幕上的GUI對象比對測試結(jié)果,需要復(fù)雜的Test Runner支持[1],而且這類GUI測試不能對單個GUI控件進行單元測試。Qt Test為繼承自QWidget的控件提供了GUI單元測試功能:使用QTest::keyClick(),QTest::mouseClick()模擬鍵盤和鼠標(biāo)事件驅(qū)動控件運行;通過QVERIFY,QCOMPARE比對期望值和實際結(jié)果,不需要復(fù)雜的對象捕捉技術(shù)。GUI測試同樣支持?jǐn)?shù)據(jù)驅(qū)動的測試,QTestEventList用于定義作用在QWidget上的事件序列,例如:

        QTestEventList events;

        CustomWidget w;

        // 定義事件序列

        events.addMouseClick(Qt::LeftButton, 0, QPoint(20, 30));

        events.addKeyClick(Qt::Key_Backspace);

        events.addDelay(100);

        // 模擬運行事件序列

        events.simulate(&w);

        // 比對測試結(jié)果

        QCOMPARE(w.myProperty(), expectedValue);

        Qt Test的GUI測試不依賴任何測試工具,以輕量級方式模擬鼠標(biāo)、鍵盤事件,便于團隊在設(shè)計和實現(xiàn)GUI組件時做充分的測試,避免系統(tǒng)集成時因GUI組件缺陷導(dǎo)致系統(tǒng)異常。

        1.2.3 性能測試

        軟件的整體性能與基礎(chǔ)模塊的性能密切相關(guān),只對基礎(chǔ)模塊做功能性單元測試,不能保證其性能指標(biāo)。Qt Test可以使用QBENCHMARK進行性能測試。QBENCHMARK可以對塊內(nèi)代碼片段的運行時間進行測定。單元測試運行時,QBENCHMARK塊內(nèi)的代碼片段會被運行多次并記錄運行時間,從而得到比較精確的結(jié)果。性能測試的反復(fù)運行次數(shù),性能計量單位,最小可接受的性能值等可以通過單元測試命令行參數(shù)設(shè)定。在單元測試中引入性能測試,可以在設(shè)計和實現(xiàn)階段及時發(fā)現(xiàn)性能問題,避免軟件集成時運行效率無法達(dá)標(biāo)的問題;在軟件維護階段,基礎(chǔ)模塊的性能測試也可以及時定位不當(dāng)修改引入的性能問題,保證軟件質(zhì)量平穩(wěn)。

        1.3 Qt Test單元測試的改進

        單元測試過程應(yīng)該由大到小,劃分為若干測試模塊,最終細(xì)化到函數(shù)級別,在函數(shù)級別完成邏輯性測試,覆蓋代碼分支,再由小到大完成集成測試和功能性測試[2]。從代碼分支到系統(tǒng)功能的充分測試,可以及時發(fā)現(xiàn)系統(tǒng)中存在的問題,提高測試效率,降低開發(fā)后期的測試和維護成本。軟件的設(shè)計和實現(xiàn)需要遵循如下原則:①將復(fù)雜的大模塊拆分成適合于單元測試的小模塊。對每個小模塊進行單獨的單元測試,有利于缺陷的定位和排除。②將業(yè)務(wù)邏輯與框架做分離。軟件設(shè)計時應(yīng)該避免將業(yè)務(wù)邏輯與框架耦合在一起,否則會造成無法通過構(gòu)造模擬數(shù)據(jù)進行單元測試。③基礎(chǔ)模塊的單個函數(shù)不能實現(xiàn)過多功能,復(fù)雜的函數(shù)會造成測試粒度過大,不利于缺陷定位,復(fù)雜函數(shù)應(yīng)拆分為較小的函數(shù)。④消除冗余代碼。冗余代碼會增加單元測試的設(shè)計難度,降低測試效率,代碼實現(xiàn)時需要消除冗余變量、冗余接口,提取冗余代碼的公共部分為獨立的函數(shù)。

        2 自動化Qt Test單元測試方法

        2.1 自動化Qt Test單元測試的流程和工具

        大型Qt應(yīng)用程序通常包含大量子模塊,本身需要開發(fā)大量的單元測試程序進行測試;在測試驅(qū)動的開發(fā)中,需要先設(shè)計和實現(xiàn)單元測試用例,再進行功能模塊的開發(fā),隨著開發(fā)的迭代,單元測試工程數(shù)量必然逐步增多。所以,在實際項目中,單元測試工程的開發(fā)和維護工作量是很大的。為了提高單元測試的開發(fā)和維護效率,可以使用Qt Creator集成開發(fā)環(huán)境(IDE)。Qt Creator可以將多個的單元測試工程以子工程(sub project)的形式進行管理,有利于單元測試工程的分類和維護;新建單元測試工程時,Qt Creator可以為開發(fā)者生成框架代碼,避免重復(fù)勞動。

        隨著單元測試程序數(shù)量增加,由開發(fā)者手動運行每個單元測試程序并查看結(jié)果將是繁重的重復(fù)性勞動,且不能對單元測試中的警告、錯誤、失敗率等進行有效的統(tǒng)計和歸檔,項目管理者也無法及時了解單元測試的進度、狀況等。持續(xù)集成(Continuous Integration)系統(tǒng)可以自動化單元測試的構(gòu)建、部署、運行、結(jié)果統(tǒng)計過程。持續(xù)集成是一種軟件工程實踐,即通過工具自動從源代碼管理系統(tǒng)獲取項目的源代碼,自動編譯,部署,運行軟件。持續(xù)集成能夠及時發(fā)現(xiàn)和解決軟件工程中存在的問題,減輕開發(fā)者的日常工作量,為項目管理者提供可視化的數(shù)據(jù)參考,Jenkins[4]是目前業(yè)內(nèi)廣泛使用的持續(xù)集成系統(tǒng)。Qt Creator和Jenkins系統(tǒng)相結(jié)合可以有效提高Qt Test單元測試各步驟的自動化程度(如圖2),提高Qt Test單元測試的效率,實現(xiàn)基于Qt Test的測試驅(qū)動開發(fā)。

        2.2 使用Qt Creator開發(fā)和維護Qt Test單元測試工程

        Qt Creator是Qt默認(rèn)的集成開發(fā)環(huán)境(IDE),使用Qt Creator工程向?qū)Э梢钥焖賱?chuàng)建Qt Test單元測試工程。可以通過“文件->新建文件或項目->其他項目->Qt單元測試”打開“Qt單元測試”向?qū)В▓D3)。

        在Qt單元測試向?qū)Х譃?個步驟:位置,構(gòu)建套件(Kit),模塊,詳情,匯總,“位置”用于設(shè)置單元測試工程路徑,“構(gòu)建套件”用于指定目標(biāo)代碼的編譯器或交叉編譯器,“模塊”用于添加單元測試工程依賴的Qt基礎(chǔ)類庫,詳情用于生成單元測試框架代碼。向?qū)蓡卧獪y試工程的框架代碼,開發(fā)者只需進一步增加和完善測試代碼。開發(fā)者可以在Qt Creator中編譯和運行單元測試代碼,最終完成單元測試工程的開發(fā)。

        2.3 使用Jenkins自動化構(gòu)建、部署、結(jié)果統(tǒng)計

        在Jenkins系統(tǒng)Web界面的“項目->配置->構(gòu)建”頁面可編寫自動化構(gòu)建、部署、運行單元測試程序的腳本,在Linux環(huán)境下采用Shell腳本編寫?!绊椖?>配置->構(gòu)建后操作”頁面可以添加“Publish xUnit test report”步驟用于呈現(xiàn)Qt單元測試程序生成的基于XML的測試結(jié)果。

        以自動化嵌入式Linux設(shè)備的單元測試為例,首先需要在Jenkins編譯主機上交叉編譯生成可執(zhí)行的Qt單元測試程序,對于支持輕量級SSH服務(wù)如dropbear的Linux設(shè)備,可以采用SSH(Secure Shell)協(xié)議進行單元測試程序的部署、運行及結(jié)果回收。以下是自動化腳本的主要代碼:

        # 編譯單元測試程序

        mkdir $WORKSPACE/build

        mkdir $WORKSPACE/targetfs

        cd build

        qmake ..

        make INSTALL_ROOT="$WORKSPACE/targetfs" install

        cd $WORKSPACE/targetfs/

        # 將單元測試程序部署到遠(yuǎn)程設(shè)備

        scp tst_* root@://

        # 在遠(yuǎn)程設(shè)備上運行單元測試程序

        ssh root@ //remote_run.sh

        # 將單元測試結(jié)果收回本地

        scp root@//report_*.xml $WORKSPACE/targetfs//

        此例中,單元測試程序可執(zhí)行文件名以tst_開頭,remote_run.sh位于待測Linux設(shè)備上,用于批量運行單元測試程序并輸出XML格式的測試結(jié)果,remote_run.sh的核心代碼如下:

        # 枚舉單元測試程序

        for unittest in tst_*

        do

        # 執(zhí)行單元測試程序,并導(dǎo)出XML格式的測試結(jié)果

        bash -c "./${unittest} -xml -o report_{unittest}.xml"

        done

        Jenkins的“xUnit test report”插件可以根據(jù)XML格式的Qt Test測試結(jié)果以測試結(jié)果趨勢圖(圖4)、詳細(xì)測試結(jié)果表格(圖5)的形式呈現(xiàn)出來。測試結(jié)果趨勢圖頁面可以形象地展現(xiàn)近期單元測試總數(shù)、通過率、失敗率的變化趨勢;詳細(xì)測試結(jié)果表格頁面展示所有測試?yán)慕Y(jié)果詳情,包括失敗測試?yán)氖⌒畔ⅰ⒏鳒y試?yán)倪\行結(jié)果和執(zhí)行時間等。

        3 結(jié)論

        在測試驅(qū)動的開發(fā)中,需要先完成單元測試代碼,根據(jù)單元測試結(jié)果迭代式地設(shè)計、實現(xiàn)、改進目標(biāo)軟件,最終交付軟件產(chǎn)品。這種以單元測試為基礎(chǔ)的軟件開發(fā)模型,可以對軟件基礎(chǔ)模塊的基本功能、關(guān)鍵性能等做充分的測試,可以盡早發(fā)現(xiàn)、定位、解決軟件缺陷,改善軟件質(zhì)量,優(yōu)化軟件架構(gòu)。

        隨著軟件規(guī)模的擴大,單元測試的規(guī)模會逐步增大,構(gòu)建、運行、檢查單元測試結(jié)果的工作量也隨之上升,通過持續(xù)集成系統(tǒng)進行自動化單元測試的實踐可以減輕開發(fā)人員的構(gòu)建、部署、測試工作量,提高測試驅(qū)動開發(fā)的自動化程度,在持續(xù)集成系統(tǒng)中實時展示單元測試結(jié)果可以提高開發(fā)者定位、修正軟件缺陷的效率,可以為軟件工程的進度和質(zhì)量提供定量化的數(shù)據(jù)參考。

        參考文獻:

        [1]吳立金,唐龍利,韓新宇,等.嵌入式軟件GUI自動化測試平臺研究[J].計算機測量與控制,2015,23(4):1094-1097.

        [2]張敏,陳靜,王娟.基于MVC模式的Web系統(tǒng)自動化單元測試方案[J].微型電腦應(yīng)用,2016,32(2):78-80.

        [3]賈長偉,廖建,焉寧,等.基于CppUnit的虛擬試驗單元測試研究[J].計算機測量與控制,2015,23(4):1155-1160.

        [4]John Ferguson Smart. Jenkins The Definitive Guide[M]. O'Reilly Media, 2011: 169-180.

        [5]Qt Test user manual. http://doc.qt.io/qt-4.8/qtestlib-manual.html 2016.

        [6]Nachiappan Nagappan, E. Michael Maximilien, Thirumalesh Bhat, Laurie Williams. Realizing quality improvement through test driven development: results and experiences of four industrial teams[J]. Empir Software Eng 2008,13: 289-302.

        [7]Kent Beck. Test-Driven Development By Example[M]. Addison Wesley, 2002.

        猜你喜歡
        單元測試自動化
        圓錐曲線單元測試卷
        《一次函數(shù)》單元測試題
        供電企業(yè)電力自動化主站系統(tǒng)研究
        錦界煤礦連采膠帶機集控系統(tǒng)的介紹
        供熱站自動控制系統(tǒng)中PLC的應(yīng)用
        AGV小車在白酒行業(yè)自動化立體倉庫中的應(yīng)用
        中國市場(2016年36期)2016-10-19 03:40:15
        配電室無人職守集控站在京博石化的運用
        科技視界(2016年20期)2016-09-29 14:13:02
        配電線路運行資料管理自動化的探討
        科技視界(2016年20期)2016-09-29 13:45:10
        一年級上冊第五單元測試
        一年級上冊一、二單元測試
        国产午夜精品久久久久99| 无码中文亚洲av影音先锋| 一个少妇的淫片免费看| 免费无码中文字幕a级毛片| 亚洲人成网站免费播放| 久久无码高潮喷水抽搐| 国产一级一区二区三区在线播放| 乱码1乱码2美美哒| 天天躁日日躁狠狠躁av中文| 538亚洲欧美国产日韩在线精品 | 久久久久亚洲av无码尤物| 国产高清女人对白av在在线| 国产一区二区黄色的网站| 未满十八勿入av网免费| 二区三区视频| 久久精品网站免费观看| 国产精品黑丝高跟在线粉嫩| 国产精品夜间视频香蕉| 激情人妻在线视频| 成人免费毛片立即播放| 一本丁香综合久久久久不卡网站| 久久亚洲中文字幕无码| 欧美—iGAO视频网| 女人被躁到高潮嗷嗷叫免| 少妇厨房愉情理伦bd在线观看 | 人妻露脸国语对白字幕| 亚洲αv在线精品糸列| 日本乱子人伦在线视频| 最新永久免费AV网站| 亚洲av成熟国产一区二区| 中文字幕人妻被公上司喝醉| 97视频在线观看免费| 搞黄色很刺激的网站二区| 天天摸天天做天天爽水多| 日产无人区一线二线三线新版| 国产午夜av一区二区三区| 免费视频无打码一区二区三区| 野外少妇愉情中文字幕| 一本大道在线一久道一区二区| 久久亚洲网站中文字幕| 午夜理论片yy44880影院|