Atualmente, tenho alguns testes de unidade que compartilham um conjunto comum de testes. Aqui está um exemplo:
import unittest
class BaseTest(unittest.TestCase):
def testCommon(self):
print 'Calling BaseTest:testCommon'
value = 5
self.assertEquals(value, 5)
class SubTest1(BaseTest):
def testSub1(self):
print 'Calling SubTest1:testSub1'
sub = 3
self.assertEquals(sub, 3)
class SubTest2(BaseTest):
def testSub2(self):
print 'Calling SubTest2:testSub2'
sub = 4
self.assertEquals(sub, 4)
if __name__ == '__main__':
unittest.main()
A saída do acima é:
Calling BaseTest:testCommon
.Calling BaseTest:testCommon
.Calling SubTest1:testSub1
.Calling BaseTest:testCommon
.Calling SubTest2:testSub2
.
----------------------------------------------------------------------
Ran 5 tests in 0.000s
OK
Existe uma maneira de reescrever o que testCommon
foi dito acima para que o primeiro não seja chamado?
Edição: Em vez de executar 5 testes acima, eu quero executar apenas 4 testes, 2 do SubTest1 e outros 2 do SubTest2. Parece que o Python unittest está executando o BaseTest original por conta própria e preciso de um mecanismo para impedir que isso aconteça.
python
unit-testing
testing
Thierry Lam
fonte
fonte
Respostas:
Use herança múltipla, para que sua classe com testes comuns não herda de TestCase.
fonte
setUp
etearDown
métodos paraCommonTests
classe, e você quer que eles sejam chamados para cada teste em classes derivadas, você tem que inverter a ordem das classes de base, de modo que ele vai ser:class SubTest1(CommonTests, unittest.TestCase)
.unittest.TestCase
eCommonTests
. Eu acho que osetUpClass
método abaixo é o melhor e é menos propenso a erros humanos. Isso ou agrupar a classe BaseTest em uma classe de contêiner que é um pouco mais invasiva, mas evita a mensagem de ignorar na impressão da execução de teste.CommonTests
está invocando métodos que não existem nessa classe.Não use herança múltipla, ela o morderá mais tarde .
Em vez disso, você pode simplesmente mover sua classe base para o módulo separado ou envolvê-la com a classe em branco:
A saída:
fonte
Você pode resolver esse problema com um único comando:
Portanto, o código ficaria assim:
fonte
self.assert*
métodos não existem em um objeto padrão.super( BaseTest, cls ).setUpClass( )
BaseTest
pode ser referenciado pelas subclassessuper(self.__class__, self)
ou apenassuper()
nas subclasses, embora aparentemente não se você fosse herdar construtores . Talvez exista também uma alternativa "anônima" quando a classe base precisar fazer referência a si mesma (não que eu tenha alguma idéia de quando uma classe precisar fazer referência a si mesma).A resposta de Matthew Marshall é ótima, mas requer que você herde de duas classes em cada um dos seus casos de teste, o que é propenso a erros. Em vez disso, eu uso isso (python> = 2.7):
fonte
O que você está tentando alcançar? Se você tiver um código de teste comum (asserções, testes de gabarito etc.), coloque-os em métodos que não sejam prefixados
test
paraunittest
não carregá-los.fonte
A resposta de Matthew é a que eu precisava usar, pois ainda estou com 2,5. Mas a partir da versão 2.7, você pode usar o decorador @ unittest.skip () em qualquer método de teste que você queira pular.
http://docs.python.org/library/unittest.html#skipping-tests-and-expected-failures
Você precisará implementar seu próprio decorador de pulos para verificar o tipo de base. Não usei esse recurso antes, mas em cima da minha cabeça você poderia usar o BaseTest como marcador tipo de para condicionar o salto:
fonte
Uma maneira de pensar em resolver isso é ocultando os métodos de teste se a classe base for usada. Dessa forma, os testes não são ignorados; portanto, os resultados podem ser verdes em vez de amarelos em muitas ferramentas de relatórios de testes.
Comparado ao método mixin, ide como o PyCharm não vai reclamar que os métodos de teste de unidade estão faltando na classe base.
Se uma classe base herdar dessa classe, ela precisará substituir os métodos
setUpClass
etearDownClass
.fonte
Você pode adicionar
__test_ = False
na classe BaseTest, mas, se adicionar, lembre-se de que deve adicionar__test__ = True
classes derivadas para poder executar testes.fonte
Outra opção é não executar
Em vez disso, você pode usar
Então você só executa os testes na classe
TestClass
fonte
unittest.main()
coletado no conjunto padrão, você forma um conjunto explícito e executa seus testes.Eu fiz o mesmo que @Vladim P. ( https://stackoverflow.com/a/25695512/2451329 ), mas modifiquei um pouco:
e lá vamos nós.
fonte
No Python 3.2, você pode adicionar uma função test_loader a um módulo para controlar quais testes (se houver) são encontrados pelo mecanismo de descoberta de testes.
Por exemplo, o seguinte carregará apenas os pôsteres
SubTest1
eSubTest2
casos de teste originais , ignorandoBase
:Deveria ser possível iterar
standard_tests
(aTestSuite
contendo os testes encontrados pelo carregador padrão) e copiar tudo, excetoBase
parasuite
, mas a natureza aninhadaTestSuite.__iter__
torna isso muito mais complicado.fonte
Apenas renomeie o método testCommon para outra coisa. O Unittest (geralmente) pula qualquer coisa que não tenha 'teste'.
Rápido e simples
fonte
Portanto, esse é um tipo de tópico antigo, mas me deparei com esse problema hoje e pensei em meu próprio truque. Ele usa um decorador que torna os valores das funções None quando acessados através da classe base. Não precisa se preocupar com setup e setupclass porque, se a classe base não tiver testes, ela não será executada.
fonte
Altere o nome do método BaseTest para setUp:
Resultado:
A partir da documentação :
fonte
setUp
?test...
método,setUp
é executada repetidamente, uma vez por esse método; portanto, não é uma boa ideia colocar testes lá!