JUnit 4 vs TestNG - Actualización 2013 - 2014 [cerrado]

88

JUnit 4 y TestNG solían ser comparables. ¿Cuáles son los pros y los contras de los dos marcos de prueba?

ctekk
fuente
Si está mirando la comparación de funciones, hay un buen artículo de mkyong sobre jUnit 4 Vs testNG Si desea consultar la comparación de uso. ¡Hay un buen artículo de Kapil Hope que ayuda!
Anshu
71
Encuentro preguntas como esta extremadamente útiles en SO ... Quería agradecerles por tomar el riesgo de preguntarlas y felicitaciones por no haberlas cerrado.
user1445967
Camino a seguir en contra de los gustos de su audiencia: D
ctekk
2
Volviendo a ver esta pregunta después de tantos años. Lo curioso es que huelo a conspiración. Mi pregunta se centró completamente en diferentes funcionalidades, luego hubo una edición de "comunidad" que editó mi pregunta a "pros y contras" y luego la pregunta se cerró debido a opiniones. Lmao.
ctekk

Respuestas:

29

Hoy estaba comparando TestNG y JUnit4, y la principal ventaja que puedo señalar con mi limitada experiencia en testing-frameworks es que TestNG tiene una forma más elegante de manejar pruebas parametrizadas con el concepto de proveedor de datos.

Por lo que puedo decir, con JUnit4, debe crear una clase de prueba separada para cada conjunto de parámetros con los que desea probar (ejecutar @RunWith(Parameterized.class)). Con TestNG puede tener varios proveedores de datos en una sola clase de prueba, por lo que también puede mantener todas sus pruebas para una sola clase en una sola clase de prueba.

Hasta ahora, eso es lo único que puedo señalar como un beneficio de TestNG sobre JUnit4.

Intellij IDEA incluye soporte para TestNG y JUnit listo para usar. Sin embargo, Eclipse solo admite JUnit listo para usar y necesita un complemento TestNG instalado para que funcione.

Sin embargo, un problema más molesto que encontré con TestNG es que sus clases de prueba deben extenderse PowerMockTestCasesi está utilizando PowerMock para simular dependencias en sus pruebas. Aparentemente, hay formas de configurar la fábrica de objetos que su marco de prueba necesita conocer cuando usa PowerMock a través de un método especial, o mediante la testng.xmldefinición de la suite, pero esas parecen estar rotas en este momento. No me gusta que las clases de prueba extiendan las clases del marco de prueba, parece hack.

Si no usa PowerMock, esto no es un problema, por supuesto, pero en general tengo la impresión de que JUnit4 es mejor compatible.

JeroenHoek
fuente
5
No es que existan implementaciones alternativas de pruebas parametrizadas, por ejemplo code.google.com/p/junitparams Y si no te gusta ninguna de ellas, puedes escribir las tuyas propias, eso es lo que me gusta de la extensibilidad de JUnit. ;)
Esko Luontola
17

Según mi experiencia con ambos marcos, testng tiene algunas características convenientes que el equipo de JUnit se ha negado a implementar durante varios años. Lo prefiero a JUnit por esta razón. Convertir a testng es fácil ya que básicamente es compatible con casi todo en JUnit (incluso hay un complemento de conversión para eclipse), volver a convertir a JUnit no es tan bueno debido a estas características faltantes.

  • En testng, los @BeforeClassmétodos no son estáticos y se ejecutan antes de que se ejecuten las pruebas en esa clase en lugar de cuando se carga la clase de prueba (el comportamiento JUnit). Una vez tuve un proyecto JUnit en el que todas las pruebas de la base de datos (unas pocas docenas) inicializaron la base de datos desde el principio, lo que fue un comportamiento bastante idiota. Hubo mucho debate a favor y en contra de esto en la comunidad JUnit. La esencia de esto era que cada método de prueba debería tener su propio accesorio de prueba y, por lo tanto, no debería tener un método de estilo beforeAll que no sea estático porque eso le permitiría establecer furtivamente una variable de instancia una vez y luego usarla en todas sus pruebas. Válido, pero realmente molesto para las pruebas de integración. TestNG ofrece a los usuarios la opción aquí. Junit no lo hace, por diseño, lo cual es molesto.

  • Los proveedores de datos de prueba son un poco más flexibles que el equivalente de JUnit. Puede especificar por prueba qué método de proveedor de datos debe proporcionar la entrada en lugar de tener un enfoque único para toda la clase como en JUnit. Por lo tanto, puede tener proveedores de datos de casos positivos y negativos para sus pruebas en una clase. Muy bueno tenerlo.

  • Puede marcar una clase con @Testin testng, lo que significa: cada método público es una prueba. En Junit necesitas copiar / pegar @Testtodos los métodos.

