Apex Academy
Módulo 10·04·30 min

Test.startTest y Test.stopTest

El código asíncrono se ejecuta más tarde, pero un test necesita el resultado ya. Test.stopTest() ejecuta en ese momento todo lo que se encoló desde Test.startTest(), y además da a esa parte un presupuesto de límites nuevo.

En Admin esPulsar «Run Now» en un trabajo programado para ver el resultado sin esperar a la noche

✓ En esta sub-lección

  1. 01Probar un Batch, un Queueable o un @future con startTest y stopTest.
  2. 02Explicar qué pasa con los límites entre startTest y stopTest.
  3. 03Preparar los datos teniendo en cuenta que el Batch hace una sola tanda en un test.

La nutria: ¿Te acuerdas? · Repaso de la lección 3

¿Qué falla en un test que termina con Assert.isTrue(true)?

La migración del Módulo 9 es un Batch. Si en un test llamas a Database.executeBatch y en la línea siguiente compruebas las filas, verás que no ha cambiado nada: el Batch está en la cola y el test ya ha terminado. Hace falta una forma de decir «ejecuta ahora lo encolado y espera».

Apex
Test.startTest();
Database.executeBatch(new RenewalMigrationBatch(), 200);   // se encola…
Test.stopTest();                                          // …y aquí se ejecuta entero

Integer pending = [SELECT COUNT() FROM ERP_Renewal__c WHERE Processed__c = false];
Assert.areEqual(0, pending, 'Después del Batch no puede quedar ninguna fila pendiente');
  • Todo lo asíncrono que se encola entre startTest y stopTest (@future, Queueable, Batch, Scheduled) se ejecuta al llegar a stopTest, antes de la línea siguiente.
  • Lo que va entre las dos líneas recibe un presupuesto de límites nuevo: la preparación de datos no le gasta consultas a lo que pruebas.
  • Cada test puede llamar a startTest y stopTest una sola vez.
  1. Test.startTest();
  2. Database.executeBatch(new RenewalMigrationBatch(), 200);
  3. Test.stopTest();
  4. Assert.areEqual(0, pending, '…');
Filas pendientes:150

Paso 1 de 4

150 filas pendientes preparadas en el setup. Pulsa Reproducir.

Ejecuta el test con y sin startTest y stopTest, y mira cuándo corre el Batch y qué ve el Assert.

La nutria: El «Run Now» del trabajo programado

Cuando yo quería probar un flow programado sin esperar a la noche, lo depuraba a mano con un registro concreto. stopTest es eso para Apex: no esperas a que Salesforce encuentre hueco en la cola, lo fuerzas en ese momento y miras el resultado.

La nutria: ¿Y por qué no un Flow? Porque sus tests no prueban lo asíncrono

Los tests de Flow no admiten los caminos asíncronos: si tu flow avisa al ERP en su camino «Run Asynchronously», esa parte se queda sin probar. En Apex, startTest y stopTest cubren todo el asíncrono del Módulo 9, desde un @future hasta un Batch programado.