999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

基于Python的測(cè)試驅(qū)動(dòng)開發(fā)框架

2018-09-17 09:56:28朱道雨
科教導(dǎo)刊·電子版 2018年20期

朱道雨

摘 要 本文首先介紹了測(cè)試驅(qū)動(dòng)開發(fā),繼而介紹了測(cè)試模式,描述了測(cè)試驅(qū)動(dòng)開發(fā)的優(yōu)勢(shì)、一般步驟、測(cè)試的原則和對(duì)一般開發(fā)人員的要求,最后比較詳細(xì)地介紹了幾種基于Python的測(cè)試框架。

關(guān)鍵詞 測(cè)試驅(qū)動(dòng)開發(fā) Python 測(cè)試框架

中圖分類號(hào):TP3 文獻(xiàn)標(biāo)識(shí)碼:A

1測(cè)試驅(qū)動(dòng)開發(fā)介紹

測(cè)試驅(qū)動(dòng)開發(fā)(TDD)是一種不同于傳統(tǒng)開發(fā)流程的新型的開發(fā)方法,采取了很小的增量式開發(fā)方式,強(qiáng)調(diào)測(cè)試在軟件開發(fā)過程中的作用。TDD是一種編碼之前進(jìn)行單元測(cè)試的軟件開發(fā)思想。TDD先行定義了需求,擴(kuò)大測(cè)試覆蓋率,從而推進(jìn)整個(gè)開發(fā)過程。其編寫的代碼簡(jiǎn)潔、健壯且高質(zhì)量,加快軟件開發(fā)。

2測(cè)試模式介紹

針對(duì)軟件開發(fā)典型的瀑布模型,其是一種帶有部分反饋的自上而下的開發(fā)模式,對(duì)文檔支持要求高。該模型按照階段劃分了檢查點(diǎn),最終產(chǎn)品只能在后期才能看到最終結(jié)果,測(cè)試階段一般占一半時(shí)間。軟件測(cè)試和軟件開發(fā)過程一樣遵循軟件工程原理,下面以V模型和X模式為例對(duì)測(cè)試與開發(fā)之間的關(guān)系進(jìn)行說明。

2.1 V測(cè)試模型

V模型和瀑布開發(fā)模型一樣,存在需求分析、概要設(shè)計(jì)、詳細(xì)設(shè)計(jì)、代碼編碼等階段,這些過程都需考慮對(duì)應(yīng)的測(cè)試工作,同時(shí)設(shè)計(jì)測(cè)試用例、編制測(cè)試計(jì)劃。V模型明確標(biāo)明了測(cè)試的不同級(jí)別,清楚地描述了測(cè)試階段和開發(fā)過程期間各階段的對(duì)應(yīng)的關(guān)系。需求分析產(chǎn)生的錯(cuò)誤直到驗(yàn)收測(cè)試才能發(fā)現(xiàn)是其最大的局限性。

2.2 X測(cè)試模型

圖1:X模型圖

如圖,X模型更詳細(xì)地描述了詳細(xì)設(shè)計(jì)和編碼階段的開發(fā)行為,分離單程序片段的編碼和測(cè)試,直到集成為可執(zhí)行程序,然后測(cè)試這些可執(zhí)行程序。已通過集成測(cè)試的成品既可封裝并提交給用戶,也可作為更大規(guī)模集成的一部分,針對(duì)多程序片段,分離編碼和測(cè)試,并定義了探索性測(cè)試,強(qiáng)調(diào)單元測(cè)試和集成測(cè)試的重要性。

3 TDD的優(yōu)勢(shì)以及一般步驟

3.1 TDD優(yōu)勢(shì)

TDD相較于傳統(tǒng)的結(jié)構(gòu)化開發(fā)過程方法,具有以下優(yōu)勢(shì):

3.1.1更快更好地迎接需求變化

根據(jù)客戶需求編寫測(cè)試用例,關(guān)注用戶反饋和以使用者的角度對(duì)功能的過程和接口進(jìn)行設(shè)計(jì),可及時(shí)響應(yīng)需求變更,更符合后期開發(fā)的需求。同時(shí)覆蓋完全的單元測(cè)試,提高了代碼的可靠性。

3.1.2明顯地縮短了設(shè)計(jì)決策的反饋循環(huán)

基于易測(cè)試和測(cè)試獨(dú)立性的要求,更多地依賴于接口,通過實(shí)現(xiàn)松耦合的設(shè)計(jì),提高系統(tǒng)的可擴(kuò)展性和抗變性;同時(shí)對(duì)其功能的分解、使用過程、接口都進(jìn)行了設(shè)計(jì)。

3.1.3降低了后續(xù)測(cè)試的成本

TDD先考慮代碼的使用需求――功能、過程、接口等,再確認(rèn)需求是無歧義的、可驗(yàn)證的。首先將測(cè)試提到編碼之前并頻繁地運(yùn)行所有測(cè)試,盡早地發(fā)現(xiàn)或避免錯(cuò)誤,不斷地重構(gòu)代碼并消除重復(fù)設(shè)計(jì),提高代碼的重用,極大地提高代碼的健壯性。

3.1.4提供持續(xù)的回歸測(cè)試

TDD能幫助開發(fā)人員持續(xù)地跟蹤軟件生命周期內(nèi)的全部狀態(tài),并快速地反饋開發(fā)人員,使開發(fā)人員無需過分擔(dān)心不可預(yù)知的異常并大膽地實(shí)施重構(gòu)。

3.1.5提供合格的文檔

TDD所產(chǎn)生的單元測(cè)試代碼是最完美的開發(fā)者文檔,含有API如何使用的信息,同時(shí)與最新的代碼保持同步。

3.2 TDD的一般步驟

(1)明確當(dāng)前主要完成的功能,并形成電子或者書面的記錄表單;

(2)快速地編寫此功能的測(cè)試用例;

(3)運(yùn)行測(cè)試,發(fā)現(xiàn)新增的測(cè)試不能通過測(cè)試;

(4)改動(dòng)測(cè)試程序,盡快讓測(cè)試程序通過運(yùn)行

(5)重構(gòu)已完成的代碼,消除重復(fù)設(shè)計(jì),優(yōu)化程序結(jié)構(gòu),并保證測(cè)試通過

(6)循環(huán)完成所有功能。

3.3測(cè)試原則

(1)測(cè)試隔離,不同代碼的測(cè)試相互隔離,對(duì)單塊代碼的測(cè)試應(yīng)只考慮該代碼的測(cè)試,

(2)測(cè)試列表,在軟件開發(fā)的任意階段,添加新功能需求時(shí),需將相關(guān)功能點(diǎn)添加到測(cè)試列表中,不斷地完成測(cè)試用例,并重構(gòu)。

(3)測(cè)試驅(qū)動(dòng),在完成代碼類、功能設(shè)計(jì)前,首先編制測(cè)試代碼,考慮如何使用與測(cè)試,繼而設(shè)計(jì)編碼。

(4)測(cè)試與斷言優(yōu)先,在編寫代碼之前編寫測(cè)試,在編制代碼過程中,首先編寫斷言語句,再編寫輔助語句。

(5)可測(cè)試性,代碼設(shè)計(jì)過程必須具有較強(qiáng)的可測(cè)試性,有助于提高代碼的內(nèi)聚性和復(fù)用。

(6)及時(shí)重構(gòu),無論是功能代碼還是測(cè)試代碼,對(duì)結(jié)構(gòu)不合理、重復(fù)的代碼,都要進(jìn)行及時(shí)的重構(gòu)。

4測(cè)試框架

4.1 unittest測(cè)試框架

該測(cè)試框架中最核心的概念為:test case,test suite,test runner,text fixture。unittest提供了TestCase基類來構(gòu)造單元測(cè)試用例,在構(gòu)建測(cè)試用例的時(shí)候,使用setUp方法初始化測(cè)試環(huán)境,tearDown方法執(zhí)行掃尾結(jié)束工作并還原測(cè)試環(huán)境,這類似于上下文管理器,setUp和tearDown每次必須運(yùn)行一次(如圖2)。

圖2:測(cè)試流程圖

TestLoader用來加載TestCase、TestSuite,可使用LoadTestsForm方法,創(chuàng)建測(cè)試實(shí)例,繼而add到TestSuite中,返回一個(gè)TestSuite實(shí)例。使用TextTestRunner執(zhí)行測(cè)試用例,其中,測(cè)試結(jié)果保存到Result中,包括運(yùn)行的用例數(shù)量、成功與失敗信息。Fixture完成測(cè)試環(huán)境的搭建和銷毀。

通過命令行或者main函數(shù)來啟動(dòng)單元測(cè)試,main會(huì)調(diào)用run來執(zhí)行,當(dāng)Runner執(zhí)行時(shí),將執(zhí)行結(jié)果輸出到控制臺(tái)或文件,通過設(shè)置verbosity參數(shù)控制執(zhí)行結(jié)果的輸出。unittest框架比較笨重且難以擴(kuò)展,必須在TestCase子類中編寫所有的單元測(cè)試和斷言方法,必須為測(cè)試活動(dòng)建立測(cè)試套件。

