Como testar métodos herdados de uma classe no 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()
Até esse ponto, tudo está sendo testado.
Agora eu adiciono uma subclasse e substituo um método emhouse.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
Também adiciono um novo acessório para essa classe emconftest.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()
Eu adiciono uma nova classe de teste para casa na árvore emtest_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()
Nesse ponto, o código funciona, mas há casos que não são testados. Por exemplo, para ser completo, eu precisaria testar novamente os métodos herdados deHouse
noTreeHouse
.
Reescrevendo os mesmos testes doTestHouse
não seria SECO.
Como faço para testar o método herdado deTreeHouse
(nesse casois_habitable
) sem duplicar o código?
Eu gostaria de algo como testar novamente oTreeHouse
com os mesmos testes pelos quais sua superclasse é executada, mas não para os métodos / propriedades que são novos ou substituídos.
Depois de algumas pesquisas, me deparei com fontes contraditórias. E depois de pesquisar na documentação do pytest, não entendi o que se aplica a esse cenário.
Estou interessado nopytest maneira de fazer isso. Consulte os documentos e explique como isso se aplica aqui.