house.py
:
class House:
def is_habitable(self):
return True
def is_on_the_ground(self):
return True
conftest.py
:
import pytest
from house import House
@pytest.fixture(scope='class')
def house():
return House()
test_house.py
:
class TestHouse:
def test_habitability(self, house):
assert house.is_habitable()
def test_groundedness(self, house):
assert house.is_on_the_ground()
到目前为止,一切都在测试中。
现在我添加一个子类并覆盖house.py
中的方法:
class House:
def is_habitable(self):
return True
def is_on_the_ground(self):
return True
class TreeHouse(House):
def is_on_the_ground(self):
return False
我还在conftest.py
中为该类添加了一个新的灯具:
import pytest
from house import House
from house import TreeHouse
@pytest.fixture(scope='class')
def house():
return House()
@pytest.fixture(scope='class')
def tree_house():
return TreeHouse()
我在test_house.py
中为树屋添加了一个新的测试类:
class TestHouse:
def test_habitability(self, house):
assert house.is_habitable()
def test_groundedness(self, house):
assert house.is_on_the_ground()
class TestTreeHouse:
def test_groundedness(self, tree_house):
assert not tree_house.is_on_the_ground()
此时,代码有效,但有些情况未经过测试。例如,要完成,我需要再次测试House
中从TreeHouse
继承的方法。
从TestHouse
重写相同的测试不会是DRY。
如何在不重复代码的情况下测试TreeHouse
的继承方法(在本例中为is_habitable
)?
我希望使用与其超类运行相同的测试来重新测试TreeHouse
,而不是重新测试新的或重写的方法/属性。
我对 pytest 的方式感兴趣。请参考文档并解释这是如何适用的。
答案 0 :(得分:4)
执行此操作的一种方法是对所有测试方法使用夹具名称house
(即使它正在测试TreeHouse
)和override its value in each test context:
class TestTreeHouse(TestHouse):
@pytest.fixture
def house(self, tree_house):
return tree_house
def test_groundedness(self, house):
assert not house.is_on_the_ground()
另请注意TestTreeHouse
继承自TestHouse
。由于pytest merely enumerates methods of classes(即没有“注册”完成,例如,@pytest.test()
装饰器),TestHouse
中定义的所有测试都将在其子类中发现,无需任何进一步干预。
答案 1 :(得分:0)
您可以使用pytest parameterization将多个参数传递给同一个测试,在这种情况下,参数很可能是正在测试的类。