Oui! c’est pas codé ça? Ca serait peut-etre bien que ça marche avant une release quand même, sinon c’est peu utile de déployer
L’objectif des tests, c’est de faire tourner le code que tu as écris, et de tester le résultat de ton code.
Les tests sont exécuté par CircleCI à chaque push sur le repo Gladys, et permettent de vérifier que le nouveau code écrit ne « casse » pas de l’ancien code.
Par exemple, si tu écris une fonction
// lib/sum.js
function sum(a, b) {
return a + b;
}
Tu peux vouloir écrire 1 test qui vérifie que sum(1, 2) = 3.
Ton test peut ressembler à ça:
// test/sum.js
const { expect } = require('chai');
const sum = require('../lib/sum.js');
describe('sum', () => {
it('should return 3', () => {
const result = sum(1, 2);
expect(result).to.equal(3);
});
});
Lorsque l’on exécute ce bout de code en lançant « mocha » (l’outil de test que nous utilisons), nous allons voir:
should return 3
Maintenant imaginons que dans un futur proche du projet, quelqu’un casse notre fonction sum(a, b), et remplace par erreur le + par un *.
Lors de l’exécution des tests, le test « should return 3 » var renvoyer 2, et mocha va crier:
should return 3
Expected « 2 » to equal « 3 »
Ainsi, on saura que cette PR casse quelque chose.
Cet exemple est simpliste, mais dans la réalité, c’est très utile. Car là tu travaille sur l’arduino, mais qu’est ce qui me dit que tu n’as pas cassé l’intégration Z-Wave en développant l’intégration arduino? Les tests
Le mocking
Sauf que là tu vas me dire: oui mais mon code appelle en USB un arduino, comment je fais ça dans mes tests?
Dans les tests, on ne veut pas communiquer avec l’extérieur: inutile de tester le comportement de la lib serialport qui elle même a déjà des tests!
On va donc « mocker » les appels aux librairies externes, en utilisant une lib qui s’appelle « proxyquire » ( GitHub - thlorenz/proxyquire: 🔮 Proxies nodejs require in order to allow overriding dependencies during testing. )
Ou alors en réecrivant nous même la librairie en simplifiant tous les appels de fonction par des returns
Exemple, dans le test du service Z-Wave, j’ai entièrement re-écris la lib openzwave en 28 lignes:
https://github.com/GladysAssistant/Gladys/blob/master/server/test/services/zwave/ZwaveMock.test.js
Chaque fonction de la lib est remplaçée par une fonction « fake » qui retourne null.
Je t’invite à lire les tests de toutes les autres intégrations (server/test/services), et de te familiariser avec
Un tutoriel pourrait aussi t’aider: