Protractor + AngularJS : Structure d’un projet industrialisé

Note préalable : cet article date de 2017. Depuis, Protractor a atteint la fin de sa vie. Merci à lui et surtout aux personnes qui ont contribué à cet outil !

Diviser pour mieux tester

Bienvenue dans la 3ème et dernière partie de notre série d’articles sur la découverte des tests Protractor ! Dans l’article précédent, nous avons vu pourquoi et comment séparer les jeux de données et les scripts de test. Aujourd’hui, nous poursuivons sur notre lancée en isolant la description des pages et en structurant les dossier du projet.

  1. Installation et exemple de script
  2. Gestion des jeux de données et des dépendances du projet
  3. Structure d’un projet industrialisé

Gestion du référentiel d’objets avec le Page Object Model

Qu’est-ce que le Page Object Model ?

Le Page Object Model est un design pattern (ou patron de conception) qui consiste à regrouper en une même classe les identificateurs des composants web avec lesquels on souhaite intéragir, ainsi que les méthodes associées à ces composants. Le Page Object Model joue le même rôle dans les projets Selenium que l’Object Repository dans les projets UFT ou Katalon par exemple.

Dans les articles précédent, nous interagissons avec la page d’accueil du site d’Angular. Si nous nous servons d’un objet page pour la décrire, cela donne :

var SiteAngularPageAccueil = function() {
    this.champ_nom = element(by.model('yourName'));
    this.message_salutations = element(by.xpath("//div[contains(@class, 'well')]//h1"));

    this.entrerPrenom = function(prenom) {
        this.champ_nom.sendKeys(prenom);
    };
};

module.exports = SiteAngularPageAccueil;

La méthode entrerPrenom est vraiment simpliste ; en pratique, on pourrait s’en passer. Nous avons choisi de la créer simplement pour fournir un exemple d’utilisation de méthode d’objet.

Enregistrons ce code dans un fichier site-angular-page-accueil.js, que nous plaçons dans un dossier « pages ».

Utilisation de l’objet page dans le script

Mettons à présent à jour le cas de test en appelant l’objet page et en interagissant avec elle :

var donnees = require('./jeu-de-donnees-demo.js');
var using = require('jasmine-data-provider');
var SiteAngularPageAccueil = require('../pages/site-angular-page-accueil.js');

describe("Suite de test de la feature qui dit bonjour", function() {

    var pageAccueil = new SiteAngularPageAccueil();

    beforeEach(function () {
        browser.get(browser.baseUrl);
    });

    using(donnees.prenoms, function (data, description) {
        it("Chaîne de type " + description, function () {
            testMessageSalutations(data.prenom);
        });
    });

    using(donnees.faux_positif, function (data, description) {
        it("Si je rêvasse en écrivant mon script de test, j'obtiens un faux positif", function () {
            testMessageSalutations(data.prenomSaisi, data.prenomVoulu);
        });
    });

    function testMessageSalutations(prenomSaisi, prenomVoulu){
        pageAccueil.entrerPrenom(prenomSaisi);
        var prenomAVerifier = (prenomVoulu ? prenomVoulu : prenomSaisi);
        expect(pageAccueil.message_salutations.getText()).toEqual('Hello ' + prenomAVerifier + '!');
    }

});

Nous avons également créé une fonction testMessageSalutations pour éviter au maximum la duplication entre les deux cas de test.

Le script est maintenant concis et exempt de toute redite ! A ce stade, notre script de test a atteint un niveau de maintenabilité satisfaisant. Il peut jouer une multitude de cas de test différents, et n’est plus soumis aux changements de l’interface du site web.

Exemple de structure de projet Protractor

Pour augmenter la lisibilité de votre projet, nous vous suggérons de ranger dans des répertoires séparés vos fichiers de configuration, vos pages, vos suites de tests et vos jeux de données.

Le nombre de suites de test augmentant, n’hésitez pas à créer des sous-dossiers. Dans vos fichiers de configuration, il sera d’autant plus simple de sélectionner tel ou tel ensemble de suites de tests. Par exemple :

exports.config = {
  seleniumAddress: 'http://localhost:4444/wd/hub',
  specs: ['../specs/front-office/*.js'],
    baseUrl: 'https://www.monsupersiteweb.nc',
    framework: 'jasmine2'
};

Ici, toutes les suites de test se trouvant dans /spec/front-office seront jouées.

Vous avez maintenant tout ce qu’il vous faut pour démarrer votre projet de tests Protractor sur de bonnes bases. A vous de jouer maintenant ! Et vous souhaitez rester encore un peu avec nous, voici un petit bonus…

Bonus : le reporting Jasmine

Vous aurez beau écrire le plus beau code du monde, il y a peu de chances que celui-ci suffise à émouvoir aux larmes votre chef de projet, client ou patron. Un reporting clair et documenté est indispensable pour communiquer sur l’exécution des tests. C’est pourquoi nous ne voulions pas vous quitter avant d’évoquer la librairie Jasmine2 Screenshot Reporter.

Ajout de la librairie

Dans votre package.json, déclarez la dépendance voulue :

"dependencies": {
  // [...]
  "protractor-jasmine2-screenshot-reporter": "0.3.5"
}

Mise à jour du fichier de configuration

Il est maintenant nécessaire d’appeler la librairie dans le fichier de configuration :

var HtmlScreenshotReporter = require('protractor-jasmine2-screenshot-reporter');

var reporter = new HtmlScreenshotReporter({
    dest: '../reports',
    filename: 'reporting-' + getDate(true) + '.html',
    reportOnlyFailedSpecs: false,
    captureOnlyFailedSpecs: true,
    showQuickLinks: true,
    reportTitle: "Rapport de tests automatisés du " + getDate() + "",
    reportFailedUrl: true,
    pathBuilder: function(currentSpec, suites, browserCapabilities) {
        return currentSpec.fullName + "--" + browserCapabilities.get('browserName');
    }
});

exports.config = {
  seleniumAddress: 'http://localhost:4444/wd/hub',
  specs: ['../specs/dis-bonjour.js'],
    baseUrl: 'https://angularjs.org',
    framework: 'jasmine2',

    beforeLaunch: function() {
        return new Promise(function(resolve){
            reporter.beforeLaunch(resolve);
        });
    },

    onPrepare: function() {
        jasmine.getEnv().addReporter(reporter);
    },

    afterLaunch: function(exitCode) {
        return new Promise(function(resolve){
            reporter.afterLaunch(resolve.bind(this, exitCode));
        });
    }
};

function getDate(dansNomFichier) {
    var today = new Date();
    var dd = today.getDate();
    var mm = today.getMonth() + 1;
    var yy = today.getFullYear();
    var hh = today.getHours();
    var min = today.getMinutes();

    if(dd<10) dd='0' + dd;
    if(mm<10) mm='0' + mm;
    if(hh<10) hh='0' + hh;
    if(min<10) min='0' + min;

    if(dansNomFichier){
        today = yy + '-' + mm + '-' + dd + '--' + hh + 'h' + min;
    } else {
        today = yy + '/' + mm + '/' + dd + ', ' + hh + ':' + min;
    }
    return today;
}

Explication du fichier de configuration

dest: '../reports'

Avec cette configuration de la variable dest, si votre fichier de configuration se trouve bien dans un sous-dossier dédié (/src/confs par exemple), un sous-dossier « reports » sera créé dans le dossier « src ». A l’intérieur de ce dossier seront créés les reportings au format html, ainsi que les screenshots.

A chaque lancement, son contenu sera supprimé. Si vous souhaitez conserver les résultats des tests d’un lancement à l’autre, mettez à true la variable preserveDirectory lors de l’instanciation de votre HtmlScreenshotReporter :

preserveDirectory: true,

Dans ce cas, un sous-dossier avec un nom aléatoire sera créé à l’intérieur du dossier « reports ».

filename: 'reporting-' + getDate(true) + '.html',

La variable filename, sans surprise, définit le titre du fichier de reporting ; ici, nous avons choisi de lui ajouter la date et l’heure (voir la fonction « getDate » en bas du fichier).

reportOnlyFailedSpecs: false,
captureOnlyFailedSpecs: true,

Les variables reportOnlyFailedSpecs et captureOnlyFailedSpecs permettent de consigner tous les cas de tests dans le reporting, mais de ne prendre un screenshot qu’en cas d’échec.

showQuickLinks: true,

La variable showQuickLinks est à false par défaut. Ici, elle permet de générer au début du fichier des liens vers chacun des cas de test en échec. Pratique quand on se retrouve avec une très grande campagne de test.

reportTitle: "Rapport de tests automatisés du " + getDate() + "",

La variable reportTitle configure le titre qui s’affiche en haut du rapport html.

reportFailedUrl: true,

La variable reportFailedUrl permet d’afficher dans le reporting l’URL sur laquelle l’échec a eu lieu.

pathBuilder: function(currentSpec, suites, browserCapabilities) {
    return currentSpec.fullName + "--" + browserCapabilities.get('browserName');
}

La fonction pathBuilder permet de définir le nom des fichiers de screenshot. Ici, le nom est composé du titre du cas de test et du nom du navigateur.

Notre série sur Protractor est maintenant terminée. En espérant qu’elle vous aura apporté des éléments, nous sommes curieux d’avoir vos retours sur ce framework.

Pour en savoir plus sur les différents outils de tests automatisés ainsi que leurs usages et leurs bonnes pratiques, rendez-vous ici !

Protractor + AngularJS : Gestion des jeux de données et des dépendances du projet

Note préalable : cet article date de 2017. Depuis, Protractor a atteint la fin de sa vie. Merci à lui et surtout aux personnes qui ont contribué à cet outil !

Le problème du tas

Au commencement d’un projet de test, surtout si celui est censé n’être qu’un POC ou un tout petit projet, on a tendance à coder les jeux de données en dur dans le script et à télécharger les librairies au fil de l’eau. Trèèès bieeeen… tant que ça ne dure pas ! Car comme écrivait Beckett en 1957 :

Les grains s’ajoutent aux grains, un à un, et un jour, soudain, c’est un tas, un petit tas, l’impossible tas.

Un tas qu’il n’est pas facile à gérer quand on revient sur le projet quelques mois plus tard, ou qu’un collègue doit travailler dessus pendant qu’on est en vacances à Ouvéa.

Aujourd’hui donc, on vous donne des pistes pour gérer les jeux de données et les librairies de votre projet. Cet article est le deuxième de notre série sur les test Protractor :

  1. Installation et exemple de script
  2. Gestion des jeux de données et des dépendances du projet
  3. Structure d’un projet industrialisé

Quels problèmes souhaitons-nous éviter ?

Pour comprendre l’intérêt de ce qui va suivre, penchons-nous sur ce petit texte :

« Vous a-t-on déjà parlé de la Nouvelle Calédonie, un archipel du Pacifique dont la capitale est Nouméa, qui compte quelque 300 000 habitants et dont la devise est le franc pacifique ? Recherchez le taux de change actuel entre le franc pacifique et l’euro. La Nouvelle Calédonie, un archipel du Pacifique dont la capitale est Nouméa, qui compte quelque 300 000 habitants et dont la devise est le franc pacifique, possède un lagon exceptionnel, classé au patrimoine mondial de l’Unesco. Recherchez depuis quand c’est le cas. L’oiseau fétiche de la Nouvelle Calédonie, un archipel du Pacifique dont la capitale est Nouméa, qui compte quelque 300 000 habitants et dont la devise est le franc pacifique, est le cagou, un oiseau à huppe presque incapable de voler. Trouvez d’où lui vient son nom. Il est très agréable de vivre en Nouvelle Calédonie, un archipel du Pacifique dont la capitale est Nouméa, qui compte quelque 300 000 habitants et dont la devise est le franc pacifique, cependant il faut tenir compte du fait que ce coin de paradis se trouve à quelque 16 000 kilomètres de la métropole. Vérifiez que Nouméa et la ville française la plus éloignée de Paris. »

Du point de vue du lecteur, ce texte est totalement redondant et illisible. Vous auriez préféré ne lire chaque information qu’une seule fois, et votre cerveau aurait rattaché chacune de ces données à la variable « Nouvelle Calédonie », qu’il possédait peut-être déjà. Cela vous aurait permis de vous concentrer davantage sur les questions.

Si l’on se place du point de vue de l’auteur, au prochain recensement de la Nouvelle Calédonie, il faudra qu’il remplace chaque occurrence de « 300 000 » par, peut-être, « 320 000 » ou « 350 000 ». Au fil du temps, le texte s’allongeant les mises à jour deviendront de plus en plus fastidieuses.

Ce texte est comme un projet de test mal architecturé, qui en un seul bloc fournit une multitude d’informations souvent répétitives sur le SUT, et sollicite dans la foulée des vérifications.

La bonne pratique

Autant que possible, nous allons donc prendre soin de séparer les moments où :

  • on configure les données du test,
  • on donne des informations sur le SUT (identificateurs d’objets, descriptions de page),
  • on effectue des vérifications (tel élément est présent, tel texte est visible).

Gestion des données de test avec jasmine-data-provider

En automatisation des tests, une bonne pratique consiste à séparer les données du test et les scripts d’exécution. Cela augmente la maintenabilité des tests et permet aussi à tout un chacun de mettre à jour le jeu de données, sans avoir à connaître l’architecture du projet sur le bout des doigts.

Qui plus est, cela permet d’alimenter un même script avec X jeux de données, et d’augmenter la couverture des tests à moindre coût .

Avec Protractor, le plugin jasmine-data-provider par exemple permet d’implémenter cette séparation données/scripts.

Pour l’utiliser dans l’exemple précédent, nous allons suivre trois étapes.

1) Importer jasmine-data-provider

A la racine de votre projet, téléchargez le package jasmine-data-provider :

npm install jasmine-data-provider --save-dev

Un dossier node_modules va se créer à la racine de votre projet et contenir le paquet voulu.

Il existe une autre manière de procéder, que nous verrons plus tard. En attendant, veillez juste à ne pas répertorier le dossier node_modules dans votre outil de versionning. Par exemple, si vous utilisez Git, ajoutez la ligne « node_modules/ » dans votre fichier .gitignore et votre projet restera léger comme une plume.

2) Modifier le fichier de configuration

Ici, il n’y a qu’une ligne à ajouter :

framework: 'jasmine2'

3) Créer un fichier de données

Ce fichier doit être au format .js. Appelons-le jeux-de-donnees-demo.js.

Ici, nous avons 2 séries de jeux de données. La première comprend 5 jeux de données avec chacun 1 paramètre : le prénom. Outre les caractères spéciaux courants dans la langue française, nous voulons savoir si d’autres caractères spéciaux (ici, arabes et chinois) apparaissent correctement, et si les scripts Javascript sont traités comme du simple texte.

La deuxième série, destinée à générer un faux positif,  a 2 paramètres : le prénom saisi et le prénom attendu.

'use strict';

 module.exports = {
    prenoms: {
        'ASCII': { prenom: 'Robert' },
        'Caractères spéciaux français': { prenom: 'Rôbértà' },
        'Caractères spéciaux arabes': { prenom: 'صباح الخير' },
        'Caractères spéciaux chinois': { prenom: '安' },
        'Script': { prenom: "<script type='text/javascript'>alert('Faille 1');</script>"}
    },

    faux_positif: {
        'Fail !': { prenomSaisi: 'Chloé', prenomVoulu: "Zoé" }
    }
}

La mention « use strict » est facultative mais conseillée, car elle garantit que le code est bien formé.

4) Exploiter le fichier de données au sein du script de test Protractor

Nous allons un peu transformer le script de l’article précédent :

var donnees = require('./jeu-de-donnees-demo.js');
var using = require('jasmine-data-provider');

describe("Suite de test de la feature qui dit bonjour", function() {

    beforeEach(function () {
        browser.get(browser.baseUrl);
    });

    using(donnees.prenoms, function (data, description) {
        it("Chaîne de type " + description, function () {
            element(by.model('yourName')).sendKeys(data.prenom);
            var message= element(by.xpath("//div[contains(@class, 'well')]//h1"));
            expect(message.getText()).toEqual('Hello ' + data.prenom + '!');
        });
    });

    using(donnees.faux_positif, function(data, description) {
        it("Si je rêvasse en écrivant mon script de test, j'obtiens un faux positif", function() {
            element(by.model('yourName')).sendKeys(data.prenomSaisi);
            var message= element(by.xpath("//div[contains(@class, 'well')]//h1"));
            expect(message.getText()).toEqual(data.prenomVoulu);
        });
    });
});

Au début du script, on indique que l’on souhaite utiliser jasmine-data-provider, ainsi que le chemin de notre fichier de données.

Pour le premier cas de test, on déclare qu’on va utiliser la série de données intitulée « prenoms », ce qui nous donne accès aux données (« data ») ainsi qu’au nom de chaque jeu de données (« description »). Pour accéder au paramètre « prenom », il suffit d’indiquer « data.prenom ».

Nous avons également choisi de factoriser, entre les deux cas de test, la première étape, à savoir la consultation de l’URL de base du projet :

beforeEach(function () {
    browser.get(browser.baseUrl);
});

Au lancement, la même méthode de test sera lancée autant de fois qu’il y a de jeux de données, avec les paramètres correspondants.

Gestion des données de test avec csv-parse

NB : cette section a été ajoutée en décembre 2020.

Si vous préférez exploiter des fichiers CSV, c’est possible aussi en utilisant le module csv-parse.

Commencez par installer ce module avec la ligne de commande suivante :

npm install csv-parse

Dans cet exemple, nous utiliseront un fichier de jeu de données nommé donnees.csv, et qui contiendra les informations suivantes :

login,password,prenom
admin,M0t2p@sseAdmin,Amira
user,M0t2p@sseUser,Boniface

Nous allons appeler ce jeu de données dans le script suivant, qui vérifie qu’à l’authentification sur un certain site web, on se retrouve sur une page où l’on voit la mention « Bonjour » suivie du prénom de l’utilisateur.

'use strict';
let fs = require('fs'); // fs pour file system. Il n'y a rien besoin d'installer pour utiliser cela.
const parse = require('csv-parse/lib/sync');
let a = fs.readFileSync('donnees.csv');

const testdata = parse(a, {
    columns: true,
    skip_empty_lines: true
})

describe('Suite de tests d'authentification', function () {
    for (let i of testdata) {       
        it('Connexion et affichage de la page d'accueil', async function () {
            browser.get(browser.baseUrl)
            console.log("Saisie du login : " + i.login)
            element(by.id('input-login-username')).sendKeys(i.login)
            console.log("Saisie du mot de passe : " + i.password)
            element(by.id('input-login-password')).sendKeys(i.password)
            element(by.id('button-login-submit')).click()
            console.log("Vérification de l'affichage des salutations")
            var message= element(by.xpath("//div[contains(@class, 'h1')]"))
            expect(message.getText()).toEqual('Bonjour ' + i.prenom)
        });
    }
});

Et voilà !

(Fin de l’EDIT)

Gestion des dépendances avec le package.json

Nous venons de voir comment rapidement ajouter la dernière version de jasmine-data-provider. Mais cette façon de procéder n’est pas la meilleure au sein d’un projet industrialisé, où certaines problématiques se posent :

  • Comment alléger le projet de tests Protractor ?
  • Comment faire en sorte que tous les membres de l’équipe utilisent la même version de jasmine-data-provider ?

C’est à ce moment qu’intervient le fichier package.json. Ce fichier, que l’on va placer à la racine du projet, contient une liste de tous les packages dont a besoin le projet. Si vous venez de l’univers Maven, cela devrait vous rappeler le pom.xml, ou le build.gradle si vous venez de la constellation Gradle.

Et la bonne nouvelle, c’est que npm propose une façon rapide de générer un fichier package.json ! Pour ce faire, placez-vous à la racine de votre projet, et tapez la commande :

npm init

Une série de questions sur votre projet vous est posée. Des réponses par défaut vous sont proposées. Pour un petit projet tel que nous venons d’en créer, l’opération dure moins d’une minute.

La valeur entrée pour le « main » dans l’utilitaire n’importe pas du tout ici. Vous pourrez la supprimer de votre package.json.

Pour le « test command », entrez la commande suivante :

node_modules/.bin/protractor src/conf-demo.js

A ce stade, le fichier généré ressemble à cela :

{
  "name": "hightest-demo",
  "version": "1.0.0",
  "description": "Un petit projet de démo pour présenter les tests Protractor",
  "dependencies": {
    "jasmine-data-provider": "^2.2.0"
  },
  "devDependencies": {},
  "scripts": {
    "test": "protractor src/conf-demo.js"
  },
  "author": "",
  "license": "ISC"
}

L’utilitaire a automatiquement détecté le package jasmine-data-provider, et l’a donc déclaré dans le package.json. Vous avez remarqué ce petit accent circonflexe juste avant le numéro de version ? Il fait partie de la syntaxe de versionning de npm (que nous vous invitons à découvrir ici) et permet ici de bénéficier des mises à jour non-majeures du paquet.

Cependant, nous vous conseillons autant que possible de fixer les versions de vos projets, afin d’être sûr d’avoir des configurations similaires d’une machine à l’autre.

Vérifions que tout marche bien : supprimons sauvagement le dossier node_modules créé précédemment, et lançons la commande « npm install » à la racine du projet. Et hop, le dossier réapparaît.

De bonnes fondations sont posées, mais il reste encore quelques éléments à prendre en compte pour que le projet soit industrialisable. A demain pour aller encore plus loin avec votre projet de test Protractor !

Découvrez nos autres séries d’articles !

Notre saga du test audiovisuel

Notre série dédiée aux tests de sécurité

Le kit de secours métaphorique du testeur agile

Protractor + AngularJS : installation et exemple de script

Note préalable : cet article date de 2017. Depuis, Protractor a atteint la fin de sa vie. Merci à lui et surtout aux personnes qui ont contribué à cet outil !

Pourquoi Protractor ?

Protractor est un framework de test dont le but est de faciliter l’automatisation des tests fonctionnels pour les SUT (system under test) développés avec AngularJS. Il se base sur WebdriverJS, l’implémentation Javascript de Selenium, et intègre des solutions telles que Jasmine, qui permet de rédiger des tests en BDD (behavior-driver development), ou encore Cucumber et Mocha.

Protractor reconnaît les concepts AngularJS, tels que les attributs ng-repeaterng-controllerng-model… qui sont employés dans le code HTML pour manipuler les composants web.

D’autres frameworks de test sont bien sûr capables d’automatiser les applications AngularJS, mais utiliser Protractor améliore :

  • la rapidité d’écriture des tests
  • leur maintenabilité (passer par des xpath ou des sélecteurs CSS serait moins robuste)
  • leur lisibilité

Inversement, il est possible d’utiliser Protractor pour automatiser les tests d’une application non-AngularJS (voir cet article).

Nous vous proposons donc une série d’articles sur Protractor :

  1. Installation et exemple de script (le présent article !)
  2. Gestion des jeux de données et des dépendances du projet
  3. Structure d’un projet industrialisé

Nous utilisons ici la version 5 de Protractor.

Installation de Protractor

Voici quelques prérequis avant de pouvoir vous lancer dans les tests avec Protractor :

  • Avoir NodeJS installé sur sa machine (ce qui permet d’utiliser npm)
  • Pour l’installation, lancer les commandes suivantes :

npm install -g protractor
webdriver-manager update

  • Pour démarrer le serveur Selenium sur votre machine, démarrer une invite et lancer la commande :

webdriver-manager start

EDIT de décembre 2020 : Si à ce moment-là votre invite de commande vous indique que « java n’est pas reconnu en tant que commande interne ou externe », assurez-vous que votre PATH contient bien le chemin vers le dossier « bin » qui se trouve dans le dossier où est installé Java. Ca peut ressembler à C:Program FilesJavajdk-xx.x.xbin. (Fin de l’EDIT)

Par défaut, le serveur Selenium est lancé sur le port 4444. Vous pouvez changer le port en ajoutant un paramètre à la commande.

webdriver-manager start –seleniumPort 5555

Tant que vous utiliserez Protractor sur votre machine, ne fermez pas cette invite.

Pour vérifier que le serveur est bien lancé, rendez-vous sur http://localhost:4444/wd/hub (en changeant le port si besoin).

Exemple de test Protractor

Au cours de ce test, nous allons interagir avec un composant de la page d’accueil du site d’AngularJS.

Sur cette page, quand l’utilisateur entre une chaîne de caractères dans le champ « Name », la phrase de salutations se met immédiatement à jour. C’est cette fonctionnalité que nous allons tester.

Dans l’inspecteur, on voit que l’attribut « ng-model » du champ de saisi a pour valeur « yourName » ; c’est cet attribut qui va nous servir lors de l’identification de l’objet.

Nous avons maintenant besoin de 2 fichiers : le fichier de configuration, qui permet de lancer le test, et le script de test en lui-même.

Un script de test Protractor

Le fichier de test (appelons-le dis-bonjour.js) a le contenu suivant :

describe("Suite de test de la feature qui dit bonjour", function() {

  it("Test 1 : si je renseigne mon nom, la feature me dit bonjour", function() {
    browser.get(browser.baseUrl);
    element(by.model('yourName')).sendKeys('Zoé');
    var message= element(by.xpath("//div[contains(@class, 'well')]//h1"));
    expect(message.getText()).toEqual('Hello Zoé!');
  });

  it("Test 2 : si je rêvasse en écrivant mon script de test, j'obtiens un faux positif", function() {
    browser.get('https://angularjs.org');
    element(by.model('yourName')).sendKeys('Chloé');
    var message= element(by.xpath("//div[contains(@class, 'well')]//h1"));
    expect(message.getText()).toEqual('Hello Zoé!');
  });

});

EDIT de décembre 2020 : si vous souhaitez lancer vos tests sur une application qui n’est pas une application Angular, il est important d’intégrer la commande suivante à vos scripts, afin qu’elle empêche Protractor d’attendre qu’Angular soit correctement chargé : browser.waitForAngularEnabled(false). (Fin de l’EDIT)

Structure et la syntaxe du script Protractor

Conformément à la syntaxe Jasmine, la suite de test se déroule dans la fonction « describe ». Chaque test est détaillé dans une fonction « it ».

L’URL de base (browser.baseUrl) est définie dans le fichier de configuration. Rien n’empêche bien sûr d’utiliser une autre URL (comme par exemple dans le deuxième test du fichier).

Fichier de configuration Protractor

Et maintenant, le fichier de configuration qui va permettre de lancer ces deux courts tests. Appelons-le conf.js. Celui-ci est minimaliste et ne contient que l’adresse du serveur Selenium, le chemin du script de test, et l’URL du SUT.

exports.config = {
  seleniumAddress: 'http://localhost:4444/wd/hub',
  specs: ['dis-bonjour.js'],
  baseUrl: 'http://monsupersiteweb.nc'
};

Lancer les tests Protractor en ligne de commande

Maintenant, pour lancer les deux tests contenus dans le script, il suffit d’ouvrir une invite de commande, de se positionner dans le dossier contenant les deux fichiers et de lancer la commande :

protractor conf.js

Remarque : il est possible de changer la baseUrl au moment du lancement du test, ce qui donne :

protractor --baseUrl=http://monsupersiteweb.nc conf.js

Ce qui est pratique si l’on souhaite faire tourner les tests sur différents environnements par exemple.

Par défaut, c’est un navigateur Google Chrome qui s’ouvre et exécute les scénarios définis dans le script de test Protractor. Ce qui donne, dans notre cas, le résultat suivant :

Plutôt clair, non ?

Protractor et les IDE

Pour l’écriture des tests, un simple éditeur de texte suffit pour si l’on veut juste tester les commandes de bases et se faire une idée rapide des possibilités du framework. Mais pour industrialiser un projet de tests automatisés, il est bien sûr préférable d’utiliser un IDE. Il existe des plugins Protractor pour IntelliJ et pour Eclipse. Il est à noter que celui d’IntelliJ n’est disponible que si l’on dispose d’une licence commerciale (version Ultimate, et non Community). Il est possible d’essayer gratuitement la version Ultimate pendant 30 jours.

Protractor avec Eclipse

EDIT de décembre 2020 : le bug évoqué est peut-être résolu depuis, nous n’avons pas réessayé. (Fin de l’EDIT)

Configurer le plugin Protractor d’Eclipse nécessite quelques manipulations en plus (détaillées dans cette vidéo). Attention toutefois, en mars 2017 un bug empêchait le plugin de tourner correctement.

Une erreur s'affiche : "SyntaxError: Unexpected token ..."

En effet, la configuration de Run Protractor utilise par défaut la version 4.2.4 de NodeJS, alors que 2 versions majeures ont été publiées depuis !

Indiquer un chemin vers un exécutable plus récent est possible, mais provoque une erreur : « Error while launching client file, Cannot find node install path node-native ».

A suivre donc… Pour la suite de cette série d’articles, nous utiliserons donc la solution d’évitement : passer sur la version d’essai d’IntelliJ.

Protractor avec IntelliJ

  1. Créez un projet.
  2. Dans le fichier src, placez vos 2 fichiers (test et configuration).
  3. Créer une « Run configuration » Protractor
  4. Renseigner le chemin vers le fichier de configuration. Les chemins vers NodeJS et Protractor sont, normalement, trouvée automatiquement.

Voilà ce à quoi ressemblent les résultats d’exécution :

Protractor avec Visual Studio Code

Ce paragraphe est un EDIT de décembre 2020.

Ouvrez une nouvelle fenêtre de Visual Studio code ; dans la partie de droite de l’écran s’affiche un encart appelé « Customize ». Dans la partie « Tools and languages », faites en sorte que VSC supporte JavaScript, TypeScript, et si vous le sentez vous pouvez également installer d’autres extensions telles que Mocha Snippets ou Protractor Snippets, qui proposent des raccourcis permettant d’accélérer la saisie des scripts de test Protractor.

Cette manipulation décuplera votre productivité par l’autocomplétion !

(Fin de l’EDIT)

On se retrouve demain pour aller plus loin dans l’exploration de Protractor. Car on ne veut pas seulement créer un test, on veut pouvoir le jouer avec une multitude de jeux de données !

Comprendre SonarQube en 8 questions-réponses

1. Pourquoi utiliser SonarQube ?

SonarQube est un outil d’analyse statique qui a pour but de mesurer la qualité du code d’un applicatif. Pour un projet donné, il fournit des métriques portant sur la qualité du code et permet d’identifier précisément les points à corriger (code mort, bugs potentiels, non-respect des standards, manque ou surcharge de commentaires…) Très utilisé dans les DSI, il gagne donc à être connu au moins dans ses grandes lignes !

2. Quels défauts SonarQube permet-il d’identifier ?

SonarQube classe les défauts logiciels selon 3 catégories :

  • Les bugs : anomalies évidentes du code. Ils impactent la fiabilité (reliability) de l’application.
  • Les vulnérabilités : faiblesses du code pouvant nuire au système. Elles impactent la sécurité de l’application.
  • Les « code smells » : anti-patrons (ou anti-patterns). Ils impactent la maintenabilité de l’application.

3. Qu’est-ce qu’un code smell ?

En peu de mots, du code qui sent le roussi ! Wikipedia donne quelques exemples de code smells. En général, SonarQube détecte davantage de code smells que de bugs ou de vulnérabilités. Il est donc important de déterminer si l’on souhaite tous les corriger, ou si certains peuvent être acceptés (mais nous en reparlerons tout à l’heure !)

