如何在pytest中测试类的继承方法

Bas*_*ian 9 python pytest

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。

如何TreeHouseis_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都将在它的子类中被发现,无需任何进一步的干预。