Solución:
Los conjuntos de pruebas son bastante útiles cuando desea ejecutar # cantidad de clases dentro de su organización.
Suponga que tiene 50 clases de prueba en su organización en el objeto Opportunity y cada vez que un desarrollador realiza algún cambio en su código vértice, desea asegurarse de que los casos de prueba no fallan, por lo que ejecuta manualmente todas las clases yendo a
Configuración-> Ejecución de prueba de Apex
pero con Test Suites, en lugar de seleccionar todas las clases relevantes cada vez, simplemente puede ejecutar pruebas. puede agruparlos dentro de un conjunto de pruebas que se puede ejecutar desde Developer Console.
Developer Console-> Test-> New Suite Run
y ejecutará todas las clases de prueba a la vez.
¿Puedo usar un único método @testSetup para configurar los datos de prueba para todos los métodos de prueba en un conjunto de pruebas?
No. @testSetup solo funciona en la clase en la que está definida. Como beneficio adicional, no puede definir una clase de prueba para que sea abstracta o virtual, lo que permitiría la reutilización del código en múltiples clases usando nada más que una simple cláusula de extensión.
// This code won't compile. This annoys me.
@isTest public abstract class BaseTestSetup {
@testSetup protected static void initialize() {
// Do stuff here
}
}
Como solución a esto, ahora definí una clase de prueba que no contiene pruebas unitarias por sí misma, pero incluye métodos estáticos que puedo llamar desde una función @testSetup. De esa manera, solo necesito copiar / pegar aproximadamente tres líneas de código en cada clase que usa esta clase de prueba de utilidad.
¿Alguien puede explicar esta nueva función con un caso de uso y la ventaja que tenemos ahora sobre las ejecuciones de prueba existentes anteriormente?
Antes de esta función, teníamos que seleccionar las pruebas que queríamos ejecutar. Por lo general, esto era casi doloroso cuando queríamos, por ejemplo, ejecutar todas las pruebas o, lo que es más importante, probar una sola función. Por ejemplo, digamos que tenemos media docena de páginas que usan una sola función (digamos, buscar direcciones en un sistema de terceros), pero queremos algunas pruebas de extremo a extremo que verifiquen que cada página que usa esta clase de utilidad todavía funciona, y por lo tanto queremos ejecutar un total de siete clases de prueba: una solo para proteger la clase de utilidad más seis más para verificar que cada controlador funciona como se espera.
Sin conjuntos de pruebas, tenemos que seleccionar las siete pruebas individualmente cada vez que queramos ejecutarlas. Con las suites de prueba, podemos probarlas todas a la vez con un clic. Esto ahorra tiempo en comparación con tener que seleccionar esas mismas clases una y otra vez, y reduce la posibilidad de que pierda tiempo seleccionando demasiadas / muy pocas pruebas. Si se configura correctamente, puede ayudarlo a mantener sus funciones agrupando las pruebas de manera lógica.
Como confirmación de parte de la pregunta de OP, @testSetup no parece aplicarse a otros métodos de prueba dentro de un conjunto de pruebas. Creó las siguientes clases, las agregó a un nuevo conjunto de pruebas y las ejecutó:
@isTest private class TestClass1 {
@testSetup static void setup(){
insert new Account(Name="Acme, Inc.");
}
@isTest static void testA(){
List<Account> accts = [SELECT Id, Name FROM Account];
System.assertEquals(1, accts.size(), accts);
}
}
@isTest private class TestClass2 {
@isTest static void testB(){
List<Account> accts = [SELECT Id, Name FROM Account];
System.assertEquals(1, accts.size(), accts);
}
}
Resultados: