• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看

      ?

      基于pytest和JMeter的自動化測試系統(tǒng)設(shè)計和實現(xiàn)

      2019-01-11 06:00:16李一風(fēng)
      智能計算機與應(yīng)用 2019年1期
      關(guān)鍵詞:測試計劃機上測試用例

      李一風(fēng)

      (上海你我貸互聯(lián)網(wǎng)金融信息服務(wù)有限公司, 上海 200120)

      0 引 言

      自動化測試是軟件測試未來的發(fā)展方向,自動化測試中往往會遇到測試腳本管理困難、測試效率低等問題[1-4]。如何選用合適的測試工具和搭建有效的測試框架是測試工程師一直在研究的問題。JMeter作為一種功能豐富的測試工具受到了廣泛關(guān)注和研究[2-5]。Apache JMeter是一個基于Java語言的開源工具,可以用于軟件的功能測試和性能測試。在被測系統(tǒng)功能越來越多,結(jié)構(gòu)越來越復(fù)雜的今天,測試用例往往非常龐大,一個回歸測試就需要幾十或上百個JMeter腳本組成的測試集。單純使用JMeter時會存在以下問題。

      (1)測試用例的管理。JMeter本身不提供測試集的管理功能,多個JMeter腳本的執(zhí)行一般需要測試人員手動整理出測試計劃中應(yīng)該包含的測試用例。手動在命令行啟動JMeter命令,并在發(fā)生錯誤時進行人工排查,達不到一鍵執(zhí)行和無人值守。

      (2)大量腳本的執(zhí)行效率問題。JMeter自帶遠(yuǎn)程執(zhí)行功能只是針對一個腳本中的多個步驟并行,不支持多個JMeter腳本的并行執(zhí)行。需要實現(xiàn)多個測試用例的并行執(zhí)行時,需要自行編寫復(fù)雜的調(diào)度程序或者測試人員人工介入。前者成本較高,后者無法實現(xiàn)完全的自動化。

      本文設(shè)計并實現(xiàn)了一種基于pytest的自動化測試系統(tǒng),具有如下特點:

      (1)充分利用pytest本身的功能和豐富的插件,只需編寫少量代碼、簡單輕量、可以快速部署。

      (2)實現(xiàn)了多JMeter腳本的管理,可以一鍵執(zhí)行測試集,并在腳本執(zhí)行中自動進行異常重試,實現(xiàn)了無人值守。

      (3)進行遠(yuǎn)程分布式執(zhí)行,使得在遇到測試資源瓶頸時,快速進行測試執(zhí)行機的橫向擴展來提高測試計劃的執(zhí)行效率。

      (4)自動生成JUnit格式報告,可以方便的與持續(xù)集成系統(tǒng)進行集成,生成各種測試報告和圖表。

      1 基于pytest的自動化測試系統(tǒng)

      1.1 pytest

      pytest是基于Python語言的一種自動化測試框架,本身具有Python語言的良好的跨平臺性和簡單易上手的優(yōu)點[6-9]。pytest可以用于單元測試或功能測試,相比其它測試框架,具有以下優(yōu)點:

      (1)簡單靈活,容易上手。

      (2)支持測試用例的參數(shù)化。

      (3)能支持簡單的單元測試和復(fù)雜的功能測試。

      (4)具有較多第三方插件,并可以自定義擴展。

      (5)執(zhí)行測試過程中可將某些測試跳過,或?qū)δ承╊A(yù)期失敗的用例標(biāo)記成失敗。

      (6)支持多種格式的測試報告,可很好地與持續(xù)系統(tǒng)集成。

      基于上述優(yōu)點,pytest已經(jīng)成為Python中最流行的測試框架之一。

      1.2 系統(tǒng)結(jié)構(gòu)介紹

      該框架主要分為4個模塊,自動化測試系統(tǒng)結(jié)構(gòu)如圖1所示。

      圖1 分布式自動化測試系統(tǒng)結(jié)構(gòu)圖

      Fig.1Structurediagramofdistributedautomatedtestingsystem

      (1)初始化模塊。用于讀取配置文件,獲取測試要執(zhí)行的各種參數(shù);從Git倉庫拉取最新的JMeter腳本文件,轉(zhuǎn)換腳本文件為pytest的測試用例參數(shù);建立與測試執(zhí)行機的SSH連接,同步要執(zhí)行的JMeter腳本到各個測試執(zhí)行機;在測試執(zhí)行機上創(chuàng)建子進程等待測試任務(wù)的分配。

      (2)任務(wù)調(diào)度模塊。根據(jù)調(diào)度算法,分配測試腳本到不同的執(zhí)行機上的子進程。

      (3)測試執(zhí)行模塊。在子進程中執(zhí)行測試腳本,通過解析JMeter生成的xml格式的報告,判斷測試執(zhí)行是否成功。

      (4)報告收集模塊。將所有測試執(zhí)行機生成的多個測試腳本的報告收集回調(diào)度機,生成整個測試計劃的報告。

      1.3 基于pytest的自動化測試流程

      本文的自動化測試系統(tǒng)工作流程如圖2所示。

      (1)調(diào)用入口程序觸發(fā)一次測試計劃的執(zhí)行,進行測試計劃配置文件的讀取,得到要執(zhí)行的腳本Git倉庫地址和測試用例目錄、測試環(huán)境等參數(shù),并啟動pytest主程序。

      圖2 自動化測試流程圖

      (2)conftest.py作為pytest主程序的默認(rèn)參數(shù)化文件。本系統(tǒng)在其中實現(xiàn)了測試用例的獲取和轉(zhuǎn)換。包括遍歷測試目錄、得到測試腳本的名稱和路徑、排除不執(zhí)行的用例(skip case和known error case)、組成pytest需要的參數(shù)化變量。

      (3)pytest主進程開始執(zhí)行,首先從調(diào)度機同步需要執(zhí)行的測試腳本文件到各個執(zhí)行機,進行測試任務(wù)的調(diào)度和分發(fā)。

      (4)測試執(zhí)行機啟動JMeter進程,執(zhí)行JMeter腳本,并通過解析xml判斷是否執(zhí)行成功。為了排除測試環(huán)境不穩(wěn)定造成的測試失敗,本系統(tǒng)實現(xiàn)了失敗重跑機制,即每個測試有一個最大重試次數(shù),當(dāng)測試失敗時,會判斷是否已經(jīng)達到最大的重試次數(shù)。當(dāng)沒有達到時,會對測試用例進行重復(fù)執(zhí)行,取成功的一次執(zhí)行作為最終結(jié)果,直到達到最大重試次數(shù)。實踐表明,這種機制可以降低測試環(huán)境不穩(wěn)定時測試結(jié)果的誤報率。另外,為了防止單個測試用例執(zhí)行時間過長導(dǎo)致整個測試計劃執(zhí)行時間過長,本系統(tǒng)實現(xiàn)了超時結(jié)束機制,即設(shè)置單個測試用例執(zhí)行時間的最大值,當(dāng)某個測試用例的執(zhí)行時間超過這個最大值時,殺掉當(dāng)前測試用例的子進程,并標(biāo)記測試結(jié)果為失敗。

      (5)所有用例執(zhí)行完成時,由調(diào)度機收集在測試執(zhí)行機上生成的測試用例報告,并合并多個測試用例報告為整個測試計劃的匯總報告。

      1.4 自動化測試系統(tǒng)的主要技術(shù)

      1.4.1 用例的管理

      通過使用pytest的參數(shù)化用例方法實現(xiàn)JMeter腳本到pytest測試用例的轉(zhuǎn)變。由pytest實現(xiàn)測試用例的管理,可以方便實現(xiàn)從指定的目錄中篩選用例,根據(jù)腳本的名稱篩選用例,指定要skip或者期望失敗的用例等。要實現(xiàn)用例管理,關(guān)鍵問題是如何將以JMeter腳本形式存在的用例轉(zhuǎn)變?yōu)閜ytest管理的用例。這就用到了pytest參數(shù)化測試用例功能。下面介紹參數(shù)化測試用例的用法。

      在pytest中使用裝飾器@pytest.mark.parametrize來實現(xiàn)用例的參數(shù)化。一個典型的例子是:

      @pytest.mark.parametrize("test_input,expected", [

      ("3+5", 8),

      ("2+4", 6),

      ("6+9", 42),])

      def test_eval(test_input, expected):

      assert eval(test_input) == expected

      在這里,@parametrize裝飾器定義了3組不同的輸入值和期望值(即3個用例),test_eval參數(shù)將會使用這3組值執(zhí)行3次。執(zhí)行的輸出:1 failed, 2 passed in 0.06 seconds表示執(zhí)行了3個用例。

      同理,在手動執(zhí)行單個JMeter測試用例時傳入用例名和用例目錄進行單個測試的執(zhí)行。在本系統(tǒng)中,通過自動遍歷測試目錄,找到所有要執(zhí)行的JMeter腳本,解析出目錄和文件名作為pytest的測試參數(shù)傳入,在測試函數(shù)中自動調(diào)用JMeter命令來執(zhí)行測試。減少了手動介入,實現(xiàn)了用例的高效管理。

      1.4.2 測試用例執(zhí)行結(jié)果的判斷

      在傳統(tǒng)方法中,一般需要測試人員通過查看每個JMeter腳本生成的結(jié)果樹來判斷斷言是否成功,并且單個測試報告無法與持續(xù)集成系統(tǒng)集成顯示為整個測試計劃的報告。本系統(tǒng)通過解析xml報告來并通過pytest的斷言來實現(xiàn)自動化判斷測試用例結(jié)果,并形成多個JMeter測試用例的匯總報告。為了說明工作原理,下面以一個有2個步驟的測試用例的報告來說明如何判斷測試用例的執(zhí)行結(jié)果。

      httpSample和sample表示2個采樣器的執(zhí)行結(jié)果。例子中采樣結(jié)果s="true"表示為執(zhí)行成功。通過解析使用Python的第三方庫lxml對xml文件進行解析。判斷的標(biāo)準(zhǔn)是,如果所有的采樣器結(jié)果都為成功,標(biāo)記這個測試用例的結(jié)果為成功,否則為失敗。使用xpath語法獲取用例中失敗的采樣器數(shù)目:

      "count(/testResults/*[attribute::s='false'])",如果這個值大于0,則表示有至少一個采樣器執(zhí)行失敗,此時用pytest的斷言把用例標(biāo)記為失敗。如果等于0,則標(biāo)記為成功。

      1.4.3 測試用例的分布式執(zhí)行

      當(dāng)被測應(yīng)用的功能較多,測試計劃包含的測試集很大時,執(zhí)行一次測試計劃的時間就會很長,這時候就需要使用分布式執(zhí)行。JMeter本身是支持分布式執(zhí)行的,其原理是調(diào)度機把腳本發(fā)送到臺執(zhí)行機上,執(zhí)行機執(zhí)行完成后,把結(jié)果回傳給調(diào)度機,調(diào)度機收集所有執(zhí)行機的信息并匯總成一個報告。但是這種分布式是把單個腳本發(fā)送到執(zhí)行機上執(zhí)行,本質(zhì)是一個測試用例的多個步驟級別上的分布式執(zhí)行。無法把測試用例集中的多個測試用例分布到不同的執(zhí)行機上執(zhí)行。為了實現(xiàn)測試用例級別上的分布式執(zhí)行,本文引入了pytest的xdist插件。

      xdist可以實現(xiàn)用例級別的分布式執(zhí)行。其中2個關(guān)鍵的參數(shù)是rsync和tx。本系統(tǒng)使用rsync把框架程序和測試腳本同步到執(zhí)行機上。在本系統(tǒng)中使用負(fù)載均衡策略,即按照執(zhí)行機的當(dāng)前負(fù)載情況進行用例分配。執(zhí)行流程如下:同步框架腳本和測試用例腳本到執(zhí)行機,讀取測試用例,在執(zhí)行機上創(chuàng)建等待執(zhí)行的進程,將測試用例分布到不同的進程中執(zhí)行。

      為了驗證分布式系統(tǒng)對測試效率的提升效果,進行以下實驗。實驗場景:創(chuàng)建10個JMeter腳本,每個執(zhí)行時間是5 s。由3臺配置相同的虛擬機組成一個測試集群,在虛擬機的數(shù)目為1、2、3時,執(zhí)行10個測試腳本組成的測試集,記錄測試集的執(zhí)行時間,每次執(zhí)行3次,記錄3次的平均用時,執(zhí)行用時見表1。

      表1單臺機器與分布式測試用時結(jié)果對比

      Tab.1Timeresultcomparisonforsinglemachineanddistributedtesting

      執(zhí)行機數(shù)量執(zhí)行的平均用時/s196.25248.79333.32

      可以看出,隨著執(zhí)行機的增加,執(zhí)行測試集的總用時會減少,說明本系統(tǒng)的分布式執(zhí)行功能可以有效提高測試效率。

      2 結(jié)束語

      本文研究了基于pytest的自動化測試框架,將pytest和JMeter測試工具有機結(jié)合,設(shè)計并實現(xiàn)了一個分布式自動化測試系統(tǒng)。通過pytest管理和驅(qū)動JMeter測試腳本的執(zhí)行,結(jié)合使用pytest相關(guān)插件實現(xiàn)了錯誤重試、超時退出等功能,提高了由多個JMeter腳本組成的測試計劃的執(zhí)行效率。

      猜你喜歡
      測試計劃機上測試用例
      基于改進V模型的軟件測試過程研究
      基于SmartUnit的安全通信系統(tǒng)單元測試用例自動生成
      嵌入式軟件單元測試方法研究
      軟件工程(2019年8期)2019-09-04 10:00:46
      基于混合遺傳算法的回歸測試用例集最小化研究
      機上上網(wǎng),開啟乘機新時代
      空中之家(2018年1期)2018-01-31 01:50:33
      基于PLC的變頻器控制系統(tǒng)在甩干機上的研究
      電子測試(2017年15期)2017-12-18 07:19:29
      基于依賴結(jié)構(gòu)的測試用例優(yōu)先級技術(shù)
      軟件回歸測試用例選取方法研究
      淺談軟件測試計劃的制定
      軟件測試流程研究
      新媒體研究(2009年2期)2009-03-02 09:33:14
      如东县| 昭苏县| 青神县| 桐庐县| 报价| 开阳县| 灵武市| 栖霞市| 全南县| 江山市| 潮州市| 金昌市| 清新县| 望奎县| 泾川县| 全南县| 云南省| 景东| 中卫市| 梨树县| 安新县| 纳雍县| 固阳县| 水富县| 贵德县| 南安市| 阿坝县| 阳山县| 朝阳市| 天峨县| 肥东县| 庆安县| 民和| 广东省| 德惠市| 梨树县| 高阳县| 榆中县| 莱阳市| 西乌珠穆沁旗| 汉寿县|