一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

腳本之家,腳本語言編程技術(shù)及教程分享平臺(tái)!
分類導(dǎo)航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務(wù)器之家 - 腳本之家 - Python - 基于Python的接口自動(dòng)化unittest測試框架和ddt數(shù)據(jù)驅(qū)動(dòng)詳解

基于Python的接口自動(dòng)化unittest測試框架和ddt數(shù)據(jù)驅(qū)動(dòng)詳解

2021-08-30 00:15那年故鄉(xiāng)的明月 Python

這篇文章主要介紹了基于Python的接口自動(dòng)化unittest測試框架和ddt數(shù)據(jù)驅(qū)動(dòng)詳解,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

引言

在編寫接口自動(dòng)化用例時(shí),我們一般針對一個(gè)接口建立一個(gè).py文件,一條接口測試用例封裝為一個(gè)函數(shù)(方法),但是在批量執(zhí)行的過程中,如果其中一條出錯(cuò),后面的用例就無法執(zhí)行,還有在運(yùn)行大量的接口測試用例時(shí)測試數(shù)據(jù)如何管理和加載。針對測試用例加載以及執(zhí)行控制,python語言提供了unittest單元測試框架,將測試用例編寫在unittest框架下,使用該框架可以單個(gè)或者批量加載互不影響的用例執(zhí)行及更靈活的執(zhí)行控制,對于更好的進(jìn)行測試數(shù)據(jù)的管理和加載,這里我們引入數(shù)據(jù)驅(qū)動(dòng)的模塊:ddt,測試數(shù)據(jù)和測試腳本的分離,通過ddt數(shù)據(jù)驅(qū)動(dòng)來加載測試數(shù)據(jù)到測試用例腳本中,通常在接口自動(dòng)化測試中會(huì)將unittest和ddt結(jié)合起來使用,從而實(shí)現(xiàn)測試用例腳本和測試數(shù)據(jù)的載入來完成測試的執(zhí)行。下面來看看unittest框架和ddt這兩個(gè)模塊具體的應(yīng)用。

一、unittest測試框架

unittest單元測試框架是python語言的一套標(biāo)準(zhǔn)模塊,封裝提供了諸多操作測試用例和用例加載、測試前置和場景恢復(fù)以及測試結(jié)果輸出等一系列類和方法。

1.unittest框架中最核心四個(gè)組件概念:

(1)testcase:測試用例類,編寫測試用例腳本時(shí)需要繼承該類,從而具有該類的屬性和方法,一個(gè)testcase實(shí)例就是一個(gè)測試用例,其中測試用例方法都以test開頭。

(2)testsuite:測試集,也就是測試用例的集合,用來組織用例。

(3)testrunner:用來執(zhí)行測試用例,并返回測試用例的執(zhí)行結(jié)果,可以用圖形或者文本將測試結(jié)果形象地展現(xiàn)出來,htmltestrunner用來生成圖形化的報(bào)告,texttestrunner用來生成簡單的文本測試結(jié)果。

(4)testfixure:測試夾件,主要用于測試用例的前置初始化和執(zhí)行后的銷毀。

2.testcase----測試用例

  • 新建一個(gè)的.py測試用例文件必須是test開頭,如test_login.py,主要后續(xù)用于識(shí)別測試用例文件編寫測試用例的類,必須繼承unittest.testcase,做為測試類
  • 測試類中用例的方法名稱必須以test開頭,用于識(shí)別測試用例數(shù)
  • 測試類中的用例執(zhí)行順序,按照以test開頭的方法后的ascill碼順序執(zhí)行(0~9,a~z,a~z)

3.testfixure----測試夾件

  • 也叫測試夾具,主要是用例前置的初始化以及執(zhí)行后的銷毀
  • 測試夾件提供兩種方法,一種是類級別的:setup()和teardown(),一種是方法級別的:setupclass()和teardownclass()
  • 類級別的測試夾件,每一條測試用例執(zhí)行之前與之后都要運(yùn)行一次setup()和teardown();方法級別的測試夾件,所有測試用例執(zhí)行之前到執(zhí)行完成只運(yùn)行一次setupclass()和teardownclass()

下面通過簡單的代碼示例看看testcase與testfixure的使用

(1)使用setup()和teardown(),創(chuàng)建test_666.py文件編輯如下代碼:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import unittest
 
class test_unittest(unittest.testcase):
 def setup(self):
  print("測試環(huán)境初始化,開始執(zhí)行setup")
 
 def teardown(self):
  print("測試執(zhí)行完成,運(yùn)行teardown")
  print("------------------------------")
 def test_a(self):
  print("開始執(zhí)行test_a用例")
 
 def test_a(self):
  print("開始執(zhí)行test_a用例")
 
 def test_1(self):
  print("開始執(zhí)行test_1用例")
 
 def notest_1(self):
  print("不執(zhí)行notest_1用例")
 
if __name__ == "__main__":
 unittest.main()

執(zhí)行后,輸出如下:

基于Python的接口自動(dòng)化unittest測試框架和ddt數(shù)據(jù)驅(qū)動(dòng)詳解

在代碼中我們編寫了4個(gè)def用例方法,只執(zhí)行了3個(gè)def,因?yàn)樽詈笠粋€(gè)def不是test開頭??梢钥吹矫繄?zhí)行一個(gè)def用例,setup()和teardown()都會(huì)執(zhí)行一次,其中按照執(zhí)行順序:test_1最先執(zhí)行,test_a其后,test_a最后執(zhí)行

(2)使用setupclass()和teardownclass()

對于setupclass()和teardownclass()我們只需將上面代碼,稍微修改即可

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import unittest
 
class test_unittest(unittest.testcase):
 @classmethod
 def setupclass(cls):
  print("測試環(huán)境初始化,開始執(zhí)行setup")
 @classmethod
 def teardownclass(cls):
  print("測試執(zhí)行完成,運(yùn)行teardown")
  print("------------------------------")
 def test_a(self):
  print("開始執(zhí)行test_a用例")
 
 def test_a(self):
  print("開始執(zhí)行test_a用例")
 
 def test_1(self):
  print("開始執(zhí)行test_1用例")
 
if __name__ == "__main__":
 unittest.main()

 運(yùn)行效果如下:

可以看到所有用例都執(zhí)行完后,setupclass()和teardownclass()只運(yùn)行了一次。因此在編寫一個(gè)測試腳本時(shí),里面寫了多個(gè)測試用例,

這時(shí)我們希望的是所有用例執(zhí)行完成后再銷毀環(huán)境,這時(shí)使用setupclass()teardownclass()就比較好了。

基于Python的接口自動(dòng)化unittest測試框架和ddt數(shù)據(jù)驅(qū)動(dòng)詳解

3.testsuite----測試集

unittest框架下提供了unittest.testsuite()和unittest.testloader()類,這兩個(gè)類下封裝了加載用例的方法,用于加載測試用例到測試集中

(1)unittest.testsuite()提供單個(gè)用例加載方法

addtest():單個(gè)用例加載,當(dāng)然也可以將多個(gè)用例的方法名放入列表中添加到addtest()中,加載多條測試用例

(2)unittest.testloader()提供批量加載或發(fā)現(xiàn)用例的方法

loadtestsfromtestcase(測試類名):添加一個(gè)測試類
loadtestsfrommodule(模塊名):添加一個(gè)模塊
discover(測試用例的所在目錄):指定目錄去加載,會(huì)自動(dòng)尋找這個(gè)目錄下所有符合命名規(guī)則的測試用例

4.testrunner----測試運(yùn)行

testrunner就是用來執(zhí)行測試用例的,并且可以生成相應(yīng)的測試報(bào)告。測試報(bào)告有兩種展示形式,一種是text文本,一種是html格式。
?html格式的就是htmltestrunner了,htmltestrunner是python標(biāo)準(zhǔn)庫的unittest框架的一個(gè)擴(kuò)展,它可以生成一個(gè)直觀清晰的html測試報(bào)告。使用的前提就是要下載htmltestrunner.py,下載完后放在python的安裝目錄下的scripts目錄下即可。

通過代碼示例看看testsuite和testrunner這兩個(gè)組件的使用,上面的test_666.py用例文件我們已經(jīng)寫好了3條用例了,現(xiàn)在我們來加載這些用例

新建run_case.py文件,該文件和test_666.py文件放置在同一個(gè)包文件:test下,run_case.py文件編輯如下代碼運(yùn)行:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import unittest
from test.test_666 import test_unittest
 
# 單個(gè)用例加載
suite = unittest.testsuite()
case1 = test_unittest('test_1')
case2 = test_unittest('test_a')
suite.addtest(case1)
suite.addtest(case2)
print(suite)
print("------------------")
# 批量用例加載
case_path = r"e:\api_test\test"
# 按文件路徑加載,注意該文件為包文件即文件下有__init__.py
all_case = unittest.defaulttestloader.discover(case_path,pattern="test_666*.py",top_level_dir=none)
all_case1 = unittest.defaulttestloader.loadtestsfromtestcase(test_unittest) # 按類名稱加載
print(all_case)
print("------------------")
print(all_case1)

 輸出結(jié)果如下:

e:\api_test\scripts\python.exe e:/api_test/test_bak/run_case.py
<unittest.suite.testsuite tests=[<test.test_666.test_unittest testmethod=test_1>, <test.test_666.test_unittest testmethod=test_a>]>
------------------
<unittest.suite.testsuite tests=[<unittest.suite.testsuite tests=[<unittest.suite.testsuite tests=[<test_666.test_unittest testmethod=test_1>, <test_666.test_unittest testmethod=test_a>, <test_666.test_unittest testmethod=test_a>]>]>]>
------------------
<unittest.suite.testsuite tests=[<test.test_666.test_unittest testmethod=test_1>, <test.test_666.test_unittest testmethod=test_a>, <test.test_666.test_unittest testmethod=test_a>]>
 
process finished with exit code 0

 通過unittest框架下提供的加載用例的諸多方法,我們就可以單個(gè)或者批量加載用例,后續(xù)可以將加載的用例集引入到htmltestrunner.py模塊生成可視化的測試報(bào)告

5.assert----測試斷言

無論是什么樣的測試用例,最后都需要有用例執(zhí)行后的驗(yàn)證,在接口自動(dòng)化測試中我們執(zhí)行完接口用例也需要驗(yàn)證斷言用例執(zhí)行是否滿足我們的預(yù)期。unittest提供了豐富的斷言方法,常見的斷言如下表:

基于Python的接口自動(dòng)化unittest測試框架和ddt數(shù)據(jù)驅(qū)動(dòng)詳解

二、ddt數(shù)據(jù)驅(qū)動(dòng)

  • @ddt:類的裝飾器,繼承的是testcase類
  • @data():@data裝飾符可以把參數(shù)當(dāng)成測試數(shù)據(jù),參數(shù)可以是單個(gè)值、列表、元祖、字典這些類型,用于輸入測試數(shù)據(jù)
  • @unpack:分解數(shù)據(jù)標(biāo)志,主要是把元祖和列表解析成多個(gè)參數(shù)
  • @file_data():輸入文件,如json或者yaml類型文件

(1)輸入簡單的參數(shù):單個(gè)值、列表、元祖、字典

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import unittest
from ddt import data,unpack,ddt
 
@ddt
class myddt(unittest.testcase):
 
 @data("123")    # 單個(gè)值
 def test1(self,testdata1):
  print(testdata1)
  print("------------------")
 
 @data([1,2,3],[4,5,6]) # 列表
 def test2(self,testdata2):
  print(testdata2)
  print("------------------")
"""
 @data((1, 2, 3))   # 元組
 def test2(self, testdata3):
  print(testdata3)
  print("------------------")
 
 @data({'zhangshan':1,'wangwu':2,'lisi':3}) # 字典
 def test2(self, testdata4):
  print(testdata4)
  print("------------------")
"""
if __name__ == '__main__':
  unittest.main()

?。?)使用@unpack對復(fù)雜數(shù)據(jù)結(jié)構(gòu),如元組、列表數(shù)據(jù)進(jìn)行分解

代碼示例:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import unittest
from ddt import data,unpack,ddt
 
@ddt
class myddt(unittest.testcase):
 
 @data([1,2],[3,4]) # 列表
 @unpack
 def test2(self, testdata1,testdata2):
  print("拆解的第一個(gè)參數(shù):",testdata1)
  print("拆解的第二個(gè)參數(shù):", testdata2)
  print("------------------")
 
if __name__ == '__main__':
  unittest.main()

 運(yùn)行后輸出如下:

基于Python的接口自動(dòng)化unittest測試框架和ddt數(shù)據(jù)驅(qū)動(dòng)詳解

(3)使用@file_data()輸入文件格式測試數(shù)據(jù)

編輯一個(gè)data.json的文件,代碼示例:

?
1
2
3
4
5
6
7
8
9
10
11
12
import unittest
from ddt import file_data,ddt
 
@ddt
class myddt(unittest.testcase):
 
 @file_data(r"e:\api_test\test\data.json")
 def test1(self, *value):
  print(value)
 
if __name__ == '__main__':
  unittest.main()

 通過ddt和unittest框架的結(jié)合就可以實(shí)現(xiàn)測試用例腳本編寫、測試執(zhí)行控制以及測試數(shù)據(jù)的批量加載,從而完成不同接口測試用例的批量執(zhí)行和覆蓋測試不同測試場景。

到此這篇關(guān)于基于python的接口自動(dòng)化unittest測試框架和ddt數(shù)據(jù)驅(qū)動(dòng)詳解的文章就介紹到這了,更多相關(guān)python的接口自動(dòng)化ddt數(shù)據(jù)驅(qū)動(dòng)內(nèi)容請搜索服務(wù)器之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持服務(wù)器之家!

原文鏈接:https://www.cnblogs.com/tdp0108/p/14303054.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 日本成日本片人免费 | 喜马拉雅听书免费版 | 日韩精选视频 | 5x视频在线观看 | 亚洲第一综合网站 | 秋霞午夜视频在线观看 | 四虎地址8848aa4hc44四虎 四虎成人永久地址 | 乳环调教| 日本一区二区三区久久精品 | 秋葵丝瓜茄子草莓榴莲樱桃 | 国产麻豆精品原创 | 国自产精品手机在线视频 | 亚洲AV久久久久久久无码 | 亚洲 欧美 日韩 国产 视频 | 欧美精品一区二区在线观看播放 | 欧美一级特黄特色大片免费 | 天天天天天天天操 | 大胆人gogo888体艺术在线 | 九九精品免视频国产成人 | 日本一区二区免费在线 | 91网红福利精品区一区二 | 果冻传媒九一制片厂 | 久久91精品国产91 | 天堂网在线.www天堂在线资源 | 欧美日韩视频在线一区二区 | 无码毛片内射白浆视频 | 久久伊人精品青青草原2021 | 91久久偷偷做嫩草影院免费 | 2018天天拍拍拍免费视频 | 国产精品第1页在线播放 | 国产精自产拍久久久久久 | 91精品国产亚洲爽啪在线影院 | 女人把私密部位张开让男人桶 | 日本免费三片在线播放 | 亚洲精品国产自在现线最新 | 美女翘臀跪床被打屁股作文 | 久久中文字幕亚洲精品最新 | 99精品影院 | 福利片成人午夜在线 | 国产高清视频在线 | 日本在线视 |