4.2 doctest測(cè)試

doctest測(cè)試框架在文檔字符串(docstring)內(nèi)嵌注釋,這些注釋將各單元模塊的期望結(jié)果予以表達(dá),字符串如同交互式shell會(huì)話搜索Python代碼,繼而嘗試執(zhí)行并驗(yàn)證結(jié)果。測(cè)試用例的位置必須放在整個(gè)模塊文件的開始部分或緊接聲明語句的下一行。設(shè)置verbose 參數(shù)用于控制是否輸出詳細(xì)信息,默認(rèn)不輸出任何東西,除非測(cè)試失敗。

當(dāng)不帶任何參數(shù)運(yùn)行 test_basic.py 時(shí)。將test_basic 導(dǎo)入到腳本的命名空間中,可導(dǎo)入其他希望要測(cè)試的模塊。testmod函數(shù)去遍歷模塊本身、模塊函數(shù)及其所有文檔字符串,以找出所有類似交互式 shell 會(huì)話的內(nèi)容。

doctest 在解析顯式會(huì)話時(shí),將空行作為會(huì)話結(jié)束來處理。可利用文檔字符串自定義的函數(shù)來解決此問題。一方面由于文檔字符串畢竟是字符串換碼,所以要注意\n這樣的序列被擴(kuò)展。另一方面由 doctest處理的文檔字符串可能會(huì)在其內(nèi)部包含回溯。

4.3 nose 系列

由于擴(kuò)展自u(píng)nittest的擴(kuò)展,nose 也支持類似于 setUp、setUpClass、setUpModule 的測(cè)試環(huán)境創(chuàng)建方式,所以python的測(cè)試更加簡(jiǎn)單。nose自動(dòng)發(fā)現(xiàn)測(cè)試代碼并執(zhí)行,nose提供了大量的插件,比如測(cè)試輸出的xUnitcompatible,覆蓋報(bào)表等等。

路徑、模塊(文件)、類、函數(shù)的名字若匹配上testMatch,那就會(huì)被認(rèn)為是一個(gè)用例,另外所有 unittest.TestCase 的子類都會(huì)被當(dāng)做測(cè)試用例。nose主要檢查一個(gè)測(cè)試用例的文件夾,否則會(huì)忽略此文件路徑。顯式地避免某個(gè)對(duì)象被當(dāng)做測(cè)試用例的方法是:給其或其容器添加一個(gè) _test_ 屬性,并且運(yùn)算結(jié)果不為 True,只要 bool(_test_) == False 即可。

nose可不使用特定的格式、不需要一個(gè)類容器,甚至不需要 import,但nose測(cè)試用例的命名仍需以 test_開頭。

4.4 pytest

作為unittest的替代工具,pytest是一個(gè)語法簡(jiǎn)單且功能豐富靈活的測(cè)試框架。相比unittest,實(shí)現(xiàn)相同的測(cè)試功能,pytest更簡(jiǎn)潔高效;支持簡(jiǎn)單的單元測(cè)試和復(fù)雜的功能測(cè)試,支持參數(shù)化,支持重復(fù)執(zhí)行失敗的case,支持運(yùn)行由nose、unittest編寫的測(cè)試case。

pytest 創(chuàng)建測(cè)試環(huán)境(fixture)的方式,通過顯式指定scope參數(shù)來選擇裝飾器。一個(gè)fixture 函數(shù)的類型一旦定義即確定,對(duì)于 scope=function 的 fixture 函數(shù)會(huì)在測(cè)試用例的前后分別調(diào)用 setup/teardown。測(cè)試用例的參數(shù)只負(fù)責(zé)引用具體的對(duì)象,并不關(guān)心作用域;同時(shí)setup/teardown 語法與 unittest 的兼容性不如 nose 高。fixture在參數(shù)列表中可以明了地知道哪些tests使用了一個(gè)資源,無需人為地創(chuàng)建類,只需分離fixture應(yīng)用。而對(duì)于一個(gè)資源而言,teardown代碼是緊密地和setup代碼耦合的。常常需在資源setup代碼的位置處指定資源的生命周期的范圍來節(jié)省測(cè)試時(shí)間。

