如何测试课程' pytest中继承的方法

时间:2017-09-04 15:46:03

标签: python pytest

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文档之后,我无法理解适用于此场景的内容。

我对 pytest 的方式感兴趣。请参考文档并解释这是如何适用的。

2 个答案:

答案 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将多个参数传递给同一个测试,在这种情况下,参数很可能是正在测试的类。