JUnit 4 y TestNG solían ser comparables. ¿Cuáles son los pros y los contras de los dos marcos de prueba?
JUnit 4 y TestNG solían ser comparables. ¿Cuáles son los pros y los contras de los dos marcos de prueba?
Respuestas:
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 PowerMockTestCase
si 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.xml
definició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.
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 @BeforeClass
mé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 @Test
in testng, lo que significa: cada método público es una prueba. En Junit necesitas copiar / pegar @Test
todos 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.
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.
Si trabaja en un proyecto Java / Scala y Gradle es su herramienta de compilación preferida, tenga en cuenta que el ScalaTest
marco solo tiene JUnitRunner
que ejecutar sus pruebas de Scala . En otras palabras, tienes una opción:
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.
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.