run - unittest python 3
La secuencia de comandos de prueba unitaria devuelve el código de salida=0 incluso si las pruebas fallan (2)
Mi script de prueba se ve de la siguiente manera:
import os
import sys
from unittest import defaultTestLoader as loader, TextTestRunner
path_to_my_project = os.path.dirname(os.path.abspath(__file__)) + ''/../''
sys.path.insert(0, path_to_my_project)
suite = loader.discover(''my_project'')
runner = TextTestRunner()
runner.run(suite)
Si ejecuto este script, el resultado es:
$ python3 runtest.py
.....F.....
======================================================================
FAIL: test_insert (fate.test.test_operators.OperatorTest)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/home/chiel/Projects/tfate/libs/fate/../fate/test/test_operators.py", line 16, in test_insert
self.assertEqual(expected, self.session.text[:14])
AssertionError: ''Foo import sys$'' != ''Foo import sys''
- Foo import sys$
? -
+ Foo import sys
----------------------------------------------------------------------
Ran 12 tests in 0.030s
FAILED (failures=1)
Y salir del código cero:
$ echo $?
0
Sin embargo, los documentos de python indican que "Por defecto, las llamadas principales sys.exit()
con un código de salida que indica el éxito o el fracaso de las pruebas se ejecutan".
¿Qué pasa con mi script?
El código no está usando unittest.main
. TestResult.wasSuccessful
verificar el resultado utilizando TestResult.wasSuccessful
y llamar a sys.exit
manualmente.
import sys
....
ret = not runner.run(suite).wasSuccessful()
sys.exit(ret)
Tuve algunos problemas para obtener los resultados de TextTestRunner
. Para aquellos como yo, así es como funciona:
"""Run all tests inside of *_test.py modules located in the same directory."""
import sys
import unittest
if __name__ == ''__main__'':
test_suite = unittest.defaultTestLoader.discover(''.'', ''*_test.py'')
test_runner = unittest.TextTestRunner(resultclass=unittest.TextTestResult)
result = test_runner.run(test_suite)
sys.exit(not result.wasSuccessful())