在上一篇Python接口自動(dòng)化測(cè)試系列文章:Python接口自動(dòng)化淺析requests請(qǐng)求封裝原理,主要通過(guò)源碼分析,總結(jié)出一套簡(jiǎn)潔的請(qǐng)求類封裝。
以下主要介紹unittest特性、運(yùn)行流程及實(shí)際案例。
按照階段來(lái)分,一般就是單元測(cè)試,集成測(cè)試,系統(tǒng)測(cè)試,驗(yàn)收測(cè)試。
單元測(cè)試是對(duì)單個(gè)模塊、單個(gè)類或者單個(gè)函數(shù)進(jìn)行測(cè)試。
將訪問(wèn)接口的過(guò)程封裝在函數(shù)里面;
接口測(cè)試就變成了單元測(cè)試;
單元測(cè)試就是通過(guò)傳參,對(duì)某個(gè)模塊、某個(gè)類、某個(gè)函數(shù)進(jìn)行結(jié)果輸出后驗(yàn)證的測(cè)試。
1.單元測(cè)試之后,才是集成測(cè)試,單個(gè)的功能模塊測(cè)試通過(guò)之后,才能把單個(gè)功能模塊集成起來(lái)做集成測(cè)試,為了從底層發(fā)現(xiàn)bug,減少合成后出現(xiàn)的問(wèn)題。
2.越早發(fā)現(xiàn)bug越好,否則問(wèn)題累計(jì)到后期,如果做錯(cuò)了就要推倒重來(lái),對(duì)于時(shí)間和人力成本來(lái)說(shuō)非常耗費(fèi)精力。
對(duì)于我們測(cè)試來(lái)說(shuō):單元測(cè)試是為了執(zhí)行測(cè)試用例。
Python里有兩個(gè)單元測(cè)試類:
1.Unittest(Python自帶);
2.Pytest(下載安裝);
前者多用于接口自動(dòng)化項(xiàng)目用,后者多用于WEB自動(dòng)化項(xiàng)目、APP自動(dòng)化項(xiàng)目。
unittest是Python自帶的單元測(cè)試框,具備編寫用例、組織用例、執(zhí)行用例、輸出報(bào)告等自動(dòng)化框架的條件,可以用來(lái)作自動(dòng)化測(cè)試框架的用例組織執(zhí)行框架。
unittest框架的特性:
unittest單元測(cè)試中最核心的四個(gè)部分是:
TestCase
(測(cè)試用例)
TestSuite
(測(cè)試套件)
TestRunner
(測(cè)試運(yùn)行器)
TestFixture
(測(cè)試環(huán)境數(shù)據(jù)準(zhǔn)備和清理)
一個(gè)TestCase的實(shí)例就是一個(gè)測(cè)試用例。什么是測(cè)試用例呢?就是一個(gè)完整的測(cè)試流程。包括測(cè)試前準(zhǔn)備環(huán)境的搭建(setUp)、實(shí)現(xiàn)測(cè)試過(guò)程的代碼(run),以及測(cè)試后環(huán)境的還原(tearDown)。
單元測(cè)試(Unittest)的本質(zhì)也就在這里,一個(gè)測(cè)試用例就是一個(gè)完整的測(cè)試單元,通過(guò)運(yùn)行這個(gè)測(cè)試單元,可以對(duì)某一個(gè)功能進(jìn)行驗(yàn)證。
一個(gè)功能的驗(yàn)證往往需要多個(gè)測(cè)試用例,可以把多個(gè)測(cè)試用例集合在一起執(zhí)行,這就產(chǎn)生了測(cè)試套件TestSuite的概念。TestSuite用來(lái)組裝單個(gè)測(cè)試用例??梢酝ㄟ^(guò)addTest加載TestCase到TestSuite中,從而返回一個(gè)TestSuite實(shí)例。
而且TestSuite也可以嵌套TestSuite。
用來(lái)加載TestCase到TestSuite中的,其中l(wèi)oadTestsFrom__()方法用于尋找TestCase,并創(chuàng)建它們的實(shí)例,然后添加到TestSuite中,返回TestSuite實(shí)例;
用來(lái)執(zhí)行測(cè)試用例,其中run(test)會(huì)執(zhí)行TestSuite/TestCase中的run(result)方法,并將測(cè)試結(jié)果保存到TextTestResult實(shí)例中,包括運(yùn)行了多少測(cè)試用例,成功多少,失敗多少等信息;
一個(gè)測(cè)試用例的初始化準(zhǔn)備及環(huán)境還原,主要是setUp() 和 tearDown()方法;
比如說(shuō)在測(cè)試用例中需要訪問(wèn)數(shù)據(jù)庫(kù),那么可以在setUp()中建立數(shù)據(jù)庫(kù)連接以及進(jìn)行一些初始化,
在tearDown()中清除在數(shù)據(jù)庫(kù)中產(chǎn)生的數(shù)據(jù),然后關(guān)閉連接。
注意tearDown的過(guò)程很重要,要為以后的TestCase留下一個(gè)干凈的環(huán)境。
unittest的靜態(tài)類圖:
大體流程:編寫TestCase,由TestLoader加載TestCase到TestSuite,然后由TextTestRunner來(lái)運(yùn)行TestSuite,最后將運(yùn)行的結(jié)果保存在TextTestResult中。
1.導(dǎo)入unittest模塊、 被測(cè)文件或者其中的類;
2.創(chuàng)建一個(gè)測(cè)試類,并繼承unittest.TestCase方法;
3.重寫setUp和tearDown方法(如果有初始化條件和結(jié)束條件)。若setup()成功運(yùn)行,無(wú)論測(cè)試方法是否成功,都會(huì)運(yùn)行tearDown ();
4.定義測(cè)試函數(shù),函數(shù)名以test_開頭,以識(shí)別測(cè)試用例;
5.調(diào)用unittest.main()方法運(yùn)行測(cè)試用例;
6.用例執(zhí)行后,需要判斷用例是Pass還是Fail,可以用unittest.TestCase模塊的:斷言
斷言就是比對(duì)預(yù)期結(jié)果。如果不加斷言,沒有結(jié)果對(duì)比,需要手動(dòng)去檢查運(yùn)行的結(jié)果是否符合預(yù)期。
1.要想使用unittest單元測(cè)試框架,必須得先導(dǎo)入:import unittest
2.查看unittest源碼;
import unittest print(help(unittest))
從打印結(jié)果中提取出unittest簡(jiǎn)易的例子:
import unittest class IntegerArithmeticTestCase(unittest.TestCase): def testAdd(self): # test method names begin with 'test' self.assertEqual((1 + 2), 3) self.assertEqual(0 + 1, 1) def testMultiply(self): self.assertEqual((0 * 10), 0) self.assertEqual((5 * 8), 40) if __name__ == '__main__': unittest.main()
看了官方代碼后,我們自己寫個(gè)例子熟悉下,并總結(jié)出規(guī)律:
import unittest class TestDemo(unittest.TestCase): # test_sub用例 def test_sub(self): self.assertEqual(2-1,1) # test_add用例 def test_add(self): self.assertEqual(2+1,3) if __name__ == "__main__": # unittest.main()是運(yùn)行主函數(shù) unittest.main(verbosity=2)
運(yùn)行結(jié)果為:
test_add (__main__.TestDemo) ... ok
test_sub (__main__.TestDemo) ... ok
----------------------------------------------------------------------
Ran 2 tests in 0.000s
OK
接下來(lái),我們來(lái)總結(jié)一些規(guī)律:
如下,在測(cè)試用例中寫入斷言:
import unittest #測(cè)試MathMethod類 class TestMathMethod(unittest.TestCase): #編寫測(cè)試用例 def test_add_two_positive(self): #測(cè)試兩個(gè)正數(shù)相加 res=MathMethod(1,1).add() print("1+1的結(jié)果是:",res) self.assertEqual(2,res,"兩個(gè)正數(shù)相加出錯(cuò)!") #斷言 def test_add_two_zero(self): #測(cè)試兩個(gè)0相加 res = MathMethod(0, 0).add() print("0+0的結(jié)果是:", res) self.assertEqual(0, res, "兩個(gè)0相加出錯(cuò)!") #斷言 def test_add_two_negative(self): #測(cè)試兩個(gè)負(fù)數(shù)相加 res = MathMethod(-1, -1).add() print("-1+(-1)的結(jié)果是:", res) self.assertEqual(-2, res, "兩個(gè)負(fù)數(shù)相加出錯(cuò)!") #斷言 if __name__ == '__main__': unittest.main()
測(cè)試用例里面的setUp函數(shù)與tearDown函數(shù)的使用:
class TestMathMethod(unittest.TestCase): def setUp(self): print("開始準(zhǔn)備執(zhí)行測(cè)試用例!") def tearDown(self): print("結(jié)束!") #編寫測(cè)試用例 def test_add_two_positive(self): #測(cè)試兩個(gè)正數(shù)相加 res=MathMethod(1,1).add() print("1+1的結(jié)果是:",res)
setUp函數(shù):初始化環(huán)境(執(zhí)行每條用例之前,都要執(zhí)行setUp函數(shù)下面的代碼,每次都要執(zhí)行);
tearDown函數(shù):清洗環(huán)境(執(zhí)行每條用例之后,都要執(zhí)行tearDown函數(shù)下面的代碼,每次都要執(zhí)行);
setUp()、tearDown()是TestCase里的方法,寫在測(cè)試類中,就是方法的重寫。
執(zhí)行順序是:setUp->testA->tearDown->setUp->testB>tearDown
當(dāng)測(cè)試用例全部寫完,但是只想執(zhí)行其中部分,可以使用TestSuit()來(lái)收集測(cè)試用例。
import unittest from xxx import xxx #測(cè)試用例的類 suite=unittest.TestSuit() suite.addTest(測(cè)試用例的類("用例名稱1")) #用例名稱用字符串的形式傳入 suite.addTest(測(cè)試用例的類("用例名稱2")) suite.addTest(測(cè)試用例的類("用例名稱3")) .....
一次性加載測(cè)試用例類名1下的所有用例。
import unittest from xxx import xxx #測(cè)試用例的類 suite=unittest.TestSuit() loader=unittest.TestLoader() suite.addTest(loader.loadTestsFromTestCase(測(cè)試用例類名1)) #測(cè)試用例類名直接傳入
一次性加載測(cè)試用例模塊名下的所有用例。
import unittest from xxx import xxx #測(cè)試用例模塊 suite=unittest.TestSuit() loader=unittest.TestLoader() suite.addTest(loader.loadTestsFromTestCase(測(cè)試用例模塊名)) #測(cè)試用例模塊名直接傳入
TextTestRunner是一個(gè)以文本形式展示測(cè)試結(jié)果的測(cè)試運(yùn)行程序類
stream 輸出報(bào)告的路徑,默認(rèn)輸出控制臺(tái);
verbosity 控制輸出報(bào)告的詳細(xì)程度,從0-2,越來(lái)越詳細(xì);
file:
文件
verbosity:
詳細(xì)程度
title:
標(biāo)題
description:
描述
tester:
作者
with open("接口測(cè)試報(bào)告.html","wb") as file: runner = HTMLTestRunnerNew.HTMLTestRunner(stream=file, verbosity=2, title="接口自動(dòng)化測(cè)試報(bào)告", description="接口測(cè)試V1", tester="ITester軟件測(cè)試小棧") runner.run(suite)
import unittest import HTMLTestRunnerNew all_testcases=unittest.defaultTestLoader.discover(contants.testcases_dir, pattern='test_*.py',top_level_dir=None) #利用上下文管理器自動(dòng)關(guān)閉資源 with open(contants.reports_html,"wb+") as file: #選擇絕對(duì)路徑,把文件打開,寫進(jìn)內(nèi)容 (報(bào)告的文件名直接寫在路徑里面) runner=HTMLTestRunnerNew.HTMLTestRunner(stream=file, title="接口自動(dòng)化測(cè)試報(bào)告", description="接口測(cè)試V1", tester="ITester軟件測(cè)試小棧") runner.run(all_testcases)
到此這篇關(guān)于Python接口自動(dòng)化淺析unittest單元測(cè)試原理的文章就介紹到這了,更多相關(guān)Python接口自動(dòng)化unittest單元測(cè)試內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
標(biāo)簽:漯河 南平 盤錦 寧夏 普洱 海南 林芝 大同
巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Python接口自動(dòng)化淺析unittest單元測(cè)試原理》,本文關(guān)鍵詞 Python,接口,自動(dòng)化,淺析,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。