Em nossa equipe, definimos a maioria dos casos de teste como este:
Uma classe "framework" ourtcfw.py
:
import unittest
class OurTcFw(unittest.TestCase):
def setUp:
# something
# other stuff that we want to use everywhere
e muitos casos de teste como testMyCase.py:
import localweather
class MyCase(OurTcFw):
def testItIsSunny(self):
self.assertTrue(localweather.sunny)
def testItIsHot(self):
self.assertTrue(localweather.temperature > 20)
if __name__ == "__main__":
unittest.main()
Quando estou escrevendo um novo código de teste e quero executá-lo com frequência e economizar tempo, o que faço é colocar "__" na frente de todos os outros testes. Mas é complicado, me distrai do código que estou escrevendo e o ruído de confirmação que isso cria é claramente irritante.
Então, por exemplo, ao fazer alterações testItIsHot()
, quero poder fazer isso:
$ python testMyCase.py testItIsHot
e unittest
correram apenas testItIsHot()
Como posso conseguir isso?
Tentei reescrever a if __name__ == "__main__":
peça, mas como sou novo no Python, estou me sentindo perdido e continuo me baseando em tudo o que não seja nos métodos.
fonte
__init__.py
dentro desse diretório (e subdividindo, se houver) e chamando, por exemplo.python test/testMyCase.py test.MyCase.testItIsHot
.Se você organizar seus casos de teste, siga a mesma organização como o código real e também use importações relativas para módulos no mesmo pacote
Você também pode usar o seguinte formato de comando:
Documentação do Python3 para isso: https://docs.python.org/3/library/unittest.html#command-line-interface
fonte
Pode funcionar bem como você imagina
E há outra maneira de apenas testar
testItIsHot
:fonte
Se você verificar a ajuda do módulo mais unido, ele informará sobre várias combinações que permitem executar classes de caso de teste de um módulo e métodos de teste de uma classe de caso de teste.
Não requer que você defina a
unittest.main()
como o comportamento padrão do seu módulo.fonte
usage
é até estranhamente inconsistente): runningpython -m unittest module_test.TestClass.test_method
assume um arquivomodule_test.py
(executado no diretório atual; e não__init.py__
é necessário); e contém que contém (isso também funciona para mim em python 2.7.13)module_test.py
class TestClass(unittest.TestCase)...
def test_method(self,...)
Talvez seja útil para alguém. Caso você queira executar apenas testes de uma classe específica:
Funciona para mim no python 3.6
fonte
Inspirado por @yarkee , combinei-o com parte do código que já recebi. Você também pode chamar isso de outro script, apenas chamando a função
run_unit_tests()
sem a necessidade de usar a linha de comando ou apenas a partir da linha de comandopython3 my_test_file.py
.Infelizmente isso só funciona para
Python 3.3
ou superior:Código do corredor:
Editando um pouco o código, você pode passar em uma matriz com todos os testes de unidade que deseja chamar:
E outro arquivo:
Como alternativa, você pode usar https://docs.python.org/3/library/unittest.html#load-tests-protocol e definir o seguinte método no seu módulo / arquivo de teste:
Se você deseja limitar a execução a um único arquivo de teste, basta definir o padrão de descoberta de teste como o único arquivo em que você definiu a
load_tests()
função.Referências:
Como alternativa ao último exemplo de programa principal, criei a seguinte variação depois de ler a
unittest.main()
implementação do método:fonte
TL; DR : Isso provavelmente funcionaria:
A explicação :
A maneira conveniente
funcionaria, mas sua suposição tácita é que você já possui esse trecho de código convencional dentro (normalmente no final de) do seu arquivo de teste.
A maneira inconveniente
sempre funcionaria, sem exigir que você tenha esse
if __name__ == "__main__": unittest.main()
trecho de código no arquivo de origem do teste.Então, por que o segundo método é considerado inconveniente? Porque seria uma dor no (_ insira uma parte do seu corpo aqui _) digitar manualmente esse caminho longo e delimitado por pontos. Enquanto no 1º método, a
mypkg/tests/test_module.py
peça pode ser concluída automaticamente, por um shell moderno ou pelo seu editor.PS: Se você pensou que essa parte do corpo está em algum lugar abaixo da sua cintura, você é uma pessoa autêntica. :-) Quero dizer "articulação do dedo". Digitar em excesso seria ruim para as articulações. ;-)
fonte