Pruebas de mutación con el ejemplo: Ejecutar el test

| |

COMPARTE EL ARTÍCULO!!!

Utilice la lógica creada hasta ahora en esta serie para implementar el código de funcionamiento y, a continuación, utilice las pruebas de fallo y de unidad para mejorarlo.

El segundo artículo de esta serie demostró cómo implementar la lógica para determinar si es de día o de noche en un sistema de automatización del hogar (HAS) que controla el cierre y desbloqueo de una puerta de gato. Este tercer artículo explica cómo escribir código para usar esa lógica en una aplicación que cierra una puerta por la noche y la abre durante las horas de luz del día.

Como recordatorio, configúrelo para que lo siga utilizando el marco de pruebas de .NET xUnit.net siguiendo las instrucciones que se indican a continuación.

Desactive la trampilla para gatos durante la noche

Supongamos que la puerta del gato es un producto sofisticado de la Internet de los objetos (IO) que tiene una dirección IP y a la que se puede acceder enviando una solicitud a su API. En aras de la brevedad, esta serie no trata de cómo programar un dispositivo de IO, sino que simula el servicio para mantener el enfoque en el desarrollo basado en pruebas (TDD) y en pruebas de mutación.

Empiece por escribir una prueba de unidad que ha fallado:

[Hecho]
  publicvoid GivenNighttimeDisableTrapDoor(){
   var esperado ="Trampilla para gatos deshabilitada";
   var timeOfDay = dayOrNightUtility.GetDayOrNight(nightHour);
   var actual = catTrapDoor.Control(timeOfDay);
   Afirmar igual (esperado, real); 
  }

Esto describe un nuevo componente o servicio ( catTrapDoor ). Ese componente (o servicio) tiene la capacidad de controlar la trampilla dada la hora actual. Ahora es el momento de implementar catTrapDoor .

Para simular este servicio, primero debe describir sus capacidades utilizando la interfase. Cree un nuevo archivo en la carpeta app y nómbrelo ICatTrapDoor.cs (por convención, un nombre de interfaz comienza con una letra mayúscula I ). Añada el siguiente código a ese archivo:

namespace app{
   publicinterface ICatTrapDoor {
     string Control(string dayOrNight);
   }
 > }

Esta interfaz no es capaz de funcionar. Simplemente describe su intención al construir el servicio CatTrapDoor . Las interfaces son una buena manera de crear abstracciones de los servicios con los que está trabajando. En cierto modo, puede considerar esta interfaz como una API del servicio CatTrapDoor .

Para implementar la API, cree un nuevo archivo en la carpeta de aplicaciones y nómbrelo FakeCatTrapDoor.cs . Introduzca el siguiente código en el archivo de clase:

namespace app{
   clase pública FakeCatTrapDoor : ICatTrapDoor {
     publicstring Control(string dayOrNight){
       string trapDoorStatus ="Indeterminado";
       if(dayOrNight =="Nighttime"){
         trapDoorStatus ="Trampilla para gatos deshabilitada";
       }
 > 
 >      Trampa de retornoEstado de la puerta;
     }
 >  }
 > }

Esta nueva clase FakeCatTrapDoor implementa la interfaz ICatTrapDoor . Su método Control acepta el valor de cadena dayOrNight y comprueba si el valor transferido es «Nighttime». Si lo es, modifica trapDoorStatus de «Undetermined» a «Cat trap door disabled» y devuelve ese valor al cliente que llama.

¿Por qué se llama FakeCatTrapDoor ? Porque no es una representación de la verdadera trampilla para gatos. La falsificación sólo le ayuda a resolver la lógica de procesamiento. Una vez que su lógica es hermética, el servicio falso es reemplazado por el servicio real (este tema está reservado para la disciplina de pruebas de integración).

Con todo implementado, todas las pruebas de unidad pasan cuando se ejecutan:

Inicio de la ejecución de la prueba, por favor espere…

2. Total de pruebas; 3. Aprobadas: 3. fallido: 0. Saltado: 0.
Prueba de funcionamiento exitosa.
Tiempo de ejecución de la prueba: 1.3913 segundos

Habilitar la trampilla para gatos durante el día

Es hora de ver el siguiente escenario en nuestra historia de usuarios:

Escenario #2: Habilitar la trampilla para gatos durante el día

  • Dado que el reloj detecta la luz del día
  • Cuando el reloj notifica al HAS
  • Entonces el HAS habilita la trampilla para gatos

Esto debería ser fácil, sólo la otra cara del primer escenario. Primero, escriba la prueba que ha fallado.Añada la siguiente prueba de unidad a su archivo UnitTest1.cs en la carpeta unittest :

[Hecho]
  publicvoid GivenDaylightEnableTrapDoor(){
   var esperada ="Cat trap door enabled";
   var timeOfDay = dayOrNightUtility.GetDayOrNight(dayHour);
   var actual = catTrapDoor.Control(timeOfDay);
   Afirmar igual (esperado, real); 
  }

Puede esperar recibir una notificación «Cat trap door enabled» cuando envíe el estado «Daylight» al servicio catTrapDoor . Cuando se realizan pruebas unitarias, se ve el resultado que se espera, el cual falla como se esperaba:

Inicio de la ejecución de la prueba, por favor espere…
Xunit unittest.UnitTest1.UnitTest1.GivenDaylightEnableTrapDoor[FAIL]
UnitTest1.UnitTest1.GivenDaylightEnableTrapDoor
Fallo en la prueba de unidad. […]

La prueba de unidad esperaba recibir una notificación de «Cat trap door enabled» pero en su lugar se le notificó que el estado de la trampilla para gatos era «Indeterminado». Genial, ahora es el momento de arreglar este pequeño fallo.

Agregar tres líneas de código a la FakeCatTrapDoor hace el truco:

if(dayOrNight =="Daylight"){
   trapDoorStatus ="Cat trap door enabled";
  }

Ejecute las pruebas de unidad de nuevo y todas las pruebas pasarán:

Inicio de la ejecución de la prueba, por favor espere…

Pruebas totales: 4. Aprobado: 4. Fallido: 0. Saltado: 0.
Prueba de funcionamiento exitosa.
Tiempo de ejecución de la prueba: 2.4888 segundos

¡Increíble! Todo se ve bien, todas las pruebas unitarias están en verde, tienes una solución sólida como una roca. Gracias, TDD!

¡No tan rápido!

Los ingenieros experimentados no estarían convencidos de que la solución sea sólida como una roca. Por qué? Porque la solución aún no ha mutado. Para profundizar en lo que es la mutación y por qué es importante, asegúrate de leer el artículo final de esta serie.

COMPARTE EL ARTÍCULO!!!

Previous

#MainBhiChowkidar

Ampliar el acceso al hardware de código abierto

Next

Deja un comentario

shares