Una molestia con ambos es la forma en que hamcrest se incluye con JUnit y la forma en que JUnit se incluye con testng. Hay frascos alterados en maven que no tienen este problema.

Mi gran preocupación con ambos frameworks es que ambos parecen haber dejado de evolucionar. Los lanzamientos son cada vez menos frecuentes y tienden a tener características cada vez menos notables. Todo el movimiento BDD parece haber tenido poco impacto en cualquiera de los marcos, por ejemplo. Además, JUnit simplemente podría haber adoptado la mayor parte de lo que enumeré anteriormente. No hay una buena razón técnica por la que JUnit no pueda implementar ninguna de estas cosas; la gente detrás de JUnit simplemente elige no implementar estas cosas. Ambos proyectos también parecen carecer de una visión para las direcciones futuras y parecen estar felices haciendo solo pequeños ajustes durante los últimos años.

Jilles van Gurp
fuente
9

Estaba buscando buenas razones para cambiar TestNG sobre JUnit y encontré que estas diapositivas de Tomek Kaczanowski abordan muy bien esta pregunta. Tomek es autor del libro Practical Unit Testing que parece ser muy respetado por desarrolladores y probadores.

MajiK
fuente
1

Si trabaja en un proyecto Java / Scala y Gradle es su herramienta de compilación preferida, tenga en cuenta que el ScalaTestmarco solo tiene JUnitRunnerque ejecutar sus pruebas de Scala . En otras palabras, tienes una opción:

  • Pruebas de Java JUnit + Scala Tests ejecutadas con JUnitRunner => Mejor integración de Gradle
  • Pruebas Java testNG + Pruebas Scala ejecutadas con Scala Runner => Mala integración de Gradle, ya que Scala Test Runner es una sola tarea masiva desde el punto de vista de Gradle.
Ivan Balashov
fuente
0

Puedes usar Mockito como tu marco de burla. Se integra muy bien con TestNG. No tienes que extender ninguna clase para usar Mockito con TestNG. Su código de prueba está menos acoplado de esta manera y si por alguna razón necesita usar otros marcos de simulación, es fácil hacerlo.

El Do
fuente
7
Esta respuesta es simplemente totalmente irrelevante para la pregunta ...
Adrian Shum
11
@AdrianShum Creo que Konrad estaba tratando de comentar sobre el punto de JeroenHoek sobre la integración de PowerMock con TestNG, ya que no parece tener el privilegio de "comentar", supongo que puso su comentario como respuesta
Taoufik Mohdit
1
Esta respuesta malinterpreta qué es PowerMock. No es un reemplazo de Mockito, sino un complemento que le permite a Mockito burlarse de ciertas cosas que Mockito por sí solo no puede hacer (métodos estáticos, clases finales).
figura
0

En una palabra..

Si su alcance se limita a pruebas unitarias detalladas y finas sin dependencias entre ellas, entonces se puede usar JUnit.

Si su alcance requiere pruebas funcionales que pueden o no requerir dependencias y compartir datos (parámetros) entre pruebas, elija TestNG. Además, TestNG puede realizar pruebas unitarias similares a JUnit. ASÍ que puede tener un conjunto de pruebas unitarias y un conjunto de pruebas funcionales.

nabster
fuente