4. SonarQube et les tests unitaires, c’est pareil ?

Attention ! Même si les deux se focalisent sur le code, et non sur les interfaces des applications à tester, il ne faut pas confondre les analyses SonarQube et les tests unitaires. Ce n’est pas du tout la même chose. Premièrement, les tests unitaires exécutent des composants de l’application à tester ; ils ne font donc pas partie des outils d’analyse statique. Deuxièmement, les tests unitaires permettent de vérifier des fonctionnements de l’application, alors que les analyses SonarQube s’attachent à la qualité du code, sans savoir ce que ce code est censé faire.

Pour faire un parallèle, les logiciels sont comme des textes dont les tests unitaires vérifient le sens et la cohérence, et dont SonarQube vérifie l’orthographe et la lisibilité. Dans son roman Sodome et Gomorrhe, Marcel Proust a écrit une phrase de 856 mots ; si ce roman était un logiciel, SonarQube aurait sans doute remonté une erreur (mais les tests unitaires seraient passés !)

L’analyse SonarQube ne remplace donc en aucun cas les tests unitaires, mais permet d’identifier rapidement certains défauts du code.

5. Comment lancer une analyse SonarQube sur un projet ?

Prérequis

Installer SonarQube (voir la documentation officielle).

Démarrer votre instance avec la commande :

service sonar start

Configurer l’analyse SonarQube

  • A la racine du projet, créer un fichier intitulé « sonar-project.properties ».
  • Compléter ce fichier avec le texte suivant :

sonar.projectKey=nom.du.projet

sonar.projectName=Nom du projet

# La version de votre projet, pas celle de SonarQube
sonar.projectVersion=1.0

# Définit l’emplacement des sources que SonarQube va analyser.
sonar.sources=.

# A décommenter si besoin
#sonar.sourceEncoding=UTF-8

  • Toujours à la racine du projet, lancer la commande « sonar-scanner ».

6. Quelles sont les fonctionnalités de SonarQube ?

Rentrons maintenant dans le vif du sujet en faisant le tour des principales fonctionnalités de SonarQube !

Analyse des résultats SonarQube

En supposant que SonarQube soit en local, les résultats de l’analyse seront consultables sur http://localhost:9000/sonar/. Chaque projet dispose d’un espace d’analyse dédié.

Ecran d’accueil de SonarQube

Sur l’écran d’accueil d’un projet analysé par SonarQube se trouve un récapitulatif des grandes familles de défauts :

La mention « Passed » signifie que le projet satisfait les exigences minimum définies dans l’espace « Barrières qualité ». Les paramètres par défaut peuvent être adaptés.

Onglet « Défauts »

Dans cet onglet, chaque bug, vulnérabilité ou code smell est répertorié et détaillé dans une liste.

L’intérêt immédiat, orienté projet : tel un outil de bugtracking ou de gestion de tickets, cette liste permet de prioriser les points à traiter, d’évaluer leur temps de correction et de les affecter à un développeur. Le statut de chaque défaut est affiché. Les options du projets, tels que l’utilisateur affecté par défaut, peuvent être configurés (onglet « Configuration » -> « Configuration du projet »).

En se positionnant en vue « Effort », on peut également voir le temps total que prendrait la correction de tous les défauts du code, ce qui peut faciliter la planification du travail d’un développeur lors d’un sprint par exemple.

Le second intérêt, orienté humain : comme chaque défaut comporte une explication détaillée et des pistes d’amélioration, le développeur est susceptible de monter en compétence et d’améliorer à long terme la qualité de son code. C’est donc un véritable outil d’amélioration continue !

Onglet « Mesures »

On y trouve des infos supplémentaires, plus générales, telles que la complexité du projet et le pourcentage de commentaires (20% étant habituellement reconnu comme un bon pourcentage). Contrairement à l’écran précédent, celui-ci n’est pas très bavard : à l’utilisateur de trancher si le taux de complexité est acceptable, par exemple. Pour en savoir plus sur les méthodes de calcul de la complexité, rendez-vous ici.

Onglet « Code »

Cet onglet est particulièrement pratique. Il permet en effet de visualiser, fichier par fichier, les problèmes identifiés par SonarQube. Le code est intégralement affiché, avec des icônes au niveau des lignes posant problème.

Onglet « Tableau de bord »

Sur cette page sont rassemblées un grand nombre de métriques utiles pour communiquer sur la qualité du code. Les dashboards sont configurables selon un grand nombre de paramètres.

Penchons-nous maintenant sur le cœur de SonarQube, à savoir la définition des règles de qualité du code.

Gestion des règles SonarQube

Liste des règles

La liste exhaustive des règles associées aux défauts est disponible à cette adresse : http://localhost:9000/sonar/coding_rules.

Dans cet espace, il est possible de modifier la sévérité que SonarQube attribue à chaque défaut. La détection de certains défauts peut aussi être désactivée. Lors des analyses suivantes, ils seront donc ignorés.

Adapter les règles SonarQube existantes

Le contenu de certaines règles peut être configuré. Par exemple, la règle de nommage des variables locales en Java est vérifiée grâce à une expression régulière qui peut être changée :

Créer des règles SonarQube à partir d’un modèle (template)

Dans la liste des règles, cochez la case « Montrer uniquement les modèles ». A partir des modèles disponibles, vous pourrez créer de nouvelles règles.

Cette fonctionnalité est appréciable, mais il est dommage qu’il y ait si peu de modèles disponibles.

Création de nouvelles règles SonarQube

Il est possible de créer de nouvelles règles ex nihilo, mais la démarche est un peu plus lourde. Effectivement, il est nécessaire pour cela de créer un plugin SonarQube, et donc de maîtriser l’architecture des sources. Mode opératoire ici

7. Comment lancer une analyse SonarQube depuis Jenkins ?

Pour intégrer pleinement SonarQube à votre démarche d’intégration continue, nous vous suggérons de déclencher des lancements automatiques de l’analyse du code depuis Jenkins.

Comment faire ? C’est simple :

  1. Installez le plugin SonarQube
  2. Générez un token dans l’interface SonarQube. Pour ce faire, une fois connecté, cliquez sur votre profil, puis sur « My account » et « Generate tokens ».
  3. Cliquez sur « Administrer Jenkins » puis sur « Configurer le système ». Dans la partie « SonarQube servers », entrez le token précédemment généré.
  4. Créez un job et configurez-le. Créez une étape de build « Lancer une analyse avec SonarQube Scanner ». Si vous ne remplissez pas les champs, ce sont les informations présentes dans le fichier sonar-project.properties qui prévaudront.

SonarQube et Jenkins Pipeline

Comme nous sommes de plus en plus nombreux à mettre en place ce type de jobs, voici un exemple de pipeline très simple réalisant une analyse SonarQube :

node {

// Lors de cette phase de setup, nous récupérons dans le workspace de Jenkins les sources à analyser.
stage(‘Setup’) {
checkout([$class: ‘GitSCM’, branches: [[name: ‘*/master’]], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: ‘***clé générée par le plugin Credentials de Jenkins***’, url: ‘http://votresuperdepot.git’]]])
}

stage(‘Analyse SonarQube’) {
// Le nom du « tool » et de l’argument de « withSonarQubeEnv » correspond au nom de l’instance SonarQube telle que défini dans Jenkins, dans « Configurer le système » > « SonarQube servers » > « Installations de SonarQube » > « Nom »
def scannerHome = tool ‘Sonar’;
withSonarQubeEnv(‘Sonar’) {
sh « ${scannerHome}/bin/sonar-scanner »
}
}

}

8. Qu’est-ce qu’il ne faut pas attendre de SonarQube ?

Une exactitude indiscutable

Il est nécessaire de qualifier chaque défaut que SonarQube identifie ; nul logiciel de test automatisé n’est à l’abri d’un faux positif. Pour reprendre la métaphore du roman, qui oserait « refactorer » les romans de Proust sous prétexte qu’il a écrit un certain nombre de trèèèèès longues phrases ?

Il ne faut pas oublier que les problèmes remontés par SonarQube sont issus de scans qui repèrent des motifs présents dans le code. Parfois, ce sont donc ces motifs qu’il faut interroger et remettre en question. Et c’est bien pour ça que SonarQube propose de pouvoir gérer les règles comme bon nous semble !

Un substitut aux revues de code

Les analyses quantitatives de SonarQube peuvent être trompeuses. En effet, ce n’est pas parce que 20% des lignes d’une application sont des commentaires que ceux-ci sont véritablement utiles et apportent de la valeur. De même, ce n’est pas parce que SonarQube n’a pas identifié de duplications que le programme ne comporte pas de redondances.

Même si SonarQube est très utile pour identifier des défauts spécifiques et donner une vision d’ensemble de la qualité du code, ses analyses gagnent à être complétées par une revue de code réalisée par un humain.

D’ailleurs, si le sujet des revues de code vous intéresse, nous vous conseillons vivement de découvrir l’outil Promyze, plateforme de gestion collaborative de la qualité de code.

Conclusion

SonarQube permet donc d’identifier très rapidement les anomalies de code d’une application. Mais c’est une solution qui doit aller de pair avec une stratégie globale de qualité de code. Il faut connaître son applicatif afin de pouvoir analyser les reportings, trancher sur ce qu’il faut ou non corriger et fixer des seuils en-deçà desquels la qualité sera jugée insuffisante.

Vous aimerez peut-être…

La qualité de code en direct avec SonarLint !

SonarQube met son grain de sel dans Gitlab !

Katalon en 12 questions – réponses

Note du 6 janvier 2020 : Veuillez noter que cet article a été publié en mai 2017 et qu’il se base donc sur une version ancienne de Katalon. Cet outil a connu un essor impressionnant et propose des fonctionnalités qui n’existaient pas auparavant. Avant de prendre une décision quant à la mise en place de cet outil dans votre organisation, il sera pertinent de se pencher aussi sur des témoignages plus récents. Bonne lecture !

1) Qu’est-ce que Katalon ?

Katalon Studio est un framework basé sur Selenium et Appium, qui permet d’automatiser les tests web et mobiles. Dans cet article, nous découvrirons ensemble comment créer un cas de test mobile sur un téléphone Android.

Nous apporterons des réponses aux questions que nous-mêmes nous nous sommes posées avant de commencer avec Katalon. Notre SUT (system under test) sera l’application Observatoire des prix, qui permet de comparer produit par produit les tarifs pratiqués par les grandes surfaces en Nouvelle Calédonie. Développée par One Shot, cette application est une commande du Gouvernement de la Nouvelle Calédonie dans le cadre de la lutte contre la vie chère.

2) Quels systèmes d’exploitation Katalon supporte-t-il ?

