摘要:通過數(shù)據(jù)的改變從而驅(qū)動(dòng)自動(dòng)化測(cè)試的執(zhí)行,最終引起測(cè)試結(jié)果的改變。二框架用搭建自動(dòng)化測(cè)試框架,需要組織用例以及測(cè)試執(zhí)行,大部分推薦的是。
下面這部分來自于某書籍資料,拿過來,按需參考一下:
測(cè)試模型
(1)線性測(cè)試
1、概念:
通過錄制或編寫對(duì)應(yīng)應(yīng)用程序的操作步驟產(chǎn)生的線性腳本。單純的來模擬用戶完整的操作場(chǎng)景。(操作,重復(fù)操作,數(shù)據(jù))都混合在一起。
2、優(yōu)點(diǎn):每個(gè)腳本相對(duì)獨(dú)立,且不產(chǎn)生其他依賴和調(diào)用。任何一個(gè)測(cè)試用例腳本拿出來都可以多帶帶執(zhí)行。
3、缺點(diǎn):開發(fā)成本高,用例之間存在重復(fù)的操作。比如重復(fù)的用戶登錄和退出。
維護(hù)成本高,由于重復(fù)的操作,當(dāng)重復(fù)的操作發(fā)生改變時(shí),則需要逐一進(jìn)行腳本的修改。
4.線性測(cè)試實(shí)例:用戶登錄
(2)模塊化驅(qū)動(dòng)測(cè)試
1、概念:
將重復(fù)的操作獨(dú)立成功共模塊,當(dāng)用例執(zhí)行過程中需要用到這一模塊操作時(shí)則被調(diào)用。
操作+(重復(fù)操作,數(shù)據(jù))混合在一起。例如,自動(dòng)化測(cè)試的執(zhí)行需要保持測(cè)試用例的獨(dú)立性和完整性,所以每一條用例在執(zhí)行時(shí)都需要登錄和退出操作,so可以把登錄和退出的操作封裝為公共函數(shù)。
2、優(yōu)點(diǎn):由于最大限度消除了重復(fù),從而提高了開發(fā)效率和提高測(cè)試用例的可維護(hù)性。
3、缺點(diǎn):雖然模塊化的步驟相同,但是測(cè)試數(shù)據(jù)不同。比如說重復(fù)的登錄模塊,如果登錄用戶不同,依舊要重復(fù)編寫登錄腳本。
4.實(shí)例:對(duì)公共模塊,例如登陸和退出進(jìn)行模塊化封裝
(3)數(shù)據(jù)驅(qū)動(dòng)測(cè)試
1、概念:它將測(cè)試中的測(cè)試數(shù)據(jù)和操作分離,數(shù)據(jù)存放在另外一個(gè)文件中多帶帶維護(hù)。
通過數(shù)據(jù)的改變從而驅(qū)動(dòng)自動(dòng)化測(cè)試的執(zhí)行,最終引起測(cè)試結(jié)果的改變。
操作+重復(fù)操作+數(shù)據(jù)分開。
2、優(yōu)點(diǎn):
通過這種方式,將數(shù)據(jù)和重復(fù)操作分開,可以快速增加相似測(cè)試,完成不同數(shù)據(jù)情況下的測(cè)試。
3、實(shí)例從excel表格讀取用戶名密碼,登錄郵箱。
用Python搭建自動(dòng)化測(cè)試框架,需要組織用例以及測(cè)試執(zhí)行,大部分推薦的是unittest?,F(xiàn)在用的也是這個(gè),隨著了解,也有其他的框架,有時(shí)間再多去學(xué)習(xí),保持持續(xù)學(xué)習(xí)哦~
附上官方文檔地址:鏈接描述 https://docs.python.org/2.7/l...
unittest是Python自帶的單元測(cè)試框,可以用來作自動(dòng)化測(cè)試框架的用例組織執(zhí)行框架。優(yōu)點(diǎn):提供用例組織與執(zhí)行方法;提供比較方法;提供豐富的日志、清晰的報(bào)告。
大致流程:
寫好TestCase
由TestLoader加載TestCase到TestSuite
然后由TextTestRunner來運(yùn)行TestSuite,運(yùn)行的結(jié)果保存在TextTestResult中。
通過命令行或者unittest.main()執(zhí)行時(shí),main會(huì)調(diào)用TextTestRunner中的run()來執(zhí)行,或者可以直接通過TextTestRunner來執(zhí)行用例。
在Runner執(zhí)行時(shí),默認(rèn)將執(zhí)行結(jié)果輸出到控制臺(tái),我們可以設(shè)置其輸出到文件,在文件中查看結(jié)果。
unittest中最核心的部分是:TestFixture、TestCase、TestSuite、TestRunner。
1、Test fixture用于一個(gè)測(cè)試環(huán)境的準(zhǔn)備和銷毀還原。
當(dāng)測(cè)試用例每次執(zhí)行之前需要準(zhǔn)備測(cè)試環(huán)境,每次測(cè)試完成后還原測(cè)試環(huán)境,比如執(zhí)行前連接數(shù)據(jù)庫、打開瀏覽器等,執(zhí)行完成后需要還原數(shù)據(jù)庫、關(guān)閉瀏覽器等操作。這時(shí)候就可以啟用testfixture。
setUp():準(zhǔn)備環(huán)境,執(zhí)行每個(gè)測(cè)試用例的前置條件;
tearDown():環(huán)境還原,執(zhí)行每個(gè)測(cè)試用例的后置條件;
setUpClass():必須使用@classmethod裝飾器,所有case執(zhí)行的前置條件,只運(yùn)行一次;
tearDownClass():必須使用@classmethod裝飾器,所有case運(yùn)行完后只運(yùn)行一次;
例如:
# 重寫TestCase的setUp() tearDown()方法:在每個(gè)測(cè)試方法執(zhí)行前以及執(zhí)行后各執(zhí)行一次 def setUp(self): # 鉤子方法 print("do something before test : prepare environment") def tearDown(self): # 鉤子方法 print("do something after test : clean up ")2、TestCase
類,unittest.TestCase
一個(gè)類class繼承 unittest.TestCase,就是一個(gè)測(cè)試用例。一個(gè)TestCase的實(shí)例就是一個(gè)測(cè)試用例,就是一個(gè)完整的測(cè)試流程。
包括測(cè)試前環(huán)境準(zhǔn)備setUp()|setUpClass()、執(zhí)行代碼run()、測(cè)試環(huán)境后的還原tearDown()|tearDownClass()。
繼承自u(píng)nittest.TestCase的類中,測(cè)試方法的名稱要以test開頭。且只會(huì)執(zhí)行以test開頭定義的方法(測(cè)試用例)。
例如:【先準(zhǔn)備待測(cè)試的方法function.py】
#!/usr/bin/python3 # -*- coding:utf-8 -*- def add(a,b): return a+b def minus(a,b): return a-b def multi(a,b): return a*b def divide(a,b): return a/b
【測(cè)試腳本】:
import unittest from A_UnitTest_basicDemo_ok.function import * class TestFunc(unittest.TestCase): # 繼承自u(píng)nittest.TestCase # 重寫TestCase的setUp()、tearDown()方法:在每個(gè)測(cè)試方法執(zhí)行前以及執(zhí)行后各執(zhí)行一次 def setUp(self): print("do something before test : prepare environment") def tearDown(self): print("do something after test : clean up ") # 測(cè)試方法均已test開頭,否則是不被unittest識(shí)別的 def test_add(self): print("add:") self.assertEqual(3,add(1,2)) def test_minus(self): print("minus") self.assertEqual(3,minus(5,2)) def test_multi(self): print("multi") self.assertEqual(6,multi(2 ,3)) def test_divide(self): print("divide") self.assertEqual(2,divide(4,2)) if __name__ == "__main__": # 在main()中加verbosity參數(shù),可以控制輸出的錯(cuò)誤報(bào)告的詳細(xì)程度 # verbosity=*:默認(rèn)是1;設(shè)為0,則不輸出每一個(gè)用例的執(zhí)行結(jié)果;2-輸出詳細(xì)的執(zhí)行結(jié)果 unittest.main(verbosity=2)
或者也可以使用setUpClass() & tearDownClass()方法:
# 如果想在所有case執(zhí)行之前準(zhǔn)備一次測(cè)試環(huán)境,并在所有case執(zhí)行結(jié)束后再清理環(huán)境 @classmethod def setUpClass(cls): print("this setupclass() method only called once") @classmethod def tearDownClass(cls): print("this teardownclass() method only called once too")
【verbosity】
在測(cè)試用例文件的末尾加上如下代碼:
if __name__ == "__main__": unittest.main(verbosity=2) # 輸出詳細(xì)的錯(cuò)誤報(bào)告
在unittest.main()中加參數(shù)verbosity可以控制錯(cuò)誤報(bào)告的詳細(xì)程度:默認(rèn)為1。0,表示不輸出每一個(gè)用例的執(zhí)行結(jié)果;2表示詳細(xì)的執(zhí)行報(bào)告結(jié)果。
【執(zhí)行結(jié)果】:輸出到控制臺(tái)
this setupclass() method only called once test_add (__main__.TestFunc) ... ok add: test_divide (__main__.TestFunc) ... ok divide test_minus (__main__.TestFunc) ... ok minus test_multi (__main__.TestFunc) ... ok multi this teardownclass() method only called once too ---------------------------------------------------------------------- Ran 4 tests in 0.000s OK3、TestSuite
上述簡單的測(cè)試會(huì)產(chǎn)生兩個(gè)問題,可不可以控制test測(cè)試用例的執(zhí)行順序?若不想執(zhí)行某個(gè)測(cè)試用例,有沒有辦法可以跳過?
對(duì)于執(zhí)行順序,默認(rèn)按照test的 A-Z、a-z的方法執(zhí)行。若要按自己編寫的用例的先后關(guān)系執(zhí)行,需要用到testSuite。
把多個(gè)測(cè)試用例集合起來,一起執(zhí)行,就是testSuite。testsuite還可以包含testsuite。
一般通過addTest()或者addTests()向suite中添加。case的執(zhí)行順序與添加到Suite中的順序是一致的。
例如:run_main.py
if __name__ == "__main__": suite = unittest.TestSuite() # 定義list,按照list里的順序執(zhí)行測(cè)試用例 tests=[TestFunc("test_add"),TestFunc("test_minus"),TestFunc("test_multi"),TestFunc("test_divide")] suite.addTests(tests) runner = unittest.TextTestRunner(verbosity=2) runner.run(suite)
TestSuite可以再包含testsuite,示例如下:
suite1 = module.TheTestSuite() suite2=module.TheTestSuite() alltests=unittest.TestSuite([suite1],[suite2])跳過某個(gè)case:skip裝飾器
若想讓某個(gè)測(cè)試用例不執(zhí)行,有沒有辦法呢?當(dāng)然是有的,可以使用skip裝飾器。
例如:
@unittest.skip("i don"t want to run this case -> test_minus() ... ") def test_minus(self): print("minus") self.assertEqual(3,minus(5,2))
加上“@unittest.skip()”后,執(zhí)行看看,對(duì)比控制臺(tái)的輸出結(jié)果就可以明顯看出區(qū)別了。
Skip裝飾器有如下幾種情況:
(1)skip():無條件跳過
@unittest.skip("i don"t want to run this case. ")
(2)skipIf(condition,reason):如果condition為true,則 skip
@unittest.skipIf(condition,reason)
(3)skipUnless(condition,reason):如果condition為False,則skip
@unittest.skipUnless(condition,reason)
(4)還可以使用TestCase.skipTest(reason)。例如:
def test_divide(self): self.skipTest("do not run test_divide()") print("divide") self.assertEqual(2,divide(4,2))
控制臺(tái)輸出(部分):
test_divide (__main__.TestFunc) ... skipped "do not run test_divide()"4、TestLoader
TestLoadder用來加載TestCase到TestSuite中。
loadTestsFrom*()方法從各個(gè)地方尋找testcase,創(chuàng)建實(shí)例,然后addTestSuite,再返回一個(gè)TestSuite實(shí)例。
該類提供以下方法:
unittest.TestLoader().loadTestsFromTestCase(testCaseClass) unittest.TestLoader().loadTestsFromModule(module) unittest.TestLoader().loadTestsFromName(name,module=None) unittest.TestLoader().loadTestsFromNames(names,module=None) unittest.TestLoader().getTestCaseNames(testCaseclass) unittest.TestLoader().discover()
TestLoader 之discover:
用discover()來加載測(cè)試多個(gè)測(cè)試用例,再用TextRunner類的run()方法去一次執(zhí)行多個(gè)腳本的用例,達(dá)到批量執(zhí)行的效果。
discover方法里面有三個(gè)參數(shù):
-case_dir:這個(gè)是待執(zhí)行用例的目錄。
-pattern:這個(gè)是匹配腳本名稱的規(guī)則,test*.py意思是匹配test開頭的所有腳本。
-top_level_dir:這個(gè)是頂層目錄的名稱,一般默認(rèn)等于None就行了。
TextTestRunner():執(zhí)行測(cè)試用例。runner.run(test)會(huì)執(zhí)行TestSuite、TestCase中的run(result)方法。
如下:run_main.py示例
import unittest import os # 用例的路徑 case_path = os.path.join(os.getcwd(),"case") # 報(bào)告存放的路徑 report_path = os.path.join(os.getcwd(),"report") def all_cases(): discover= unittest.defaultTestLoader.discover(case_path,pattern="test*.py",top_level_dir=None) print(discover) return discover if __name__ == "__main__": runner = unittest.TextTestRunner(verbosity=2) runner.run(all_cases())5、生成測(cè)試報(bào)告
生成TXT測(cè)試報(bào)告
代碼示例:
if __name__ == "__main__": suite = unittest.TestSuite() # 生成.txt的測(cè)試報(bào)告(控制臺(tái)的輸出寫入到文件中) suite.addTests(unittest.TestLoader().loadTestsFromTestCase(TestFunc)) with open("UnittestTextReport.txt","a") as f: runner = unittest.TextTestRunner(stream=f,verbosity=2) runner.run(suite)
可以看到在目錄下,生成了UnittestTextReport.txt文件。
但是txt格式的文件太過于簡陋。我們可以借助與第三方提供的庫來輸出更加形象的html報(bào)告,也可以自定義輸出自己想要格式的html格式的報(bào)告。
生成HTML測(cè)試報(bào)告
先下載HTMLTestRunner.py(注意Python的版本),
http://tungwaiyip.info/softwa... 。然后放在Python的Lib目錄下;
在run_main.py文件中加入:from HTMLTestRunner import HTMLTestRunner
HTMLTestRunner()方法有三個(gè)參數(shù):
--stream:測(cè)試報(bào)告寫入文件的存儲(chǔ)區(qū)域
--title:測(cè)試報(bào)告的主題
--description:測(cè)試報(bào)告的描述
代碼示例:
if __name__ == "__main__": suite = unittest.TestSuite() # 生成HTML格式的具體測(cè)試報(bào)告 with open("HtmlReport.html","wb") as f: # 在python3,要寫成"wb" or "wr" runner = HTMLTestRunner(stream=f,title="function test report",description="generated by HTMLTestRunner",verbosity=2) runner.run(suite)三、代碼示例
function.py
#!/usr/bin/python3 # -*- coding:utf-8 -*- def add(a,b): return a+b def minus(a,b): return a-b def multi(a,b): return a*b def divide(a,b): return a/b
Test_function.py
#!/usr/bin/python3 # -*- coding:utf-8 -*- import unittest from UnitTest_1.function import * # from..import ... :要指定文件的路徑 class TestFunc(unittest.TestCase): # unittest.TestCase # 如果想在所有case執(zhí)行之前準(zhǔn)備一次測(cè)試環(huán)境,并在所有case執(zhí)行結(jié)束后再清理環(huán)境 @classmethod def setUpClass(cls): print("this setupclass() method only called once") @classmethod def tearDownClass(cls): print("this teardownclass() method only called once too") # 測(cè)試方法均已test開頭,否則是不被unittest識(shí)別的 def test_add(self): print("add:") self.assertEqual(3,add(1,2)) def test_minus(self): print("minus") self.assertEqual(3,minus(5,2)) # 如果想臨時(shí)跳過某個(gè)case:skip裝飾器 @unittest.skip("i don"t want to run this case. ") def test_multi(self): print("multi") self.assertEqual(6,multi(2,3)) def test_divide(self): print("divide") self.assertEqual(2,divide(5,2)) if __name__ == "__main__": # 在main()中加verbosity參數(shù),可以控制輸出的錯(cuò)誤報(bào)告的詳細(xì)程度 # verbosity=*:默認(rèn)是1;設(shè)為0,則不輸出每一個(gè)用例的執(zhí)行結(jié)果;2-輸出詳細(xì)的執(zhí)行結(jié)果 unittest.main(verbosity=2)
Test_suite.py
#!/usr/bin/python3 # -*- coding:utf-8 -*- import unittest from UnitTest_1.test_function import TestFunc from HTMLTestRunner import HTMLTestRunner # 在Python3中已經(jīng)沒有 StringIO,所以引用的時(shí)候要注意 from io import StringIO if __name__ == "__main__": suite = unittest.TestSuite() # 定義list,按照list里的順序執(zhí)行測(cè)試用例 tests = [TestFunc("test_add"),TestFunc("test_minus"),TestFunc("test_multi"),TestFunc("test_divide")] suite.addTests(tests) """ runner = unittest.TextTestRunner(verbosity=2) runner.run(suite) """ # 生成.txt的測(cè)試報(bào)告(控制臺(tái)的輸出寫入到文件中) """ suite.addTests(unittest.TestLoader().loadTestsFromTestCase(TestFunc)) with open("UnittestTextReport.txt","a") as f: runner = unittest.TextTestRunner(stream=f,verbosity=2) runner.run(suite) """ # 生成HTML格式的具體測(cè)試報(bào)告 with open("HtmlReport.html","wb") as f: # 在python3,要寫成"wb" or "wr" runner = HTMLTestRunner(stream=f,title="function test report",description="generated by HTMLTestRunner",verbosity=2) runner.run(suite)
題外話:duang~ duang~ duang~ 周末啦~腦殼有點(diǎn)疼 肥家肥家 我愛工作 工作愛我
? thanks for watching, keep on updating...
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/42376.html
摘要:單元測(cè)試框架作為的標(biāo)準(zhǔn)庫,是其他單元測(cè)試框架的基礎(chǔ)??梢院秃团浜鲜褂镁帉憜卧獪y(cè)試。官網(wǎng)地址單元測(cè)試覆蓋率工具單元測(cè)試中還需要用到代碼覆蓋率工具。代碼覆蓋率統(tǒng)計(jì)工具用來發(fā)現(xiàn)沒有被測(cè)試覆蓋的代碼,完善單元測(cè)試的覆蓋率。 在應(yīng)用程序中,單元是具有一個(gè)或多個(gè)輸入和單個(gè)輸出的軟件中最小可測(cè)試部分。單元...
摘要:必然的,他們會(huì)拋棄標(biāo)準(zhǔn)庫中的,使用或者發(fā)明自己心儀的單元測(cè)試框架。究其原因,一些人會(huì)說時(shí)間寫代碼都不夠,哪還有空寫單元測(cè)試。最后我的個(gè)人觀點(diǎn),單元測(cè)試其實(shí)還有一個(gè)非常重要的作用,就是替代函數(shù)文檔注釋。希望從今天起,你的代碼也都有單元測(cè)試。 單元測(cè)試是每種編程語言必學(xué)的課題,是保護(hù)開發(fā)者的強(qiáng)力護(hù)盾,每個(gè)程序員都在時(shí)間允許的情況下盡可能多的寫單元測(cè)試,今天我們不討論其必要性,只拋磚引玉聊一...
摘要:本文將進(jìn)入單元測(cè)試的部分,這也是基礎(chǔ)知識(shí)中最后一個(gè)大塊。本文將重點(diǎn)講述和中的單元測(cè)試的生態(tài)環(huán)境。另外,在中指定要運(yùn)行的單元測(cè)試用例的完整語法是。中使用模塊管理單元測(cè)試用例。每個(gè)項(xiàng)目的單元測(cè)試代碼結(jié)構(gòu)可 本文將進(jìn)入單元測(cè)試的部分,這也是基礎(chǔ)知識(shí)中最后一個(gè)大塊。本文將重點(diǎn)講述Python和OpenStack中的單元測(cè)試的生態(tài)環(huán)境。 單元測(cè)試的重要性 github上有個(gè)人畫了一些不同語言的學(xué)...
摘要:有個(gè)模塊叫做,是的實(shí)現(xiàn),一個(gè)常用的單元測(cè)試框架。文件結(jié)構(gòu)我一般是把目錄和目錄平行放置。測(cè)試環(huán)境的搭建與還原用于測(cè)試環(huán)境的構(gòu)建,所有開始前執(zhí)行測(cè)試環(huán)境的還原,所有結(jié)束后執(zhí)行跳過某如果想跳過某暫不執(zhí)行,可以在該前加一個(gè) Python Unittest Unit test python 有個(gè)模塊叫做 unittes,是Junit的Python實(shí)現(xiàn),一個(gè)常用的單元測(cè)試框架。 文件結(jié)構(gòu) 我一般是...
摘要:每個(gè)測(cè)試方法的名稱以單詞開頭,單元測(cè)試是如何識(shí)別它們是測(cè)試的。它還意味著知道測(cè)試文件中有多少單元測(cè)試,而不是簡單地知道有多少表達(dá)式您可能已經(jīng)注意到將每個(gè)行作為單獨(dú)的測(cè)試計(jì)數(shù)。 showImg(https://segmentfault.com/img/remote/1460000019140153); 來源 | 愿碼(ChainDesk.CN)內(nèi)容編輯 愿碼Slogan | 連接每個(gè)程...
閱讀 3590·2019-08-30 15:55
閱讀 1387·2019-08-29 16:20
閱讀 3669·2019-08-29 12:42
閱讀 2675·2019-08-26 10:35
閱讀 1025·2019-08-26 10:23
閱讀 3422·2019-08-23 18:32
閱讀 914·2019-08-23 18:32
閱讀 2906·2019-08-23 14:55