Mettre en place Cucumber pour vos tests end-to-end Angular
Par défaut, les applications Angular utilisent Protractor et Jasmine pour les tests end-to-end. Dans cet article, nous allons voir comment remplacer Jasmine et utiliser Cucumber en tant que framework de test end-to-end.
1. Installer les dépendances
Pour installer les dépendances requises, lancer la commande suivante dans un terminal :
npm install --save-dev @types/{chai,cucumber} chai cucumber protractor-cucumber-framework
Si vous utilisez Yarn, la commande à lancer est :
yarn add --dev @types/{chai,cucumber} chai cucumber protractor-cucumber-framework
Chai
Cucumber est un framework de test qui ne vient pas avec une librairie d’assertions comme le fait Jasmine, nous devons
donc en installer une nous-mêmes. Nous allons utiliser chai
dans cet article.
Protractor Cucumber Framework
Le paquet protractor-cucumber-framework
est un plugin qui fait le lien entre Protractor and Cucumber.
C’est ce qui rend possible l’exécution des tests Cucumber via Protractor.
Les déclarations de types pour Chai and Cucumber
Les paquets @types/chai
et @types/cucumber
contiennent les déclarations de types qui permettent à TypeScript de
vérifier le typage statique de notre code.
2. Mettre à jour la configuration du compilateur TypeScript
Ouvrez le fichier e2e/tsconfig.json
. Puis, mettez à jour la configuration du compilateur TypeScript en remplaçant :
"types": ["jasmine", "jasminewd2", "node"]
par :
"types": ["chai", "cucumber", "node"]
Cela permet au compilateur TypeScript de prendre en compte les déclarations de types que nous avons installées à l’étape d’avant.
3.Configurer Protractor pour utiliser Cucumber
Nous allons maintenant effectuer des modifications dans le fichier e2e/protractor.conf.js
qui contient la
configuration de Protractor.
Mettre à jour les fichiers de test à utiliser par Protractor :
exports.config = { allScriptsTimeout: 11000,- specs: ['./src/**/*.e2e-spec.ts'],+ specs: ['./src/features/**/*.feature'], capabilities: { browserName: 'chrome', }, directConnect: true, baseUrl: 'http://localhost:4200/', framework: 'jasmine', jasmineNodeOpts: { showColors: true, defaultTimeoutInterval: 30000, print: function() {}, }, onPrepare() { require('ts-node').register({ project: require('path').join(__dirname, './tsconfig.json'), }); jasmine.getEnv().addReporter(new SpecReporter({ spec: { displayStacktrace: true } })); },};
Les fichiers de “feature” vont resider dans le dossier e2e/src/features
.
Déclarer Cucumber en tant que framework de test à utiliser
À la place de Jasmine, nous allons déclarer Cucumber en tant que framework de test à utiliser. Mettez donc à jour le fichier de configuration de Protractor comme suit :
exports.config = { allScriptsTimeout: 11000, specs: ['./src/features/**/*.feature'], capabilities: { browserName: 'chrome', }, directConnect: true, baseUrl: 'http://localhost:4200/',- framework: 'jasmine',+ framework: 'custom',+ frameworkPath: require.resolve('protractor-cucumber-framework') jasmineNodeOpts: { showColors: true, defaultTimeoutInterval: 30000, print: function() {}, }, onPrepare() { require('ts-node').register({ project: require('path').join(__dirname, './tsconfig.json'), }); jasmine.getEnv().addReporter(new SpecReporter({ spec: { displayStacktrace: true } })); },};
Configurer les options Cucumber
cucumberOpts
définit les options de la ligne de commande qui sont transmises à Cucumber.js
.
exports.config = { allScriptsTimeout: 11000, specs: ['./src/features/**/*.feature'], capabilities: { browserName: 'chrome', }, directConnect: true, baseUrl: 'http://localhost:4200/', framework: 'custom', frameworkPath: require.resolve('protractor-cucumber-framework')+ cucumberOpts: {+ require: ['./src/steps/**/*.steps.ts'],+ }, jasmineNodeOpts: { showColors: true, defaultTimeoutInterval: 30000, print: function() {}, }, onPrepare() { require('ts-node').register({ project: require('path').join(__dirname, './tsconfig.json'), }); jasmine.getEnv().addReporter(new SpecReporter({ spec: { displayStacktrace: true } })); },};
Dans notre cas, nous disons à Cucumber que nos fichiers de définition des steps se trouvent
dans le dossier e2e/src/steps
.
Enlever les résidus de Jasmine
Nous pouvons maintenant tranquillement enlever Jasmine de notre configuration Protractor :
exports.config = { allScriptsTimeout: 11000, specs: ['./src/features/**/*.feature'], capabilities: { browserName: 'chrome', }, directConnect: true, baseUrl: 'http://localhost:4200/', framework: 'custom', frameworkPath: require.resolve('protractor-cucumber-framework') cucumberOpts: { require: ['./src/steps/**/*.steps.ts'], },- jasmineNodeOpts: {- showColors: true,- defaultTimeoutInterval: 30000,- print: function() {},- }, onPrepare() { require('ts-node').register({ project: require('path').join(__dirname, './tsconfig.json'), });- jasmine.getEnv().addReporter(new SpecReporter({ spec: { displayStacktrace: true } })); },};
Nous n’avons pas désinstallé les dépendances vers Jasmine et son écosystème, car Jasmine reste utilisé pour les tests unitaires. Si vous souhaitez vous débarrasser de Jasmine et utiliser Jest pour vos tests unitaires, j’ai un article spécialement pour vous.
4. Écrire les tests Cucumber
Nous pouvons maintenant commencer à écrire nos tests end-to-end avec Cucumber.
Fichier feature
Créez le fichier e2e/src/features/app.feature
avec le contenu suivant :
Feature: Go to the home Display the title
Scenario: Home Page Given I am on the home page When I do nothing Then I should see the title
La “page object”
Le fichier e2e/src/pages/app.po.ts
existe déjà. Vérifiez que son contenu est bien comme suit :
import { browser, by, element } from 'protractor';
export class AppPage { navigateTo() { return browser.get(browser.baseUrl) as Promise<unknown>; }
getTitleText() { return element(by.css('app-root h1')).getText() as Promise<string>; }}
La définition des steps
Créez le fichier e2e/src/steps/app.steps.ts
avec le contenu suivant :
import { Before, Given, Then, When } from 'cucumber';import { expect } from 'chai';
import { AppPage } from '../pages/app.po';
let page: AppPage;
Before(() => { page = new AppPage();});
Given(/^I am on the home page$/, async () => { await page.navigateTo();});
When(/^I do nothing$/, () => {});
Then(/^I should see the title$/, async () => { expect(await page.getTitleText()).to.equal('Welcome to angular-cli-cucumber-demo!');});
6. Lancer les tests
Vous pouvez maintenant lancer les tests end-to-end grâce à la commande suivante :
ng e2e
Conclusion
Dans cet article, nous avons appris à mettre en place Cucumber pour nos tests end-to-end. Le Angular CLI a fait la moitié du travail en créant pour nous la configuration initiale de Protractor.
Vous pourrez trouver Le code source complet de cet article dans ce dépôt Github.
Vous aimez ce blog ?
Suivez-moi sur Twitter pour plus de contenu !
Rejoignez la newsletter pour du contenu de grande qualité dans votre boite mail