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

Pas de spam. Que du contenu de qualité.