unitarias tutorial pruebas descargar unit-testing code-organization

unit testing - tutorial - Pruebas unitarias con dependencias entre pruebas.



phpunit tutorial (5)

De acuerdo con las mejores prácticas y los principios de prueba de unidad, la prueba de unidad no debe depender de otras.

Cada caso de prueba debe verificar el comportamiento aislado concreto.

Luego, si falla algún caso de prueba, sabrá exactamente qué fue lo que falló en nuestro código.

¿Cómo se hace la prueba unitaria cuando tienes

  • algunas pruebas unitarias generales
  • Pruebas más sofisticadas que verifican casos de borde, dependiendo de los generales.

Para dar un ejemplo, imagine probar un lector de CSV (acabo de crear una notación para la demostración)

def test_readCsv(): ... @dependsOn(test_readCsv) def test_readCsv_duplicateColumnName(): ... @dependsOn(test_readCsv) def test_readCsv_unicodeColumnName(): ...

Espero que las subpruebas se ejecuten solo si su prueba principal es exitosa. La razón detrás de esto es que la ejecución de estas pruebas lleva tiempo. Muchos informes de fallas que se remontan a una sola razón tampoco serían informativos. Por supuesto, podría encajar todos los casos de borde en la prueba principal, pero me pregunto si hay una forma más estructurada de hacerlo.

He encontrado estas preguntas relacionadas pero diferentes,

ACTUALIZAR:

He encontrado TestNG que tiene un gran soporte integrado para dependencias de prueba. Puedes escribir pruebas como esta,

@Test{dependsOnMethods = ("test_readCsv")) public void test_readCsv_duplicateColumnName() { ... }


He implementado un complemento para Nose (Python) que agrega soporte para dependencias de prueba y priorización de prueba.

Como se mencionó en las otras respuestas / comentarios, esto suele ser una mala idea, sin embargo, puede haber excepciones en las que querría hacer esto (en mi caso, fue el rendimiento para las pruebas de integración, con una gran sobrecarga para entrar en un estado comprobable, minutos vs horas).

Lo podéis encontrar aquí: nosedep .

Un ejemplo mínimo es:

def test_a: pass @depends(before=test_a) def test_b: pass

Para asegurarse de que test_b siempre se ejecute antes de test_a .


No estoy seguro de a qué idioma se refiere (ya que no lo menciona específicamente en su pregunta) pero para algo como PHPUnit hay una etiqueta @depends que solo ejecutará una prueba si la prueba dependiente ya ha pasado .

Dependiendo de qué idioma o prueba de unidad utilice, también puede haber algo similar disponible


Personalmente, no me preocuparía crear dependencias entre pruebas unitarias. Esto me suena como un poco de olor a código. Algunos puntos:

  • Si una prueba falla, deje que los demás no lo logren y obtenga una buena idea de la escala del problema que hizo el cambio de código adverso.
  • Las fallas en las pruebas deben ser la excepción y no la norma, entonces, ¿por qué desperdiciar el esfuerzo y crear dependencias cuando la gran mayoría de las veces (¡con suerte!) No se obtiene ningún beneficio? Si las fallas ocurren con frecuencia, su problema no es con las dependencias de prueba de unidad, sino con fallas de prueba frecuentes.
  • Las pruebas unitarias deben ejecutarse realmente rápido. Si se están ejecutando lentamente, entonces centre sus esfuerzos en aumentar la velocidad de estas pruebas en lugar de prevenir fallas posteriores. Haga esto mediante el desacoplamiento de su código y utilizando la inyección de dependencia o la burla.

Proboscis es una versión de Python de TestNG (que es una biblioteca de Java).

Ver packages.python.org/proboscis/

Es compatible con dependencias, por ejemplo,

@test(depends_on=[test_readCsv]) public void test_readCsv_duplicateColumnName() { ... }