Atteindre une couverture de code à 100 % : un guide pratique
Cet article explique comment obtenir efficacement une couverture de code à 100 % pour votre projet. Allons-y !
Préparation
Avant de commencer, identifiez ces éléments clés :
La planification initiale rationalise le processus de test.
Mise en œuvre pratique
Cet exemple utilise un fichier TypeScript :
Créez un dossier test
dans le répertoire racine de votre projet. Les tests sont placés dans des fichiers avec l'extension .test.ts
(ou similaire, comme .spec.ts
).
Nous utiliserons Mocha, Sinon et c8 pour les rapports de couverture :
<code class="language-json"> "devDependencies": { "@types/mocha": "^10.0.9", "@types/sinon": "^17.0.3", "c8": "^10.1.2", "mocha": "^10.8.2", "sinon": "^19.0.2" }</code>
Ces packages doivent être installés. Des bibliothèques supplémentaires seront ajoutées ultérieurement.
Les commandes suivantes exécutent des tests et génèrent des rapports :
<code class="language-json"> "scripts": { "test": "mocha --require ts-node/esm --experimental-specifier-resolution=node", "test:watch": "mocha --watch --require ts-node/esm --experimental-specifier-resolution=node", "coverage": "c8 --reporter=lcov npm run test", "coverage:default": "c8 npm run test" },</code>
La commande test:watch
est cruciale ; il réexécute automatiquement les tests sur les modifications de code, éliminant ainsi les redémarrages manuels.
La compilation TypeScript nécessite des modules supplémentaires :
<code class="language-json"> "devDependencies": { "ts-node": "^10.9.2", "typescript": "^5.6.3" }</code>
Exemple : tester une fonction simple
Testons cette add
fonction :
add.test.ts
<code class="language-typescript">export function add(a: number, b: number): number { return a + b; }</code>
Le fichier de test correspondant :
add.ts
<code class="language-typescript">import { strict as assert } from 'assert'; import { add } from '../add'; describe('Function add()', () => { it('should return 5 when adding 2 and 3', () => { const result = add(2, 3); assert.equal(result, 5); }); // ... more test cases ... });</code>
Ceci compare les résultats attendus et réels. L’échec des tests indique des problèmes. Des tests approfondis garantissent que les modifications du code n'interrompent pas les fonctionnalités existantes.
Test des interactions DOM
Pour tester les manipulations DOM (par exemple, les événements de clic), installez jsdom
et jsdom-global
:
<code class="language-json">"devDependencies": { "@types/node": "^22.9.0", "jsdom": "^25.0.1", "jsdom-global": "^3.0.2", }</code>
Configurez ces packages :
<code class="language-javascript">require("jsdom-global")(); global.DOMParser = window.DOMParser;</code>
Cela permet à Node.js de simuler l'environnement DOM d'un navigateur.
Test des opérations asynchrones
Pour les fonctions asynchrones (par exemple, les appels API), utilisez nock
et node-fetch
:
<code class="language-json">"devDependencies": { "nock": "^13.5.6", "node-fetch": "^2.7.0", }</code>
Configurez ces packages :
<code class="language-javascript">import fetch from "node-fetch"; global.fetch = fetch as any;</code>
nock
se moque des réponses de l'API, fournissant des environnements de test prévisibles et stables. node-fetch
fournit une implémentation fetch
de type navigateur pour Node.js.
Intégration Codecov
Pour intégrer Codecov, créez un référentiel GitHub et suivez les instructions de configuration de Codecov. GitHub Actions peut automatiser le téléchargement de rapports. Un exemple de workflow GitHub Actions :
<code class="language-json"> "devDependencies": { "@types/mocha": "^10.0.9", "@types/sinon": "^17.0.3", "c8": "^10.1.2", "mocha": "^10.8.2", "sinon": "^19.0.2" }</code>
Ce workflow exécute des tests et télécharge des rapports de couverture sur Codecov à chaque demande push ou pull. Un badge Codecov peut ensuite être ajouté à votre README.
Conclusion
En suivant ces étapes et en les adaptant à vos besoins spécifiques, vous pouvez atteindre et maintenir une couverture de test à 100 %, améliorant ainsi la qualité et la fiabilité du code. N'oubliez pas de refactoriser le code de test répétitif en fonctions réutilisables pour une meilleure maintenabilité.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!