Apprenez à tester de bout en bout avec Puppeteer –
Puppeteer est une bibliothèque de nœuds qui fournit une API de haut niveau pour contrôler Chrome ou Chrome via le protocole DevTools. Puppeteer s'exécute sans tête par défaut, mais peut être configuré pour exécuter complètement Chrome (ou sans tête).
Dans ce didacticiel, nous allons apprendre ce qu'est le test, les différents types de test, puis nous utiliserons Puppeteer pour effectuer des tests de bout en bout sur notre application. À la fin de ce didacticiel, vous devriez pouvoir tester vos applications de bout en bout facilement avec Puppeteer.
Prérequis
Pour ce didacticiel, vous avez besoin d'une connaissance de base de JavaScript, ES6 + et Node.js. [19659005] Vous devez également avoir installé la dernière version de Node.js .
Nous utiliserons le fil tout au long de ce didacticiel. Si vous n'avez pas de fil déjà installé, installez-le à partir de ici .
Vous devez également connaître les bases de Puppeteer. Pour comprendre les bases de Puppeteer, consultez ce didacticiel simple .
Pour vous assurer que nous sommes sur la même page, voici les versions utilisées dans ce didacticiel:
- Node 13.3.0 [19659010] npm 6.13.2
- fil 1.21.1
- marionnettiste 2.0.0
- create-react-app 3.3.0
Introduction to Testing
En termes simples, testing est un processus permettant d'évaluer le fonctionnement de l'application comme prévu. Il aide à détecter les bogues avant le déploiement de votre application.
Il existe quatre types de tests différents:
- Test statique : utilise un système de type statique comme TypeScript ReasonML Flow ou un linter comme ESLint . Cela permet de capturer les erreurs de base comme les fautes de frappe et la syntaxe.
- Test unitaire : la plus petite partie d'une application, également connue sous le nom d'unité, est testée.
- Test d'intégration : plusieurs unités connexes sont testées ensemble pour voir si l'application fonctionne parfaitement en combinaison.
- Test de bout en bout : l'application entière est testée du début à la fin, tout comme un utilisateur ordinaire le ferait, pour voir s'il se comporte comme prévu.
Le trophée de test de Kent C Dodds est une excellente visualisation des différents types de tests:

Le trophée d'essai doit être lu de bas en haut. Si vous effectuez ces quatre niveaux de test, vous pouvez être suffisamment confiant avec le code que vous expédiez.
Maintenant, effectuons des tests de bout en bout avec Puppeteer.
Tests de bout en bout avec Puppeteer
démarrer un nouveau projet React avec create-react-app également connu sous le nom de CRA. Allez-y et tapez ce qui suit dans le terminal:
$ npx create-react-app e2e-puppeteer
Cela amorcera un nouveau projet React dans un dossier e2e-puppeteer . Grâce à la dernière version de create-react-app celle-ci installera également testing-library par défaut afin que nous puissions tester facilement nos applications.
Allez à l'intérieur du e2e -puppeteer et démarrez le serveur en tapant ce qui suit dans le terminal:
$ cd e2e-puppeteer
$ début du fil
Cela devrait ressembler à ceci:

Notre App.js ressemble à ceci:
import React de 'react';
importer le logo de './logo.svg';
import './App.css';
fonction App () {
revenir (
Modifiez src / App.js et enregistrez pour recharger.
Learn React
);
}
exporter l'application par défaut;
Nous allons tester la fonction App.js et le code sera écrit dans App.test.js . Alors allez-y et ouvrez App.test.js . Il doit avoir le contenu suivant:
import React from 'react';
importer {render} depuis '@ testing-library / react'; // 1
importer l'application depuis './App';
test ('rend le lien apprendre réagit', () => {// 2
const {getByText} = render ( ); // 3
const linkElement = getByText (/ learn react / i); // 4
attend (linkElement) .toBeInTheDocument (); // 5
});
Voici ce qui se passe dans le code ci-dessus:
- Nous
importonsla fonctionde renduà partir du package@ testing-library / react. - Nous utilisons ensuite la fonction globale
de testde Jest qui est notre lanceur de test installé par défaut via CRA. Le premier paramètre est une chaîne qui décrit notre test et le deuxième paramètre est une fonction où nous écrivons le code que nous voulons tester. - Ensuite, nous rendons le composant
Appet détruisons une méthode appeléegetByTextqui recherche tous les éléments qui ont un nœud de texte avectextContent. - Ensuite, nous appelons la fonction
getByTextavec le texte que nous voulons vérifier . Dans ce cas, nous vérifionsapprendre à réagiravec l'indicateur insensible à la casse. - Enfin, nous faisons l'assertion avec la fonction
s'attendre àpour vérifier si le texte existe dans le DOM.
Cela vient par défaut lorsque nous démarrons avec CRA. Allez-y, ouvrez un autre terminal et tapez ce qui suit:
$ yarn test
Lorsqu'il affiche une invite, tapez a pour exécuter tous les tests. Vous devriez maintenant voir ceci:

Maintenant, testons cette application avec des tests de bout en bout.
Test de la plaque de chaudière avec le marionnettiste
Allez-y et installez marionnettiste comme dépendance de dev en tapant ce qui suit dans le terminal:
$ yarn add -D puppeteer
Ouvrez maintenant App.test.js et collez ce qui suit:
importez le marionnettiste de "marionnettiste"; // 1
laisser le navigateur;
laisser la page;
// 2
beforeAll (async () => {
browser = attendre puppeteer.launch ({
sans tête: faux
});
page = attendre browser.newPage ();
attendre page.goto ("http: // localhost: 3000 /");
});
// 3
test ("rend le lien de réaction d'apprentissage", async () => {
attendre page.waitForSelector (". App");
const header = page d'attente. $ eval (". App-header> p", e => e.innerHTML);
attendre (en-tête) .toBe (`Modifier src / App.js et enregistrer pour recharger.»);
const link = page d'attente. $ eval (". App-header> a", e => {
revenir {
innerHTML: e.innerHTML,
href: e.href
};
});
attendez (link.innerHTML) .toBe (`Learn React`);
attendre (link.href) .toBe ("https://reactjs.org/");
});
// 4
afterAll (() => {
browser.close ();
});
Voici ce que nous faisons dans le code ci-dessus:
- Premièrement, nous importons le package
marionnettisteet déclarons quelques variables globales,navigateuretpage. - Ensuite, nous avons la fonction
avantToutfournie par Jest. Cela s'exécute avant l'exécution de tous les tests. Ici, nous lançons un nouveau navigateur Chromium en appelantpuppeteer.launch ()tout en définissant le modesans têtesurfauxpour voir ce qui se passe. Ensuite, nous créons une nouvelle page en appelantbrowser.newPage ()puis en accédant à l'URL de notre application Reacthttp: // localhost: 3000 /en appelant la page. goto (). - Ensuite, nous attendons que le sélecteur
.Appse charge. Lors du chargement, nous obtenons leinnerHTMLde.App-header> psélecteur en utilisant la page. $ Eval ()et le comparons avecModifiezsrc / App.jset enregistrez pour recharger. Nous faisons la même chose avec le.App-header> un sélecteur. Nous récupéronsinnerHTMLethrefpuis nous les comparons avecLearn Reactethttps://reactjs.org/respectivement pour tester notre assertion avec la fonction expect () de Jest. - Enfin, nous appelons la fonction
afterAllfournie par Jest. Cela s'exécute après l'exécution de tous les tests. Ici, nous fermons le navigateur.
Ce test devrait s'exécuter automatiquement et vous donnera le résultat suivant:

Allons-y et créons une application de compteur.
Conversion de la chaudière en application de compteur
Tout d'abord, modifiez du CSS en modifiant App.css comme suit:
.header {
taille de police: 56px;
alignement du texte: centre;
}
.counter-app {
affichage: flex;
justifier-contenu: espace autour;
}
bouton {
couleur de fond: navajowhite;
taille de police: 32px;
}
.compter {
taille de police: 48px;
}
Maintenant, changez App.js comme suit:
importez React, {useState} de "react";
import "./App.css";
fonction App () {
const [count, setCount] = useState (0);
revenir (
<>
Compteur
{count}
>
);
}
exporter l'application par défaut;
Ici, nous faisons une application de compteur simple avec deux boutons, Increment et Decrement . En appuyant sur le bouton Increment le compteur est augmenté de 1, et en appuyant sur le bouton Decrement le compteur est diminué de 1. Il ressemble à ceci:

Test de l'application Counter avec Puppeteer
Maintenant, changez App.test.js en ce qui suit:
importez le marionnettiste de "marionnettiste";
laisser le navigateur;
laisser la page;
beforeAll (async () => {
browser = attendre puppeteer.launch ({
sans tête: faux
});
page = attendre browser.newPage ();
attendre page.goto ("http: // localhost: 3000 /");
});
// 1
test ("rend le compteur", async () => {
attendre page.waitForSelector (". header");
const header = page d'attente. $ eval (". header", e => e.innerHTML);
expect (en-tête) .toBe ("Counter");
});
// 2
test ("met l'état initial à zéro", async () => {
attendre page.waitForSelector (". counter-app");
const count = page d'attente. $ eval (". count", e => e.innerHTML);
expect (count) .toBe ("0");
});
// 3
test ("incrémente le compteur de 1", async () => {
attendre page.waitForSelector (". counter-app");
attendre page.click (". increment");
const count = page d'attente. $ eval (". count", e => e.innerHTML);
expect (count) .toBe ("1");
});
// 4
test ("décrémente le compteur de 1", async () => {
attendre page.waitForSelector (". counter-app");
attendre page.click (". decrement");
const count = page d'attente. $ eval (". count", e => e.innerHTML);
expect (count) .toBe ("0");
});
afterAll (() => {
browser.close ();
});
Ici, nous conservons les avantTous et aprèsTous fonctionnent de la même manière qu'avant, où nous initialisons un navigateur et accédons à http: // localhost: 3000 / dans avantTous et nous fermons le navigateur dans aprèsTous . Ensuite, nous faisons ce qui suit:
- Nous vérifions si le texte
Counterest rendu. Pour cela, nous attendons le chargement du sélecteur.header. Ensuite, nous utilisons la page. $ Eval ()pour obtenir le sélecteurinnerHTMLde.header. Et puis nous faisons enfin l'assertion pour vérifier siCounterest rendu. - Ensuite, nous vérifions si l'état initial est zéro. Nous attendons le chargement du sélecteur
.counter-app. Ensuite, nous obtenons leinnerHTMLà partir du sélecteur.count. Nous comparons finalement si le nombreest0. Notez que nous utilisons une chaînealors que notre état est un nombre. En effet,innerHTMLrenvoie toujours une chaîne. - Ici, nous vérifions si un clic sur le bouton incrémente l'état de 1. Tout d'abord, nous attendons le
.counter- appsélecteur à charger. On clique ensuite sur le bouton.increment. Cela devrait faire passer l'État de0à1. Nous obtenons ensuite leinnerHTMLà partir du sélecteur.count. Ensuite, nous le comparons à1car notre fonction d'incrémentationdevrait toujours augmenter l'état de1. - Le bouton de décrémentation devrait diminuer l'état de 1. Il fonctionne de la même manière que le bouton d'incrémentation. Tout d'abord, nous attendons le chargement du sélecteur
.counter-app. On clique ensuite sur le bouton.decrement. Cela devrait réduire l'état de1à0. Notez que l'état était1après avoir cliqué sur le bouton d'incrémentation. Nous obtenons ensuite leinnerHTMLà partir du sélecteur.count. Ensuite, nous le comparons à0car notre fonction de décrémentationdevrait toujours diminuer l'état de1.
Le résultat devrait maintenant ressembler à ceci:

Conclusion
Dans ce didacticiel, nous avons découvert différents types de tests: tests statiques, tests unitaires, tests d'intégration et tests de bout en bout. Nous avons ensuite effectué des tests de bout en bout sur notre passe-partout, amorcé à l'aide de create-react-app .
Plus tard, nous avons converti l'application en application de compteur. Enfin, nous avons effectué des tests de bout en bout sur l'application de compteur.
La bibliothèque Puppeteer est utile non seulement pour effectuer des tests de bout en bout, mais également pour effectuer différents types d'automatisation de navigateur. Puppeteer est soutenu par Google et est activement maintenu, alors assurez-vous de vérifier ses documents pour comprendre les nombreux cas d'utilisation qu'il offre.
Vous pouvez trouver le code de ce tutoriel sur GitHub .
Source link