一般而言,測(cè)試類以Test開頭的類,但不能帶有 _init_方法;測(cè)試文件以test開頭或者結(jié)尾的文件;測(cè)試函數(shù)以test開頭。pytest會(huì)自動(dòng)進(jìn)行收集測(cè)試用例,在pytest.ini配置文件中,python_classes指定測(cè)試類和測(cè)試文件、python_functions 指定測(cè)試函數(shù)。在setup.cfg文件中norecursedirs 指定禁止目錄。

4.5 unittest2測(cè)試框架

unittest2測(cè)試框架是unittest的升級(jí)版,改善了API以及診斷語法。由于篇幅所限,只說明一點(diǎn):可使用import unittest2 as unittest在unittest與unittest2之間進(jìn)行切換。

5結(jié)束語

構(gòu)建“TDD友好”的系統(tǒng),需要進(jìn)行分層架構(gòu),建立標(biāo)準(zhǔn)一致的系統(tǒng),操作環(huán)境可控,努力創(chuàng)建高內(nèi)聚低耦合的結(jié)構(gòu),在TDD實(shí)踐過程可實(shí)現(xiàn)代碼的低層設(shè)計(jì)。而TDD 并不能直接提高設(shè)計(jì)能力,它要求開發(fā)人員思想上重視測(cè)試,掌握重構(gòu)與設(shè)計(jì)模式等知識(shí),從而間接改善軟件設(shè)計(jì)。

參考文獻(xiàn)

[1] Beck,K.測(cè)試驅(qū)動(dòng)開發(fā)(中文版) [M].孫平平譯.北京:中國(guó)電力出版社, 2004.

[2] 雨痕.Python3學(xué)習(xí)筆記(上卷)[M].北京:電子工業(yè)出版社,2018.

[3] Matthew,K.Python機(jī)器學(xué)習(xí)實(shí)踐,測(cè)試驅(qū)動(dòng)的開發(fā)方法[M].劉江一,上官明喬,白皓,劉旭威譯.北京:機(jī)械工業(yè)出版社,2017.

主站蜘蛛池模板: 亚洲动漫h| 精品久久综合1区2区3区激情| 国产精品免费久久久久影院无码| 久久综合丝袜日本网| 亚洲人成在线精品| 1769国产精品免费视频| 九色国产在线| 国产白浆一区二区三区视频在线| 色婷婷亚洲十月十月色天| 在线人成精品免费视频| 在线日本国产成人免费的| 久久久久亚洲av成人网人人软件| 无码一区18禁| 国产男女免费完整版视频| av在线无码浏览| 国产青青草视频| 久久国产亚洲欧美日韩精品| 亚洲一区网站| 欧美精品一区二区三区中文字幕| 日本www在线视频| 久久www视频| 国产性精品| 亚洲第一福利视频导航| 91精品免费久久久| 日韩精品中文字幕一区三区| 亚洲区一区| 国产毛片高清一级国语| 成人毛片在线播放| 国产一二三区在线| 高清色本在线www| 中文成人在线视频| 中文精品久久久久国产网址 | 伊人福利视频| 国产欧美在线观看视频| 制服丝袜国产精品| 精品天海翼一区二区| 日韩午夜福利在线观看| 日韩福利视频导航| 另类欧美日韩| 亚洲人在线| 丰满人妻中出白浆| 国产一级特黄aa级特黄裸毛片| 欧美在线中文字幕| 国产成人综合亚洲网址| 久久久无码人妻精品无码| 欧美自拍另类欧美综合图区| 国产成人精品2021欧美日韩| 超碰91免费人妻| 亚洲精品国产成人7777| 国产视频一区二区在线观看 | AV网站中文| 久久青草精品一区二区三区| 少妇高潮惨叫久久久久久| 久久久久无码精品| 亚洲三级片在线看| 青青久在线视频免费观看| 无码国产伊人| 欧美精品影院| 欧美日韩一区二区三区四区在线观看| 国产精品冒白浆免费视频| 国产真实乱子伦视频播放| 亚洲色婷婷一区二区| 国产超碰在线观看| 久久五月天综合| 亚洲日韩国产精品综合在线观看| 99九九成人免费视频精品| 亚洲一级色| 欧美在线中文字幕| 精品国产91爱| 亚洲va欧美ⅴa国产va影院| 91破解版在线亚洲| 67194在线午夜亚洲| 国产电话自拍伊人| 91精品网站| 久久精品无码一区二区日韩免费| 亚洲综合国产一区二区三区| 毛片卡一卡二| 亚洲欧美成人综合| 福利姬国产精品一区在线| 国产靠逼视频| 日韩av电影一区二区三区四区| 国产99免费视频|