前言
至於什么是ddt這個可以參考我之前寫的博客內容,使用ddt框架的時候,有個問題困擾我很久了,一直沒得到解決(也有很大小伙伴問過我,沒解決抱歉了!)
這個問題就是:如何使用ddt框架時,生成的html報告里面注釋能對每個用例傳入不同的說明?默認是固定寫死的內容。
最近剛好看到關於python的docstring【python筆記30-docstring注釋添加變量】(https://www.cnblogs.com/yoyoketang/p/9719147.html)相關知識,ddt源碼也讀了幾次,也思考了很多辦法去給docstring傳入變量內容,甚至使用裝飾器(decorator)都未能成功。一次偶然機會,代碼刪了一半,運行成功了,算是機緣巧合吧,然后靈光一閃打通了任督二脈!
遇到問題
首先說下之前使用ddt框架遺留的老問題
- 第一個問題是當測試用例數量大於10的時候,排序會是test_1,test_10, test_11,test_12, test_2, test_3, test_4這種
這個問題最近的ddt版本已經解決了 - 第二個問題是使用最新版本(Version: 1.2.0)生成html報告的時候出現dict() -> new empty dictionary dict(mapping)
這個問題是最新版的一個bug,解決辦法安裝1.1.2版本即可【python筆記31-使用ddt報告出現dict() -> new empty dictionary dict(mapping) 問題解決】 - 第三個問題是生成的html報告的注釋內容是寫死的,不能根據用例動態傳入
我們希望每個用例能動態傳入一個參數到html報告里
報告注釋傳變量
給docstring傳一個變量進去,代碼很簡單,但是不容易想到,格式參考:"""上海-悠悠:{0}"""
注意是三個雙引號,變量用{0}表示參數內容
import unittest
import ddt
# 測試數據
datas = [ {"user": "admin", "psw": "123", "result": "true"},
{"user": "admin1", "psw": "1234", "result": "true"},
{"user": "admin2", "psw": "1234", "result": "true"},
{"user": "admin3", "psw": "1234", "result": "true"},
{"user": "admin4", "psw": "1234", "result": "true"},
{"user": "admin5", "psw": "1234", "result": "true"},
{"user": "admin6", "psw": "1234", "result": "true"},
{"user": "admin7", "psw": "1234", "result": "true"},
{"user": "admin8", "psw": "1234", "result": "true"},
{"user": "admin9", "psw": "1234", "result": "true"},
{"user": "admin10", "psw": "1234", "result": "true"},
{"user": "admin11", "psw": "1234", "result": "true"}]
@ddt.ddt
class Test(unittest.TestCase):
@ddt.data(*datas)
def test_(self, d):
"""上海-悠悠:{0}"""
print("測試數據:%s" % d)
if __name__ == "__main__":
unittest.main()
這樣就能把測試數據傳入過來了
用例多個參數
上面那個案例是把測試數據放到字典里,用例里面穿一個d參數,需要的數據從字典里面去取
實際上也可以給用例傳多個參數,每組數據寫到一個元祖里,用裝飾器@ddt.upack解析出來
import unittest
import ddt
# 測試數據
# datas = [ {"user": "admin", "psw": "123", "result": "true"},
# {"user": "admin1", "psw": "1234", "result": "true"},
# {"user": "admin2", "psw": "1234", "result": "true"},
# {"user": "admin3", "psw": "1234", "result": "true"},
# {"user": "admin4", "psw": "1234", "result": "true"},
# {"user": "admin5", "psw": "1234", "result": "true"},
# {"user": "admin6", "psw": "1234", "result": "true"},
# {"user": "admin7", "psw": "1234", "result": "true"},
# {"user": "admin8", "psw": "1234", "result": "true"},
# {"user": "admin9", "psw": "1234", "result": "true"},
# {"user": "admin10", "psw": "1234", "result": "true"},
# {"user": "admin11", "psw": "1234", "result": "true"}]
datas =[("admin", "123", "true", "用例1描述"),
("admin1", "123", "true", "用例2描述"),
("admin2", "123", "true", "用例3描述"),
("admin3", "123", "true", "用例4描述"),
("admin4", "123", "true", "用例5描述"),
("admin5", "123", "true", "用例6描述"),
]
@ddt.ddt
class Test(unittest.TestCase):
@ddt.data(*datas)
@ddt.unpack
def test_(self, d1, d2, d3, d4):
"""上海-悠悠:{3}"""
print("測試數據:%s" % d1)
print("測試數據:%s" % d2)
print("測試數據:%s" % d3)
print("測試數據:%s" % d4)
if __name__ == "__main__":
unittest.main()
備注:使用unpack的時候,報告里面的備注會自動帶上參數:_admin____123____true____用例1描述 ,這點比較蛋疼了,還是建議用上面那個方法,參數放字典吧
轉載注明出處,謝謝各位了!作者:上海-悠悠,python自動化交流 QQ群:779429633