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 fixtures

import 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了。


推薦閱讀:

TAG:Python | 自動化測試 | 參數化設計 |