Ejecutar una única prueba desde unittest.TestCase a través de la línea de comando

Resuelto Alois Mahdal asked hace 11 años • 9 respuestas

En nuestro equipo, definimos la mayoría de los casos de prueba de esta manera:

Una clase "marco" ourtcfw.py:

import unittest

class OurTcFw(unittest.TestCase):
    def setUp:
        # Something

    # Other stuff that we want to use everywhere

Y muchos casos de prueba 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()

Cuando escribo un nuevo código de prueba y quiero ejecutarlo con frecuencia y ahorrar tiempo, pongo "__" delante de todas las demás pruebas. Pero es engorroso, me distrae del código que estoy escribiendo y el ruido de confirmación que esto crea es simplemente molesto.

Entonces, por ejemplo, al realizar cambios en testItIsHot(), quiero poder hacer esto:

$ python testMyCase.py testItIsHot

y solounittest he corrido testItIsHot()

¿Cómo puedo lograr eso?

Intenté reescribir la if __name__ == "__main__":parte, pero como soy nuevo en Python, me siento perdido y sigo atacando todo lo demás excepto los métodos.

Alois Mahdal avatar Apr 12 '13 19:04 Alois Mahdal
Aceptado

Esto funciona como usted sugiere: solo debe especificar también el nombre de la clase:

python testMyCase.py MyCase.testItIsHot
phihag avatar Apr 12 '2013 12:04 phihag

Si organiza sus casos de prueba, es decir, sigue la misma organización que el código real y también usa importaciones relativas para módulos en el mismo paquete, también puede usar el siguiente formato de comando:

python -m unittest mypkg.tests.test_module.TestClass.test_method

# In your case, this would be:
python -m unittest testMyCase.MyCase.testItIsHot

Documentación de Python 3 para esto: Interfaz de línea de comandos

Ajay M avatar Oct 23 '2014 15:10 Ajay M

Puede funcionar bien como supones.

python testMyCase.py MyCase.testItIsHot

Y hay otra manera de simplemente probar testItIsHot:

    suite = unittest.TestSuite()
    suite.addTest(MyCase("testItIsHot"))
    runner = unittest.TextTestRunner()
    runner.run(suite)
Yarkee avatar Apr 12 '2013 12:04 Yarkee

Si consulta la ayuda del módulo unittest, le informará sobre varias combinaciones que le permitirán ejecutar clases de casos de prueba desde un módulo y métodos de prueba desde una clase de caso de prueba.

python3 -m unittest -h

[...]

Examples:
  python3 -m unittest test_module               - run tests from test_module
  python3 -m unittest module.TestClass          - run tests from module.TestClass
  python3 -m unittest module.Class.test_method  - run specified test method
```lang-none

It does not require you to define a `unittest.main()` as the default behaviour of your module.

skqr avatar Mar 26 '2017 13:03 skqr

TL;DR : Es muy probable que esto funcione:

python mypkg/tests/test_module.py MyCase.testItIsHot

La explicación :

  • La manera conveniente

      python mypkg/tests/test_module.py MyCase.testItIsHot
    

    funcionaría, pero se supone tácitamente que ya tiene este fragmento de código convencional dentro (normalmente al final) de su archivo de prueba.

    if __name__ == "__main__":
        unittest.main()
    
  • La manera inconveniente

      python -m unittest mypkg.tests.test_module.TestClass.test_method
    

    siempre funcionaría, sin necesidad de tener ese if __name__ == "__main__": unittest.main()fragmento de código en su archivo fuente de prueba.

Entonces, ¿por qué se considera inconveniente el segundo método? Porque sería complicado <insertar una de las partes de tu cuerpo aquí> escribir a mano ese largo camino delimitado por puntos. Mientras que en el primer método, la mypkg/tests/test_module.pyparte se puede completar automáticamente, ya sea mediante un shell moderno o mediante su editor.

RayLuo avatar Nov 14 '2019 19:11 RayLuo