Eu tenho um método python 2.7 que às vezes chama
sys.exit(1)
É possível fazer um teste de unidade que verifica se esta linha de código é chamada quando as condições certas são atendidas?
python
unit-testing
Urso Travis
fonte
fonte
Respostas:
Sim.
sys.exit
aumentosSystemExit
, então você pode verificar comassertRaises
:As instâncias de
SystemExit
têm um atributocode
que é definido para o status de saída proposto e o gerenciador de contexto retornado porassertRaises
possui a instância de exceção capturada comoexception
, portanto, verificar o status de saída é fácil:Documentação sys.exit :
fonte
sys.exit(1)
(ao contrário de, digamos,sys.exit(0)
) que você precisa para realmente afirmar a suacode
é 1. Eu acho que você poderia fazer isso comassertRaisesRegexp(SystemExit, '1')
?unittest
método que permite passar uma exceção e um predicado que pode ser chamado para executar na exceção ou em seus args, em vez de apenas um padrão regex para executar na representação de string de seu primeiro arg ... mas acho que não. Existe algum outro módulo de teste em que estou pensando?self.assertRaisesRegex( SystemExit, '^2$', testMethod )
Menos código, legível o suficiente.self.assertRaisesRegexp
Aqui está um exemplo de trabalho completo. Apesar da excelente resposta de Pavel, demorei um pouco para descobrir isso, então estou incluindo aqui na esperança de que seja útil.
fonte
Encontrei a resposta para sua pergunta na documentação do Python Unit Testing, procure "Testing for Exceptions". Usando seu exemplo, o teste de unidade ficaria assim:
Lembre-se de incluir todos os argumentos necessários para testar sua função.
fonte
Como uma observação adicional à excelente resposta de Pavel, você também pode verificar se há status específicos se eles forem fornecidos na função que você está testando. Por exemplo, se
your_method()
contiver o seguintesys.exit("Error")
, seria possível testar especificamente para "Erro":fonte