Categorías
Desarrollo ia Testing

TDD con GitHub Copilot

En este artículo veremos como se pueden realizar programación TDD (Test Driven Development) haciendo uso de GitHub Copilot.

El propósito de GitHub Copilot es facilitar la vida del desarrollador de aplicaciones y es por ello que queremos comprobar su potencial en el desarrollo de Test, perteneciente al ciclo de vida del mismo.

¿Qué es Copilot?

GitHub Copilot no deja de ser un asistente de IA, que ofrece sugerencias al usuario en modo autocompletar mientras se está desarrollando el código.  Éstas sugerencias siempre vendrán dadas por un comentario o por la escritura del propio código que estemos realizando.  Copilot analiza el contexto del fichero que se está editando, así como los ficheros relacionados, y ofrece sugerencias desde el editor de texto, las cuales se puede seleccionar (autocompletar) o no.

GitHub - pjbk/GitHubCopilot: Is GitHub Copilot Going to Replace Developers?

¿TDD?

TDD es el desarrollo basado en pruebas.  Es una metodología de desarrollo Software que se centra en un ciclo de desarrollo iterativo en el que todo el esfuerzo se realiza en escribir el caso de prueba antes del método o procedimiento.

Software Testing Life Cycle | Different stages of Software Testing | Edureka

¡Comenzamos!

Siguiendo con el enfoque TDD,  en primer lugar realizaremos las pruebas, las cuales intentaremos solucionarlas escribiendo el código principal y en caso de ser necesario refactorizaremos dicho código.

1.- Requisitos previos
2.- Creación archivo de prueba Test

Una vez que tenemos configurado nuestro entorno de trabajo, podemos comenzar creando un nuevo archivo en el directorio src/test de nuestro proyecto, el cual llamaremos PricesTest.java.

Hacemos uso de Copilot:

#create test class for prices and create test
public class PricesTest() {
   //create test method por prices
  @Test
  public void testPrices(){
   Prices prices = new Prices();
   // set prices productId
   prices.setProductId(345L);
   //set prices pricesList
   prices.setPricesList(1L);
   //set prices brandId
   prices.setBrandId(1L);
   //set prices currency
   prices.setCurrency("EUR");
   //set prices price
   prices.setPrice(29.99f);
   //set pirces startDate
   prices.setStartDate("2024-01-01 10:00");
   //set prices endDate
   prices.setEndDate("2024-31-01 10:00");
   //assert prices price
   assertEquals(prices.getPrice(), 29,99f);
   //assert prices currency
   assertEquals(prices.getCurrency(), "EUR");
 }  
}

Con la lógica de comentarios de Copilot, se creó una clase llamada PricesTest,  además de un método de prueba testPrices(), donde se agregaron todos los campos correspondientes a un listado de precios.  Con las sugerencias ofrecidas por la herramienta, se autocompletó dichas clases al igual que los propios asertos indicados.

3.- Ejecución del Test

Siguiendo el ciclo de vida de TDD, deberíamos ejecutar el test unitario y ver como falla, ya que no tenemos ningún código principal asociada a dicho test.  Por tanto el siguiente paso es escribir el código para poder realizar correctamente esta prueba, completando el ciclo de vida TDD.

4.- Crear clase de Precios

En el directorio src/main, crearemos un fichero llamado Prices.java, el cual contiene todos los campos necesarios para la ejecución de la prueba.  Para ello volvemos a hacer uso de Copilot:

#create class prices with constructor and setters and getters
public class Prices {
 //create private variables for prices
  private Long productId;
  private Long brandId;
  private Long priceList;
  private String startDate;
  private String endDate;
  private float price;
  private String currency;

  //create constructor
  public Prices(){
  }
  
  //create getters and setters
  public float getPrice(){
    return price; 
  }

  public void setPrice(float price) {this.price = price;}
  
  public String getCurrency(){
    return currency; 
  }
  public void setCurrency(String currency){this.currency = currency;}
}
5.- Ejecución del Test nuevamente

Ahora que ya tenemos escrito el código principal asociado a nuestra clase de prueba, podemos volver a ejecutar el test y comprobar si efectivamente el test pasó correctamente o no.

6.- Prueba unitaria haciendo uso de Mockito

Haciendo uso de Copilot:

#Comprobar el que objeto precio utilizado anteriormente está dentro de un rango de precio en una fecha determinada.

@Test
public void testPricesMock(){
//create prices object
Prices prices = new Prices();
// create mock for prices object
Prices pricesMock =   Mockito.mock(Prices.class);
   // set prices productId
   prices.setProductId(345L);
   //set prices pricesList
   prices.setPricesList(1L);
   //set prices brandId
   prices.setBrandId(1L);
   //set prices currency
   prices.setCurrency("EUR");
   //set prices price
   prices.setPrice(29.99f);
   //set pirces startDate
   prices.setStartDate("2024-01-01 10:00");
   //set prices endDate
   prices.setEndDate("2024-31-01 10:00"); 
   
 //create lstPrices
  List<Prices> lstPrices  = new ArrayList<>();
  lstPrices.add(prices);
  Optional<List<Prices>> lstPrices = Optional.of(lstPrices);
  //mockito assert prices
  Mockito.when(pricesRepository.findPrices(Mockito.any(), Mockito.any())).thenReturn(lstPrices);
}

7.- Ejecución Prueba unitaria haciendo uso de Mockito

Volvemos a hacer uso de Copilot:

#create prices repository jpa extended verified list prices
@Repository
public interface PricesRepository extends JpaRepository<Prices, Long>{
 @Query ("SELECT p FROM Prices p WHERE p.startDate<=:date and p.endDate>=:date and p.produt =: productId")
OOptional<List<Prices>> findPrices(@Param("date") Date date, @Param("productId") Long productId);
}
8.- Conclusión

A la hora de implementar una metodología TDD con GitHub Copilot, podemos observar la facilidad  y la agilidad con la que podemos realizar los diferentes desarrollos, ya que a medida que se escribe más código, Copilot comprende mejor el contexto y las sugerencias siguen mejorando y siendo más precisas para el proyecto.