house.py:
class House:
def is_habitable(self):
return True
def is_on_the_ground(self):
return True
Run Code Online (Sandbox Code Playgroud)
conftest.py:
import pytest
from house import House
@pytest.fixture(scope='class')
def house():
return House()
Run Code Online (Sandbox Code Playgroud)
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()
Run Code Online (Sandbox Code Playgroud)
到那时,一切都在测试中。
现在我添加一个子类并覆盖一个方法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
Run Code Online (Sandbox Code Playgroud)
我还为该类添加了一个新装置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()
Run Code Online (Sandbox Code Playgroud)
我为树屋添加了一个新的测试类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()
Run Code Online (Sandbox Code Playgroud)
在这一点上,代码可以工作,但有些情况没有经过测试。例如,要完成,我需要再次测试从Housein继承的方法TreeHouse。
从 重写相同的测试TestHouse不会是 DRY。
如何TreeHouse在is_habitable不复制代码的情况下测试(在这种情况下)的继承方法?
我想TreeHouse用它的超类运行的相同测试重新测试它,但不是新的或覆盖的方法/属性。
经过一些研究,我发现了矛盾的来源。在深入研究 pytest 文档后,我无法理解适用于这种情况的内容。
我对pytest方法很感兴趣。请参考文档并解释如何在此处应用。
the*_*man 10
一种方法是house对所有测试方法使用夹具名称(即使它正在测试 a TreeHouse),并在每个测试上下文中覆盖其值:
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()
Run Code Online (Sandbox Code Playgroud)
还要注意TestTreeHouse继承自TestHouse. 由于pytest 仅枚举类的方法(即没有“注册”,比如@pytest.test()装饰器),所有在 中定义的测试TestHouse都将在它的子类中被发现,无需任何进一步的干预。