Même si cela paraît étonnant, à ce jour, Katalon peut être installé sur Windows, Mac… mais pas sur Linux (source).

EDIT du 3 avril 2019 : Linux est maintenant pris en charge (en bêta), merci à un de nos lecteurs de nous l’avoir signalé par commentaire !

3) Katalon est-il gratuit ?

Développé d’abord en interne par KMS Technology, le projet a ensuite été partagé avec la communauté. L’outil est donc (et a priori restera) disponible gratuitement.

4) Comment débuter avec Katalon ?

Katalon nécessite quelques pré-requis, mais le démarrage se fait facilement. C’est une des exigences du produit, qui se veut accessible à tous.

Voici votre checklist de démarrage :

  • NodeJs est installé
  • Appium est installé (cela peut se faire indifféremment avant ou après l’installation de Katalon). Il faudra ensuite, dans l’interface Katalon, déclarer l’emplacement d’Appium.
  • Votre téléphone Android est branché à votre ordinateur via un câble USB.
    • Attention, votre téléphone ne doit pas être verrouillé par un mot de passe ou autre code durant l’exécution des tests. En l’état, Katalon ne permet pas de gérer le déverrouillage.
    • Autre point à vérifier : l’écran ne doit pas s’éteindre trop vite. Configurez votre téléphone pour que son écran s’éteigne au bout du seuil maximum.
    • EDIT du 8 février 2019 : ces points semble avoir avancé, voir la documentation dédiée au déverrouillage d’écran.
  • Le mode développeur est activé sur votre téléphone. Pour ce faire, il faut cliquer 7 fois sur le numéro de version (on dirait une formule magique ce n’est pas une blague !). L’emplacement de cette information dépend du téléphone, mais on peut trouver par exemple dans Paramètres > A propos de l’appareil > Infos logiciel.
  • Le débogage USB est autorisé sur votre téléphone. Rendez-vous dans les « Option de développement » qui apparaissent dans le menu principal lorsque le mode développeur est activé. Une popup apparaît pour demander si l’on peut faire confiance à l’ordinateur connecté. Si cette popup n’apparaît pas, débrancher et rebrancher le téléphone.

5) La documentation de Katalon est-elle suffisante ?

Les quelques modes opératoires qui existent sont clairs, mais ils sont peu nombreux. Le forum Katalon comble en partie ce manque. Extrêmement réactif, il nous a à chaque fois permis d’obtenir des réponses à nos questions en quelques heures seulement !

En-dehors du site officiel, il existe peu de ressources sur cet outil. A ce jour, aucune question n’a été posée sur Katalon sur le célèbre forum StackOverflow. EDIT du 27/03/2019 : ce n’est plus le cas ! Voici différentes étapes du développement du sujet sur ce site de questions-réponses.

Avril 2017 : le désert

En avril 2017, il n'y avait aucun post StackOverflow sur Katalon

Janvier 2018 : l’éclosion

En janvier 2018, il y avait 80 posts StackOverflow sur Katalon

Mars 2019 : l’explosion

En mars 2019, nous constatons qu'il y aura bientôt 600 posts StackOverflow sur Katalon

Juin 2020

(Au passage, on admire le nouveau mode nuit de StackOverflow… synonyme de confort supplémentaire et, selon le matériel utilisé, de meilleures performances environnementales !)

En juin 2020, on approche les 1000 posts

6) Les cas de test Katalon sont-ils maintenables ?

Quel sentiment magique ressent le testeur lorsque, pour la première fois depuis le début du projet, il lance son arsenal de tests automatisés…

Hélas, cette touchante émotion peut vite laisser place au désappointement si la maintenabilité n’a pas été au coeur de la conception de l’architecture des tests.

Heureusement, Katalon répond à cette problématique essentiellement grâce à 2 fonctionnalités :

  • le dépôt d’objets (object repository)
  • les mot-clés personnalisés (custom keywords)

Reconnaissance des objets avec l’Object repository

Comme avec UFT, que nous présentions précédemment, l’object repository permet de gérer en un même lieu tous les identificateurs d’éléments de l’interface. Un atout indispensable en cas de refonte de l’ergonomie. Au lieu de modifier chacun des tests utilisant un même objet, on ne modifie que la définition de l’objet ayant subi une modification.

Pour alimenter l’object repository, il faut utiliser l’un des deux outils de capture : « Spy Web » et « Spy Mobile ». L’utilisateur sélectionne alors, en s’aidant d’une preview, les objets qui l’intéressent. Pour ceux à qui cela fait peur, pas besoin de mettre le nez dans le code.

Le testeur peut ensuite cocher ou décocher les cases qu’il trouve les plus pertinentes.

Encapsulation d’actions avec les Custom keywords

Les custom keywords sont en fait des méthodes (au sens programmatique du terme) que l’on peut appeler au sein des cas de test. Prenons par exemple l’enchaînement d’actions permettant l’authentification d’un utilisateur : au lieu de copier-coller, au sein de chaque cas de test, qu’il faut :

  1. Vérifier que l’on se trouve sur la page d’authentification
  2. Entrer tel identifiant
  3. Entrer tel mot de passe
  4. Cliquer sur le bouton « Valider »
  5. Attendre que la page d’accueil apparaisse

Il suffit de créer un custom keyword qui prenne en paramètre l’identifiant et le mot de passe.

Cela améliore à la fois la lisibilité du test, car il y a moins d’étapes, mais aussi sa maintenabilité. Par exemple, si un jour une case « Se souvenir de moi » est ajoutée à cette page de connexion, il suffira d’ajouter une étape au custom keyword, et un paramètre pour choisir si l’on souhaite cocher la case ou non.

Notre conseil : bien réfléchir à l’organisation de ces custom keywords avant de se lancer à corps perdu dans l’automatisation des scripts de test. Sans cette étape, la scalabilité de votre projet risque d’en prendre un coup.

7) Katalon s’intègre-t-il avec Jenkins ?

Oui, on peut faire de l’intégration continue avec Katalon et Jenkins. Mais souvenez-vous… pas sur une machine Linux.

Dans l’interface de Katalon, cliquez sur le bouton « Build CMD », configurez votre exécution, puis copiez la commande générée.

Sur une instance Jenkins installée une machine Windows, créez un job free-style et ajoutez une étape de build « Exécuter une ligne de commande batch Windows ».

La commande à exécuter est la suivante :

cd chemin/vers/katalon.exe
[commande générée précédemment via Katalon]

Ce qui donne quelque chose comme ça :

Une limitation à noter

Les rapports de test sont stockés dans le dossier « Reports » consultable dans Katalon, et non pas dans le workspace de Jenkins. Nativement, un tel job ne permet pas d’en déclencher un autre (un fonctionnement courant dans une démarche d’intégration continue).

8) Puis-je lancer des tests automatisés sur iOS ?

Oui, mais seulement depuis un Mac (source).

9) Katalon s’interface-t-il avec des bugtrackers ou des outils de test management ?

A l’heure actuelle, Katalon s’interface avec Jira pour la gestion des anomalies et qTest pour la gestion des cas de test.

10) L’interface de Katalon est-elle user-friendly ?

C’est assez subjectif mais nous avons trouvé que oui. L’interface rappelle beaucoup celle d’Intellij.

L’outil a été conçu pour être utilisé aussi bien par des automaticiens que par des testeurs ne sachant pas programmer. Les cas de test peuvent donc être conçus en mode « manuel » ou en mode « script » (à noter que les scripts sont en Groovy).

A notre sens, utiliser cet outil peut être un bon moyen de s’initier en douceur aux joies du code. Mais il ne faut pas oublier que certaines fonctionnalités ne peuvent être exploitées pleinement qu’en mode script, par exemple les custom keywords.

A titre d’exemple, voici à quoi ressemble un cas de test en vue manuelle :

Et le même test en vue script :

Côté automatisation web, Katalon propose une fonctionnalité de capture-rejeu (ou playback) qui pourra vous rappeler Selenium IDE. Attention, il ne faut pas en abuser, car en tant que tels ces enregistrement sont un cauchemar pour la maintenance !

11) Existe-t-il une version de Katalon en français ?

Certaines organisations mettent un point d’honneur à utiliser des outils pouvant être configurés en français. Mais en l’occurrence, la réponse est non. De manière générale, il ne fait pas bon être francophone quand on se sert de Katalon… Vous utilisez des caractères spéciaux dans le mode Script ? Vous avez tort. Vraiment.

En mode manuel, heureusement, les caractères spéciaux s’affichent correctement.

Dans le même esprit, dans la popup d’identification des objets web, le raccourci d’enregistrement est Alt + ~. Infaisable avec un clavier français, sachant que la tilde nécessite trois touches différentes… Et à l’heure actuelle, ce raccourci n’est pas configurable dans les options de Katalon. EDIT du 17 avril 2019 : des solutions semblent avoir été apportées entre temps.

Ce ne sont que des détails, mais il est bon de le savoir avant de se lancer.

12) De manière générale, l’automatisation mobile est-elle plus difficile que l’automatisation web ?

Avec Katalon, non, pas vraiment. La gestion des appareils mobiles ajoute un peu de temps de configuration, mais cela ne fait pas de grande différence.

Le problème de l’identification des objets

Mais de manière générale, une application mobile peut être plus difficile à tester si l’équipe de développement n’a pas envisagé la possibilité que des tierces personnes relisent leur code… Lors de la capture des objets, on peut en effet se retrouver face à une liste interminable d’objets aux noms peu parlants.

Super clair !…

Pourquoi est-ce un problème ?

  • Parce que l’automaticien n’est pas toujours sûr de sélectionner le bon objet. Si deux écrans sont superposés et que chacun possède un bouton positionné au même endroit, même le mode visuel ne permet pas de savoir si l’objet sélectionné dans la liste est le bon.
  • Et surtout, parce que la spécificité des identificateurs impacte la robustesse des scripts d’automatisation. Un identificateur comprenant, en dur, un nombre arbitraire (tel bouton est le 27è de la page) est moins robuste qu’un identificateur défini par un « id » unique (« btn_enregistrer » par exemple).

Ce problème peut aussi exister au sein des applications web, mais dans une moindre mesure. En effet, les « id » et les « class » utilisées entre autres pour appliquer une mise en forme CSS au document sont d’une grande aide pour l’automaticien (sauf cas particuliers d’id générés automatiquement).

Ce problème n’est pas propre à Katalon. Si possible, incitez au plus tôt dans le projet les équipes de développement à créer des identificateurs d’objets « automation-friendly ».

