Desabilitar temporariamente testes individuais de unidade Python

128

Como os testes de unidade individuais podem ser temporariamente desabilitados ao usar o unittestmódulo em Python?

coelhudo
fonte

Respostas:

229

Métodos ou classes de teste individuais podem ser desativados usando o unittest.skipdecorador.

@unittest.skip("reason for skipping")
def test_foo():
    print('This is foo test case.')


@unittest.skip  # no reason needed
def test_bar():
    print('This is bar test case.')

Para outras opções, consulte os documentos para Ignorar testes e falhas esperadas .

yoni
fonte
9
Em Python 3, a resposta de Akif abaixo @unittest.SkipTestobras e não@unittest.skip
lifebalance
7
Estou usando o Python 3.6.1 e @unittest.skiptambém funciona bem.
Pete
2
O @Pete, no Python 3.4.0, @unittest.skipnão funciona.
lifebalance
Como impedir que as classes filho sejam puladas?
reubenjohn
A anotação seria aplicada apenas a um único método de teste. Você pretende ter uma classe pai com métodos de teste e apenas algumas classes filho têm o método desativado? Eu imagino que isso seja possível, embora você possa precisar projetar as classes pai / filho adequadamente. Você pode explicar o cenário que está tentando resolver com um exemplo de brinquedo?
Yoni
26

Você pode usar decoradores para desativar o teste que pode envolver a função e impedir que o teste de unidade googletest ou python execute o testcase.

def disabled(f):
    def _decorator():
        print f.__name__ + ' has been disabled'
    return _decorator

@disabled
def testFoo():
    '''Foo test case'''
    print 'this is foo test case'

testFoo()

Resultado:

testFoo has been disabled
GTM
fonte
11

A versão mais recente (2.7 - não lançada) suporta teste / desativação de teste dessa forma . Você pode obter este módulo e usá-lo em sua instalação existente do Python. Provavelmente vai funcionar.

Antes disso, eu usei para renomear os testes que eu queria ignorados para xtest_testnamepartir test_testname.


Aqui está um script elisp rápido para fazer isso. Meu elisp está um pouco enferrujado, então peço desculpas antecipadamente por qualquer problema que ele tenha. Não testado.

  (defun disable_enable_test ()
  (interactive "")
  (save-excursion
    (beginning-of-line)
    (search-forward "def")
    (forward-char)
    (if (looking-at "disable_")
    (zap-to-char 1 ?_)
      (insert "disable_"))))
Noufal Ibrahim
fonte
+1, mas em todo o projeto que eu estou trabalhando todo mundo está usando python v2.6.2, e eu não acho que isso vai mudar: /, mas é uma solução, graças
coelhudo
Você pode ajustar o seu editor um pouco para dar-lhe uma macro para ativar / a testcase disable mas falo como um usuário Emacs assim ... :)
Noufal Ibrahim
Também sou usuário do Emacs, você criou uma macro?
coelhudo
Não. Eu apenas os deixei falhar, mas não é tão difícil. Atualizei a resposta com uma rapidinha.
Noufal Ibrahim
Esta resposta aceita não é uma resposta, apenas um link. A resposta real e atual também não é a mais votada. É verdade que tem 4 anos. O elisp gratuito apenas ofusca.
jwd630
10

Basta colocar o @unittest.SkipTestdecorador acima do teste.

Akif
fonte
Eu não sei quem fez isso. Mas, eu estava lendo a documentação e diz que o SkipTest é uma exceção. De qualquer forma, é diferente de unittest.skip no sentido de que ignorar nunca executa o teste (desativando-o), enquanto o objetivo do SkipTest deve ser aumentado se algo não esperado ocorrer durante a execução do teste. Estou certo? Interessante difícil.
coelhudo
unittest.skip(sem razão) me dá erro em Python 2, mas não em Python 3.
Akif
5

Acabei de renomear um método de caso de teste com um sublinhado: test_myfunc torna-se _test_myfunc.

MattK
fonte
3

Os documentos para 2.1 não especificam um método de ignorar ou ignorar.

Normalmente, porém, eu bloqueio comentários quando necessário.

Finglas
fonte
1

Focalizando a parte "temporariamente desativada" da pergunta, a melhor resposta depende um pouco do caso de uso. O caso de uso que me trouxe aqui é que estou desenvolvendo um teste em uma função. Nesse processo, escrevo sucessivamente testes e frequentemente uso pontos de interrupção na função para depuração. Se eu apenas executar todos os testes toda vez que o executar, acabarei parando nos pontos de interrupção dos testes que já funcionam. Adicionar "pular" ou colocar o nome do teste ou algo assim não é o que eu quero, porque quando terminar de escrever a função, desejo que todos os testes sejam executados. Se eu usasse "pular", teria que voltar e "desatar".

Para o meu caso de uso, a solução está no executor de teste, não no código de teste. Eu uso pytest . Com o pytest, é fácil especificar um único teste na linha de comando:

pytest PYTHON_FILENAME.TEST_CLASS.TEST_NAME

(substitua as tampas pelos seus valores).

Eu entendo que essa pergunta era para python-unitest. Eu não uso isso há muito tempo. Eu não ficaria surpreso se tivesse algo semelhante ao pytest. Caso contrário, você pode facilmente mudar para pytest. Você não precisa modificar seu código. Basta instalá-lo e alterar o comando do executor de teste.

Além disso, eu uso o PyCharm Pro. Na página que mostra meu código de teste, há um pequeno ícone ao lado do def para cada teste. Eu posso clicar nesse ícone e executar esse teste individualmente.

Mandril
fonte