在pytest的文檔中,列出了測試用例的各種示例。 其中大多數顯示了功能測試。 但是我缺少一個有關如何測試類和類方法的示例。 假設我們要測試的模塊cool.py中具有以下類:
class SuperCool(object):
def action(self, x):
return x * x
tests/test_cool.py中的相應測試類應如何顯示?
python測開。class TestSuperCool():
def test_action(self, x):
pass
test_action()如何用于測試action()?
測試類方法所需要做的就是實例化該類,然后在該實例上調用該方法:
def test_action(self):
python定義函數后調用、sc = SuperCool()
assert sc.action(1) == 1
那么,pytest中不涉及任何映射嗎?
@laserbrain我不確定在這種情況下映射的含義,但是如果您嘗試的話,我的示例應該適用。
我的意思是方法test_action()映射到action()上,因此不需要實例化(例如自動魔術)。
@laserbrain,以及這個自動魔術師如何找出您要執行哪種斷言和檢查?顯式勝于隱式。
python 全局變量、@laserbrain我仍然沒有真正遵循,但是afaik在大多數情況下pytest會將類方法與普通頂級函數相同
@elethan我有一個類似于class TestSuperCool的類,但是該類具有類似于def test_action)的多個功能。當我直接運行pytest test_module.py::TestSuperCool::test_action時,它可以正常運行,并且我的測試通過了。但是,當我運行pytest test_module.py::TestSuperCool時,它會失敗。您知道如何在pytest中而不是每個測試函數中測試單個測試類嗎?
實際上沒有后顧之憂..我的ipython或Windows10上的ipython似乎有問題。似乎即使我執行%reset -s之后,它也不會重置或清除ipython中的名稱空間。當我在ipython中運行它時,這種情況反復發生。重新啟動ipython后,問題消失了。
好吧,一種方法是只在測試方法中創建對象并從那里與之交互:
def test_action(self, x):
o = SuperCool()
python set、assert o.action(2) == 4
您顯然可以使用以下方法使用經典的setup和teardown樣式單元測試之類的東西:http://doc.pytest.org/en/latest/xunit_setup.html
我不確定如何使用它們,因為pytest的文檔太糟糕了。
編輯:是的,如果您做類似的事情,那么顯然
class TestSuperCool():
def setup(self):
python類,self.sc = SuperCool()
...
# test using self.sc down here
我只會使用任何固定裝置來創建測試環境(例如數據庫連接)或數據參數化。
如果您的數據比較瑣碎,可以在測試用例中定義它:
def test_action_without_fixtures():
python list?sc = SuperCool()
sc.element = 'snow'
sc.melt()
assert sc.element == 'water'
參數化示例:
@pytest.mark.parametrize("element, expected", [('snow', 'water'), ('tin', 'solder')])
python doctest,def test_action_with_parametrization(element, expected):
sc = SuperCool()
sc.element = element
sc.melt()
assert sc.element == expected
如果類的初始化很昂貴,但是您需要在類方法上運行大量參數化測試,則可以更改方法定義以允許外部輸入。然后,您可以在測試循環外進行一次初始化,并根據需要在方法上運行任意數量的測試。例如:
python unittest。代替這個:
class SuperCool():
def action(self):
return self.attribute ** 2
重寫以允許外部輸入:
class SuperCool():
python exception,def action(self, x=None):
if x is None:
x = self.attribute
return x ** 2
現在,您的測試腳本如下所示:
sc = SuperCool()
python strip、@pytest.mark.parametrize("x, y", [(1, 1), (2, 4)])
def test_action_with_parametrization(x, y):
assert sc.action(x) == y
但是我不是一個經驗豐富的程序員,所以希望這不是某種反模式的XD
版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。
工作时间:8:00-18:00
客服电话
电子邮件
admin@qq.com
扫码二维码
获取最新动态