Conclusion

Sans conteste, Katalon est un excellent outil. Il est même étonnant qu’il soit si peu connu.

Nous pensons que son plus gros défaut est malheureusement son incompatibilité avec Linux. On peut également déplorer une intégration trop superficielle avec Jenkins. L’outil a bien évolué depuis la publication initiale de cet article ! Voir cette documentation pour l’intégration à Jenkins, via un plugin dédié.

Si ces contraintes ne vous concernent pas, nous vous le recommandons chaleureusement. Nous serons heureux d’avoir vos retours sur ce logiciel.

Et pour en savoir plus sur l’automatisation des tests, nous vous conseillons cette ressource !

Saga de l’audiovisuel – Et l’automatisation alors ?

Saga de l’audiovisuel

Pourquoi automatiser ?

Bienvenue à nouveau dans le monde de l’audiovisuel. Nous avons évoqué les enjeux du test en télévision numérique, ainsi que les différents types de test et leur protocoles. Abordons maintenant le sujet de l’automatisation.

Les pauvres testeurs ! On trouvait ça cool nous, d’être payé à regarder la télé derrière son bureau, mais en fait c’est dur comme boulot !

Exactement, c’est pas tous les jours facile la vie de testeur dans l’audiovisuel, beaucoup de tâches répétitives, j’appuie sur la touche menu, j’observe, je mesure, et à la longue, la concentration diminue, et le risque d’erreur, de passer à côté d’une anomalie augmente.

D’autre part, durant les longues phases de test d’endurance, le testeur connaît l’état de son décodeur au lancement du test, puis à l’issue du test, mais comment savoir s’il n’y a pas eu d’erreur pendant le test, un redémarrage imprévu après lequel la set top box s’est remise sur pied d’elle même, des problèmes de qualité audio/video, un message d’erreur temporaire,…

Certains problèmes, comme un redémarrage du décodeur, peuvent-être détectés en « instrumentant » un décodeur en test, c’est-à-dire, en récupérant les logs ou traces de l’application, mais cette solution a le défaut d’influer sur les performance du décodeur, et ne reproduit pas fidèlement le comportement d’un décodeur sur le terrain qui eux sont configurés pour ne plus produire de logs.

Robots de test

Oyez, testeurs, vous n’êtes pas seuls. Quelques sociétés du secteur informatique et télécommunication, Sopra, S3 TV Technology (racheté par Accenture), ou encore Witbe on mis au point des solutions d’automatisation des test pour la télévision numérique.

Le rôle de ces équipements, ou robots de test, est de reproduire les actions d’un utilisateur réel et d’analyser les comportements du matériel testé.

Pour ce faire, un robot possède des « mains », ou plutôt un émetteur infrarouge (ou bluetooth ou RF) contrôlable avec lequel il peut envoyer des commande au décodeur. Il possède également des « yeux », une carte d’acquisition vidéo lui permettant de visualiser la sortie vidéo du décodeur, des « oreilles », une carte d’acquisition audio pour récupérer la sortie audio, et pour gérer tout ça, un cerveau rapide et puissant, composé d’un processeur, de beaucoup de mémoire vive et d’algorithmes complexes lui permettant par exemple :

  • De reconnaître des images spécifiques : message d’erreur, mogo de démarrage, bannière information, ou toute autre image fixe pouvant être vue par un humain
  • De reconnaître des caractères (OCR) : numéro de chaîne, nom du programme en cours
  • De mesurer le volume audio et inversement de détecter une absence de son ou un niveau anormal
  • De détecter une image figée non prévue
  • De détecter un écran noir

Voici un schéma explicatif d’un environnement de test automatisé au moyen d’un robot de test :

 

La combinaison de toutes les fonctionnalités décrites ci-dessus, offre aux robot de test, la possibilité d’effectuer des tâches répétives et complexes de navigation, de reconnaissance des menus affichés, des mesures précises des temps de zapping ou encore de démarrage.

Les robots n’ont pas besoin de sommeil, ainsi, il peuvent observer, détecter et enregistrer toutes les anomalies survenant jour et nuit ce qui, comme nous l’avons vu précédemment peut s’avérer très utile lors des tests d’endurance.

Les robots possèdent également des capacités d’analyse de la qualité audio/vidéo (QoE pour Quality of Experience). Ils sont notamment capables de détecter des « artefacts », qui sont des défauts de qualité comme la présence de courts écrans noirs, ou encore de macroblocs (présence de carrés anormaux sur l’image, comme quand vous regardez un film en streaming et que soudain, votre débit internet diminue, vous entendez alors des bruits étranges, les glitchs audio, et votre image se dégrade, devient, rouge, verte, violette avec pleins de carrés, comme si l’image se pixelisait.

Enfin, les capacités de reconnaissance d’image des robots permettent également de faire de la supervision afin de connaitre en temps réel la disponibilité des services vidéo (QoS pour Quality of Services) délivrés. Ce sujet s’écarte de la pure problématique qualité d’un décodeur numérique, et touche à la diffusion des programme vidéos (broadcasting). Nous y reviendrons sûrement dans un autre article.

Hommes de test

Ah on est rassurés, on ne leur demande pas d’appuyer 100 000 fois sur une touche de leur télécommande. Mais ils ne risquent pas de se faire virer si des machines peuvent faire leur travail à leur place ?

Aucune chance, et gare à celui qui viserait cet objectif. Les robots n’ont pas de perte de concentration, sont insomniaques et sont des bourreaux de travail, mais ils ont un point faible, ils ont besoin de l’Homme pour savoir quoi faire, comment le faire et pour comprendre leur langage. Ces deux là sont totalement complémentaires, symbiotiques. Les robots soulagent les testeurs en prenant en charge les tâches longues et répétitives, les testeurs, en échange les entretiennent, les optimisent, et interprètes les données qu’ils fournissent.

Le plus souvent, lorsque qu’un robot est déployé, là où il n’y avait qu’un testeur, il y a maintenant, en plus, un responsable d’exploitation chargé de l’infrastructure, de la rédaction et de la maintenance des scripts de tests.

Et côté ROI, pas d’inquiétude non plus, c’est tout de même l’un des interêts, une gestion automatisée des tests augmentera la capacité de l’équipe et la fiabilité des tests, diminuant significativement les coûts de non qualité.

Conclusion

Si nous avions un conseil à vous donner, n’ayez pas peur d’automatiser ! Que ce soit en confiance, en fiabilité, en couverture, en rapidité, vous y gagnerez. Et si nous avions un second conseil à vous donner, automatisez intelligemment ! Toutes les solutions existantes ne vous sont pas forcément nécéssaires. Prenez le soin et le temps d’étudier votre besoin et les compétences de vos équipes avant de vous jeter sur la solution la plus attirante ou la moins chère. A titre d’exemple, il vaut peut-être mieux investir dans une solution plus coûteuse mais pour laquelle l’écriture des scripts se fait dans un langage de programmation déjà connu de vos équipes. Bonne automatisation !

Découvrez nos autres séries d’articles !

Notre série dédiée aux tests de sécurité

Celle dédiée à Protractor

Le kit de secours métaphorique du testeur agile

Saga de l’audiovisuel – Stress, Endurance, Performance

Saga de l’audiovisuel

Les tests non fonctionnels

De retour sur nos petits écrans, pour découvrir maintenant de quelle façon sont testés les aspects non fonctionnels de notre décodeur numérique.

Eh oui, notre équipement doit savoir afficher une chaine de télévision, il doit comprendre quand nous lui donnons un ordre avec notre télécommande, mais il doit être aussi capable de le faire vite, et de le faire bien.

On lui en demande beaucoup à cette pauvre petite boîte éléctronique.

C’est vrai, les testeurs ne sont pas toujours tendres avec leur décodeurs, mais c’est pour la bonne cause.

Tests d’endurance et stress tests

Dans cette catégorie, on ne teste plus les fonctionnalités à proprement parler du décodeur, mais la résistance du système lors de l’exécution prolongée d’une action ou de la répétition d’une action sur une longue durée.

On parlera d’endurance lorsque la charge imposée au système est relativement faible, et de stress lorsque celle-ci est importante au sens de la consommation de ressources.

Live statique

Ce test, d’endurance uniquement, consiste à laisser le décodeur jouer une chaîne en continu (la veille automatique doit être désactivée), et de vérifier que la chaîne continue d’être diffusée sur la durée spécifiée. Les exigences sur cette durée sont variables selon les fabricants, les décodeurs mais aussi en fonction de la catégorie de chaîne que l’on test. En effet, nous pourrons distinguer entre autres les cas suivants avec une consommation de ressources croissante :

  • Chaîne SD (Standard Definition) non cryptée (gratuite)
  • Chaîne SD cryptée (nécessitant un abonnement)
  • Chaîne HD (High Definition) non cryptée
  • Chaîne HD cryptée
  • Chaîne HD cryptée, avec enregistrement d’un programme sur une autre chaîne et timeshift sur la chaîne en cours

Plus la charge augmente, moins la durée exigée est longue. Par expérience, un décodeur devrait pouvoir jouer en continu un programme SD pendant 7 jours en continu sans rencontrer de problèmes, mais dans la pratique ce n’est pas toujours le cas et parmi les problèmes rencontrés par les équipes de validation, entre autre, freeze (image figée), redémarrage spontané, écran noir…

Le protocole ici est on ne peut plus simple, on démarre un ensemble de décodeurs sur la/les chaînes souhaitées en vérifiant l’image et l’audio, on vit sa vie sans y penser pendant la durée exigée, puis « on relève le mur », c’est à dire, qu’on constate l’état des décodeurs à l’issue de cette durée, nombre de OK, nombre de KO, description des KO. Dans la pratique, on vient jeter un œil tous les jours ou plus sur les décodeurs, car s’ils sont tous plantés après 20 minutes, aucun intérêt de poursuivre le test.

AC On / Off

Ici même principe de tenue du système dans la durée, mais l’action est plus agressive. Il s’agit de répéter la séquence : coupure d’alimentation / mise sous tension. En endurance, des séquences répétées de 10 minutes laissent normalement le temps à tous les décodeurs de finaliser leur séquence de démarrage. En stress, les séquences peuvent être très courtes de l’ordre d’une minute. L’intérêt étant de pouvoir valider le comportement du système lors de l’arrêt brutal des processus en court.

Ce test est stressant pour le software et le hardware, mais permet de détecter des défauts lors de la séquence de boot (démarrage) et d’évaluer la probabilité qu’une coupure de courant en utilisation terrain (sur le meuble télé du client) puisse entraîner une anomalie.

Zapping

Qu’est-ce qu’un zapping ? Ça ne sonne pas très scientifique ce mot. Un zapping est un changement de chaîne. Déclenché par l’utilisateur muni de sa télécommande, il s’agit de l’action la plus courante que doit effectuer un décodeur numérique. Il existe beaucoup de « zappings » différents :

  • Par appui sur la touche chaîne suivante, (P+ ou Next Channel pour les intimes) 
  • Par appui sur la touche chaîne précédente, (P- ou Prev Channel pour les intimes) 
  • Par navigation dans l’EPG (Grille des programmes ou Electronic Program Guide pour les intimes)
  • D’une chaîne SD à une chaîne HD et inversement
  • D’une chaîne cryptée à une chaine non cryptée et inversement
  • Avec un enregistrement en cours
  • Avec la fonctionnalité Pip (Picture in Picture qui consiste à afficher une autre chaîne que celle en cours dans un cadre)

Tous ces zappings font appels à des fonctionnalités différentes et ont donc des comportements différents qui doivent être validés. L’action de zapping peut sembler anodine, mais est en réalité assez complexe, et mobilise également beaucoup de ressources au système.  Le schéma suivant illustre les actions mises en œuvre par le décodeur lors d’un changement de chaîne classique (P+) :

  • t1 : Temps d’apparition de la bannière d’information (info banner) ta : Temps d’apparition de l’écran noir de transition
  • t2 : Durée de l’écran noir de transition
  • tb : Durée d’affichage de l’info banner
  • Temps de zapping = ta + t3 , c’est à dire le temps écoulé entre l’envoi effectif de la commande de changement de chaîne par l’utilisateur et la lecture de la chaîne demandée.

 

Que l’info banner soit présente à l’écran ou non, on considère le zapping effectif dès que l’audio et la vidéo de la nouvelle chaîne sont joués. Le test de la fonctionnalité zapping est effectué au moyen de boîtiers infrarouges (certains sont maintenant bluetooth ou RF) programmables (voir Redrat ou encore IRTrans).

De la même manière qu’en live statique, le testeur programme sa télécommande pour répéter l’envoi de la commande de changement de chaîne à intervalle régulier sur une période donnée, puis vient relever l’état du mur de test à l’issue de la campagne (nombre de décodeurs toujours en zapping, nombre de décodeurs ayant rencontré un problème et description du problème).

Pour se faire une idée, en endurance, un intervalle entre deux demandes de zapping de l’ordre de 15 à 20 secondes est une valeur acceptable afin de laisser le temps au décodeur de déclencher puis de stopper l’ensemble des processus associés, le décodeur pouvant supporter cette charge sur de longues périodes (une à plusieurs semaines).

En stress, cette durée est réduite à environ 5 secondes. A cette cadence, le décodeur n’a pas le temps de charger tous les processus avant de devoir les stopper pour répondre à l’ordre suivant. Il est fréquent lors de ce stress test de voir des décodeurs échouer au bout de quelques heures seulement. Ce test est intéressant car il permet de simuler et d’analyser le comportement d’un décodeur par exemple lorsque l’utilisateur s’endort sur sa télécommande. Dans cette situation, le fabricant doit s’assurer que le système tienne la charge, ou à défaut qu’un redémarrage suffise à le relancer.

Tests de performance

Dans le cadre de la validation d’un décodeur numérique, il est intéressant de mesurer différents temps d’action du système selon les fonctionnalités demandées et de s’assurer qu’elles restent dans des seuils acceptables par utilisateur. Parmi ces mesures, on notera les :

Temps de zapping

Comme nous l’avons vu précédemment, la mesure s’effectue entre l’envoi de la commande par l’utilisateur et l’apparition (audio/vidéo) de la chaîne demandée. Pour effectuer cette mesure, le testeur calcule généralement une moyenne à partir d’un échantillon d’une dizaine de mesures effectuée manuellement. Il est difficile de fournir un critère d’acceptation général pour le temps de zapping tant les durées peuvent varier selon les produits et les fonctionnalités activées.

Temps de Boot / Veille

Ici même principe, on ne cherche plus la tenue dans la durée, mais « simplement » à mesurer les durées des différentes étapes de la sortie de veille, ou de la remise sous tension. Comme pour les temps de zapping, le testeur est à son bureau, devant son décodeur et sa télé et son chronomètre. Il démarre son chronomètre au moment précis où il remet le courant dans le décodeur, ou appuie sur le bouton « On », puis marque différents checkpoints temporels à des moments précis tels que : 

  • L’apparition du message « Démarrage en cours » sur le front panel (l’écran à affichage digital dont tous les décodeurs sont munis en façade)
  • L’apparition du logo sur le téléviseur
  • L’apparition du menu principal ou diffusion de l’audio et de la vidéo d’une chaîne.

Ces mesures sont également moyennées sur des échantillons d’une dizaine de mesures.

Conclusion

Une nouvelle fois, cette liste n’est pas exhaustive. Comme pour les test fonctionnels, beaucoup d’autres tests non fonctionnels et mesures de performances sont possibles, comme le chargement et la navigation dans les menus, chargement et navigation dans la grille des programmes, chargement et navigation dans le menu VOD (vidéo à la demande),…

Le but de ces tests est en quelque sorte de s’assurer que votre décodeur résistera à toutes ou, presque toutes les misères que vous pourriez lui faire subir.

Le dernier article de la saga traitera le sujet de l’automatisation des tests en télévision numérique.

Saga de l’audiovisuel – Tests fonctionnels

Saga de l’audiovisuel

Introduction

Les R&Ds des fabricants de décodeurs numériques possèdent une équipe de validation, dédiée à la vérification du bon fonctionnement des produits avant et pendant leur mise en production mais également après, lors des phases de maintenance.

Un bureau de validation de décodeur numérique est généralement un grand open space, rempli de câbles et d’ordinateurs, jusqu’ici rien d’anormal. Mais ils contiennent également un grand nombre d’équipements audio/vidéo splitter (genre de multiprise pour câbles d’antennes, ou câbles vidéo), de un à 4 téléviseurs directement posés sur les bureaux des testeurs, des décodeurs et leur télécommandes partout et mêmes des murs de tests, sortes de grandes colonnes sur lesquels sont montés 4 téléviseurs et munis de plateaux sur lesquels reposent, devinez quoi ?… Et oui, d’autre décodeurs numériques bien sûr.

Au quotidien, dans ces bureaux, les téléviseurs fonctionnent en permanence, affichant des programmes de tous les pays du monde, des films, les infos, les programmes des chaines musicales, et il n’est pas rare de croiser des testeurs, statiques devant une ou plusieurs télé, une télécommande à la main. Ne vous méprenez pas, cette personne travaille, et une partie de son travail consiste précisément à regarder la télé.

Ouah mais c’est trop bien, je veux faire le même travail !!!

Ne vous emballez pas, leur tâche est plus complexe qu’il n’y paraît. Lorsqu’ils semblent se relaxer devant un film récent, ils sont en réalité en pleine concentration, suivant un protocole de test précis, relevant dans le détail les observations qu’ils font sur le comportement du décodeur, suite aux commandes qu’ils lui ont envoyées au cours du test.

Voici quelques exemples de tests fréquents qu’ils peuvent être amenés à effectuer.

Tests fonctionnels

CAS, ou Conditionnal Access System

Outre le décodage du son et de l’image, fonctions principales du décodeur numérique, de nombreuses fonctions secondaires existent, et parmi elles, le CAS pour Conditionnal Access System.

Comme son nom l’indique, la mission du CAS est de contrôler l’accès des utilisateurs à certains programmes en fonction de leur contenu et du contrat souscrit par l’abonné. Je suis abonné à Sci-Fy, ma carte d’abonné le sait et autorise mon décodeur à afficher la chaîne. La plupart des décodeurs câble, satellite ou TNT (le cas des décodeurs IPTV est un peu différent) possèdent une fente destiné à l’insertion d’une carte puce, la smartcard. Il s’agit de votre carte abonné, permettant de d’identifier votre compte et toutes les chaines auxquelles vous avez souscrit. Ainsi pour tester le CAS, le testeur doit par exemple :

  • Vérifier avec plusieurs cartes possédants des droits différents, que seules les chaines payantes souscrites et les gratuites sont accessibles, les autres devant afficher un message permettant de s’abonner.
  • Insérer / Retirer plusieurs fois la smartcard du décodeur, et vérifier qu’à chaque insertion, la chaîne payante souscrite s’affiche, puis disparaît lors du retrait de la carte.

Contrôle parental

Houlalala, que c’est important, nous l’avons vu un peu plus tôt. La vérification du contrôle parental est capitale, on ne veut surtout pas que le Conseil Supérieur de l’Audiovisuel (CSA) nous tombe dessus !

Les tests associés sont assez amusants (en tout cas, je les trouve amusants…). Pour les voir en cours d’exécution, le mieux est d’être matinal.

Une explication s’impose. Pour tester le contrôle parental, il faut tout d’abord le configurer, c’est à dire saisir un code parental sur le décodeur en précisant le type de contenu protégé par mot de passe, violence, horreur, contenu adulte,…

Ce type de film étant généralement diffusé en dehors des heures de travail, le testeur peut par exemple programmer l’enregistrement, pendant la nuit, de programmes sensibles.

Le lendemain, il revient travailler, se place en face de son mur de test, devant ses quatre téléviseurs, et joue les enregistrements effectués durant la nuit. Objectif, vérifier que chaque enregistrement exige bien la saisie du code parental avant de démarrer.

Le produit étant en cours de développement, il arrive souvent que la fonctionnalité ne soit pas 100% opérationnelle, ou que le testeur saisisse le code parental pour contrôler le bon affichage de la vidéo.

         Mais pourquoi il a dit qu’il fallait être matinal ?

Eh bien parce que certaines situations peuvent être quelques peu gênantes, quand par exemple, un de vos confrère a oublié d’éteindre l’ampli audio utilisé la veille sur le même mur vidéo, dans le cadre d’un test de volume, et que des sons d’un genre douteux résonnent soudain dans les couloirs de la R&D au lancement de vos enregistrements, attirant progressivement tous vos collègues derrière vous pour admirer vos qualités de testeur expérimenté.

C’est la raison pour laquelle il est parfois souhaitable d’effectuer ces tests avant l’arrivée de vos collaborateurs.

Redémarrage

Le test de redémarrage ou reboot, consiste à démarrer un décodeur, s’assurer qu’il a terminé son démarrage, qu’il affiche soit le menu principal, soit une chaîne de télévision, puis de débrancher et rebrancher le cordon d’alimentation afin d’observer le comportement lors de la séquence de démarrage.

Ce test est très intéressant car durant cette phase de fonctionnement, le décodeur active un grand nombre de processus ce qui est très consommateur de ressources. Identification de version du firmware, recherche de nouvelles versions, téléchargement/installation le cas échéant, chargement et démarrage de l’application, démodulation, décodage du flux audio / vidéo, récupération des données de l’EPG… et j’en passe. Comme pour tout système embarqué, la gestion des ressources est un élément important pour lequel le test est indispensable.

Test de navigation dans les menus

Un test qui s’apparente au free testing, pour lequel, le testeur muni de son Excalibur, bon ok sa télécommande, va se balader librement dans les différents menus, menu principal, grille des programmes, navigation avec les flèches dans la grille des programmes, sélection d’un programme, ouverture du menu de vidéo à la demande (VOD), etc… Afin de détecter d’éventuels problèmes d’affichage, ou toute séquence d’actions pouvant entraîner un redémarrage imprévu du décodeur par exemple.

Pour ce test, bien qu’il n’existe pas de protocole prédéfini, il est primordial que le testeur documente l’ensemble des actions effectuées à des fins de reproductibilité.

Il ne s’agit pas ici d’appuyer au hasard sur les touches de la télécommande et de dire : « Il y a un problème ! », l’objectif est bien de se rapprocher du comportement d’un utilisateur mais en spécifiant action par action la séquence menant à une anomalie.

Conclusion

Il existe une multitude d’autres tests fonctionnels, le timeshifting, les enregistrements, la VoD, le zapping, etc… Le but de cet article n’est pas de tous les décrire, mais de donner une idée du type de test pouvant être menés sur un applicatif de décodeur numérique.

Dans le prochain épisode de la saga de l’audiovisuel, nous aborderons le sujet des tests non fonctionnels en télévision numérique.

Saga de l’audiovisuel – Présentation et enjeux du test

Saga de l’audiovisuel

Présentation du test audiovisuel

« Et voici la couleur, au jour fixé et à l’heure dite… »

Déclarait solennellement et avec fierté, Georges Gorces, alors ministre de l’information, le 1er Octobre 1967 à 14h15, à l’occasion de cette prouesse technologique que fut l’arrivée de la couleur sur nos petits écrans. Déclaration qu’il poursuivit par : « Vous cesserez très vite, je le sais bien, d’être sensibles à la magie de la chose. » Et il n’avait pas tort.

A l’époque, Huguette regarde tranquillement son épisode de chapeau melon et bottes de cuir sans se soucier de la qualité médiocre du son et de la vidéo, et demande simplement à René de taper 3 fois sur le poste de télévision lorsque la réception se dégrade. Notre attitude devant nos films et nos émissions préférés a bien changé. Ma vidéo est saccadée, j’appelle mon fournisseur d’accès internet, le son est mauvais, je renvoie ma télé chez Darty, un problème de réception satellite : « Allô Sky, je ne suis vraiment pas content ». Les évolutions technologiques en matière d’audiovisuel nous ont été offertes doucement, au fil du temps, augmentant insidieusement notre niveau d’exigence.

Pourtant, un simple coup d’œil 50 années en arrière permet de prendre conscience du chemin parcouru. Diffusion par câble, satellite et IP, télévision numérique, multiplication du nombre de chaines, qualité HD, Ultra HD, son Dolby Digital. En consommateurs exigeants que nous sommes, nous donnons toujours plus de fil à retordre aux industriels de l’audiovisuel, qui se doivent d’être irréprochables sur la qualité des services proposés, et qui dit qualité dit bien évidemment test. Cet article a donc pour objectif de présenter les méthodes et outils de test dans ce domaine bien particulier qu’est la télévision numérique. Bien que de nombreux types de tests existent dans cette industrie (Hardware, infrastructure, CEM, résistance au choc des décodeurs numériques, etc…), je vous propose de concentrer notre attention sur les tests logiciels d’un organe central de la télévision numérique, le décodeur.

 

Le décodeur numérique..

… ou STB (Set Top Box) pour les intimes, est partout,  dans votre salon, votre chambre, ou peut être votre cuisine. Depuis la disparition en France de la télévision analogique hertzienne le 29 Novembre 2011, cet appareil est nécessaire pour profiter des merveilleux programmes proposés par le service public et privés, et si quelques sceptiques se disent encore :

 

Mais il est fou, j’ai jamais acheté de décodeur moi, je ne sais même pas à quoi ça ressemble !

 

Je vous confirme que vous faites fausse route, votre décodeur est peut-être caché dans votre modem ADSL, votre télé ou encore votre tout nouveau lecteur Blu-ray, mais il est bel et bien là.

Le décodeur est un appareil électronique dont le rôle premier est de récupérer un signal numérique (flux) provenant de votre réseau câble, internet, Satellite ou TNT, puis de le convertir en signaux audio et vidéo pouvant être joués sur votre téléviseur.

Les décodeurs actuels possèdent de nombreuses fonctionnalités secondaires comme l’enregistrement de programmes, le timeshifting (possibilité de stopper, puis de reprendre un programme diffusé en direct), l’EPG (Electronic Program Guide) permettant d’afficher en temps réel des informations concernant les programmes en cours et à venir, et bien d’autres.

Un décodeur est constitué de différentes couches matérielles et logicielles, comme le décrit le schéma simplifié suivant :

                       

  • La couche Hardware : segment matériel du décodeur, il s’agit du circuit électronique sur lequel sont assemblés les différents composants électroniques de l’appareil (microprocesseur, démodulateur, convertisseurs CAN et CNA, …)
  • La couche driver : fournit les briques logicielles nécessaires au pilotage des composants de la couche Hardware
  • Le middleware : il s’agit de l’interface logicielle entre la couche driver et l’applicatif, ces deux dernières ne parlant pas le même langage, la fonction du middleware est donc de rendre possible la communication entre les drivers et l’applicatif
  • L’applicatif : c’est l’interface utilisateur, celle que vous voyez au démarrage de votre décodeur, et avec laquelle l’utilisateur peut interagir via sa télécommande pour changer de programme, baisser le volume sonore ou bien démarrer l’enregistrement d’un programme.

Nous allons nous intéresser plus particulièrement à cette dernière couche, l’applicatif, celle avec laquelle notre utilisateur final, vous, moi, nous quoi, avons un contact direct.

 

Les enjeux du test en télévision numérique

Dans l’industrie audiovisuelle, minimiser la probabilité de présence d’une anomalie logicielle est essentiel.

En effet, un défaut matériel ou logiciel peut avoir un impact considérable tant sur le plan économique, qu’en termes d’image.

Un décodeur numérique est un produit grand public, et pour cette raison, il est produit et distribué en très grandes quantités, par millions. Comment réagiriez-vous en tant qu’utilisateur, tout content de déballer votre tout nouveau décodeur avec diffusion en 4k de MoMoMotus, si vous constatiez un problème lors de l’installation, ou des coupures de son répétées, pile sur les bonnes blagues de Thierry Beccaro ?  

Risques liés à la non qualité

Vous réagiriez très probablement comme des milliers d’autres déballeurs de décodeurs, par des appels répétés au service après vente. Ces appels, multipliés par le nombre important de clients insatisfaits mobilisent de nombreuses ressources, exigent un certain temps de traitement, notamment pour des problèmes complexes nécessitant un support de niveau 2.

Le traitement de ces milliers de cas clients représente un coût important pour l’opérateur. Il arrive également que les problèmes remontés par les clients à l’opérateur mette en évidence un défaut du produit. Dans ce cas, le fabricant doit mobiliser des équipes pour identifier et corriger l’anomalie, au détriment des autres projets en cours de développement. Ce genre de « crise » entraîne à son tour des coûts non négligeables et un risque de retard de livraison pour les autres projets.  

Risques de manquer une technologie

Cela peut encore aller plus loin, jusqu’au rappel des produits. Là, il ne s’agit plus seulement d’une histoire de coût mais également de la perte potentielle d’un marché au profit de vos féroces concurrents qui n’attendent qu’un faux pas de votre part pour s’approprier, à vos dépens, la place de leader de l’intégration de la toute dernière techno de compression audio ou vidéo dans leur terminaux résidentiels. Et il ne se privera pas d’en faire mention sur les salons, les forums hi-tech et autres réseaux sociaux.

Risques de dégradation de l’image de l’entreprise

Une autre fonctionnalité des décodeurs numériques est le contrôle parental. Souvent activé par défaut, il exige un mot de passe pour pouvoir jouer un programme au contenu interdit au mineurs, généralement des programmes contenant des scènes de violence ou de pornographie. Une défaillance du contrôle parental pourrait donc permettre à n’importe quel bambin jouant avec la télécommande de tomber sur un programme qui ne lui est pas destiné.

Ce genre de situation est bel et bien arrivé. Pas à ma connaissance sur les décodeurs numériques, mais dans le cadre de la diffusion de programme par internet (webTV) du groupe Canal+.

Ainsi le 15 Avril 2012, à 13h40, confortablement installés devant leur écrans, parents et enfant s’apprêtait à digérer leur repas dominical devant le dernier opus de la saga Arthur et Minimoys, de Luc Besson. Malheureusement, une défaillance technique sur les serveur de diffusion de la webTV a provoqué la diffusion accidentelle d’extraits de films pour adulte. Suite à cela, les abonnés concernés par le problème ont exprimé leur colère sur le forum du diffuseur, puis au tour des médias de s’emparer de l’affaire, RTL, Ouest-France, France tv info, … Compliqué pour le groupe de justifier un tel problème. La chaîne a dû présenter ses excuses aux abonnés tout en affirmant que la cause du problème avait été identifiée et ne se reproduirait plus.

En règle générale, ces risques sont connus, et bien que quelques rares problèmes passent les mailles des filets comme nous venons de le voir, de nombreux tests sont effectués dans l’industrie audiovisuelle afin de détecter et de corriger le maximum d’anomalies avant que les produits ne soient en utilisation chez les clients.

 

Conclusion

Les technologies de l’audiovisuel se sont démocratisées en quelques 50 années, et désormais, lorsque nous passons devant une nouvelle télévision 4K, ou un décodeur numérique dernier cri, cela semble banal. Il s’agit pourtant d’une industrie de pointe, en constante évolution, qui, à ce titre, nécessite une politique de test aux contours bien définis pour éviter entre autres, des catastrophes économiques et marketing.

Nous arborderons, dans le prochain article, le fonctionnement d’une cellule de validation pour décodeurs numériques ainsi que des exemples de tests courants.