python unittest如何進行參數化?
圖中,如何對其中的url、account和password進行參數化,具體如何實現?
一般就加到setUp裡面就行了,將參數賦給http://self.XXX,然後在測試例裡面用那個值。如果這些參數經常調整,可以放到一個外部的yaml或者json文件裡面,然後在setUp過程中,先json.load,然後賦值給self:
import os.path
import json
(...)
def setUp(self):
defaultconfig = {"base_url": "xxxxx",
"account": "xxx",
"password": "xxx}
try:
import tests
rootdir = tests.__path__[0]
config = json.load(os.path.join(rootdir, "config.json"))
defaultconfig.update(config)
except Exception as exc:
print("Load config error: ", str(exc))
# raise
# or, continue with default config
for k,v in defaultconfig.items():
setattr(self, k, v)
def test1(self):
# Use parameter
connect(self.base_url)
(...)
上面的代碼中,我們用tests模塊的路徑作為根目錄,載入tests/config.json,用其中的參數覆蓋defaultconfig。如果找不到配置文件則用代碼中的默認配置。
讀取配置文件是一種方式,python操作yaml文件很方便,比xml什麼的方便很多
可以使用第三方模塊ddt
將數據存入yaml或json文件,用file_data裝飾器即可
pytest 大法好
天滅unitest, 棄 xUnit 保平安
人在做 天在看 照抄 Java成禍患
fixture 一出天地滅 parametrize 保平安誠心誠念 assert 好 智能diff平安保眾生皆為 pythonic 來 插件太多忘前緣pythonista說真相 叫你測試莫拒絕早日擺脫 unittest/nose , 早日獲得新生
Parametrizing tests
Parametrize with fixturesimport pytest
from datetime import datetime, timedelta
testdata = [
(datetime(2001, 12, 12), datetime(2001, 12, 11), timedelta(1)),
(datetime(2001, 12, 11), datetime(2001, 12, 12), timedelta(-1)),
]
@pytest.mark.parametrize("a,b,expected", testdata)
def test_timedistance_v0(a, b, expected):
diff = a - b
assert diff == expected
樓主,你知道答案了嗎?我也想請教這個問題!謝謝
對了 你的數據要弄成可以配置的,放在一個文件裡面,不要直接寫死在代碼裡面。這種是設計模式的一種動態代理模式。用流讀數據去取,你以後就修改一次配置文件數據就變成很多其他case了。
推薦閱讀: