Uso di TDD con javascript e I.A. per Inde Cloud

Ho chiesto a chatGPT come usare TDD con javascript, pensando a Inde Cloud.

Librerie più usate per Unit Test in JavaScript

  • Jest (molto usato con React, semplice e potente)
  • Mocha + Chai (flessibile, popolare con Node.js)
  • Jasmine (simile a Jest, spesso usato in Angular)
  • Vitest (alternativa a Jest, più veloce per progetti moderni)

Mocking e Spying

A volte dobbiamo testare funzioni che chiamano API o interagiscono con database. Qui entra in gioco il mocking.

Esempio con Jest Mock

const fetchData = require(‘./fetchData’);

jest.mock(‘./fetchData’); // Crea un mock della funzione

test(‘Dovrebbe restituire i dati finti’, async () => {
fetchData.mockResolvedValue({ id: 1, name: ‘Mario’ });

const result = await fetchData();
expect(result).toEqual({ id: 1, name: ‘Mario’ });
});

Test Coverage

Per misurare quanti pezzi di codice sono coperti dai test, puoi usare il comando:

sh

CopiaModifica

jest --coverage

Otterrai un report con le percentuali di codice testate. Più alta è la copertura, meglio è!

Ho chiesto: ma i test me li potrebbe scrivere l’IA?

ChatGPT ha detto:

ChatGPT

Sì, assolutamente! L’IA può scrivere test unitari per te, sia per codice esistente che seguendo un approccio TDD. Ti faccio vedere alcuni esempi pratici con Jest.


1. Creazione automatica di unit test per codice esistente

Se mi fornisci una funzione JavaScript, posso generarti i test automaticamente. Ad esempio, se hai questa funzione:

javascript

CopiaModifica

function somma(a, b) {
  return a + b;
}

L’IA può generare automaticamente i test:

javascript

CopiaModifica

// somma.test.js
const somma = require('./somma');

test('Dovrebbe sommare 2 + 3 e restituire 5', () => {
  expect(somma(2, 3)).toBe(5);
});

test('Dovrebbe sommare numeri negativi', () => {
  expect(somma(-1, -3)).toBe(-4);
});

test('Dovrebbe sommare numeri decimali', () => {
  expect(somma(2.5, 2.5)).toBe(5);
});

2. TDD: Generare test PRIMA del codice

Se stai seguendo TDD, puoi chiedere all’IA di generare test prima ancora di scrivere la funzione. Ad esempio:

javascript

CopiaModifica

// moltiplica.test.js
const moltiplica = require('./moltiplica');

test('Dovrebbe moltiplicare 2 per 3 e restituire 6', () => {
  expect(moltiplica(2, 3)).toBe(6);
});

test('Dovrebbe restituire 0 se uno dei numeri è 0', () => {
  expect(moltiplica(10, 0)).toBe(0);
});

test('Dovrebbe funzionare con numeri negativi', () => {
  expect(moltiplica(-2, 3)).toBe(-6);
});

Ora il test fallisce perché moltiplica.js non esiste. Quindi, scrivi solo il codice necessario per far passare il test:

javascript

CopiaModifica

// moltiplica.js
function moltiplica(a, b) {
  return a * b;
}
module.exports = moltiplica;

3. Test con mocking (API e database)

Se hai una funzione che chiama un’API, l’IA può scriverti un test che usa mocking:

Funzione originale che chiama un’API

javascript

CopiaModifica

const axios = require('axios');

async function getUser(userId) {
  const response = await axios.get(`https://jsonplaceholder.typicode.com/users/${userId}`);
  return response.data;
}

module.exports = getUser;

Test con mock di Axios

javascript

CopiaModifica

const getUser = require('./getUser');
const axios = require('axios');

jest.mock('axios'); // Mock di Axios

test('Dovrebbe restituire i dati di un utente', async () => {
  const userData = { id: 1, name: 'Mario Rossi' };
  axios.get.mockResolvedValue({ data: userData });

  const result = await getUser(1);
  expect(result).toEqual(userData);
});

4. Generazione automatica di test con IA

Come posso generare test per te?

  • Se mi dai una funzione, ti posso scrivere i test.
  • Se mi descrivi una funzionalità, ti posso scrivere sia i test che il codice (TDD).
  • Se hai un file di codice, posso analizzarlo e creare test adatti.

:light_bulb: Vuoi che generi test per un tuo codice specifico? Mandami la funzione e te li scrivo subito! :rocket:

3 Mi Piace