Selenium est une suite d’outils open source permettant d’automatiser des tests d’applications Web au travers de différents navigateurs et plateformes. Quelques articles publiés par Microsoft expliquent déjà comment intégrer des tests écrits à l’aide de Visual Studio et les dll Selenium afin de les exécuter dans un pipeline de Build. On va s’intéresser ici à l’exécution des tests Selenium natifs, c’est-à-dire les tests directement générés par l’IDE Selenium sachant qu’aucune ligne de code ne sera nécessaire. Ainsi les automaticiens/testeurs pourront sans difficulté intégrer leurs tests.

Architecture

Je ne vais pas vous expliquer dans cet article comment installer votre serveur Selenium, tout est très bien expliqué sur le site officiel !

La mise à disposition des tests et leur exécution via VSTS/TFS seront articulés de cette façon :

Tests Selenium VSTS/TFS

Comment créer des tests Selenium ?

Selenium IDE

Selenium IDE est une application sous forme d’extension Firefox qui permet d’enregistrer les scenarii joués par un utilisateur au sein de son navigateur.

Selenium IDE Firefox

Les différentes étapes sont enregistrées dans des suites/cas de tests et peuvent être rejouées via Selenium IDE et Seleniun server ou exportable (en C# par exemple). L’installation se fait via l’onglet Modules de Firefox. Il faut ensuite faire CTRL+ALT+S pour ouvrir Selenium IDE.

Ouvrir Selenium IDE

Enregistrement

Concernant l’enregistrement, il suffit de naviguer dans les différentes pages et l’IDE enregistre nos actions. Dans l’exemple je me connecte au site https://blog.cellenza.com et je me balade dans les menus. On peut voir dans l’IDE que mes actions sont tracées.

Export

Je ne vais pas m’étendre sur cette partie. En effet, il s’agit ici d’exporter ses tests dans un langage (C# ou autre) afin de les intégrer dans une solution Visual Studio et d’en faire des tests unitaires. L’intégration s’en trouve donc simplifiée, mais il faut modifier du code source et ce n’est pas ce qui nous intéresse ici !

Enregistrement

L’enregistrement d’un test ou d’une suite de tests Selenium se fait au format HTML. Voici par exemple le contenu du test que je viens de créer :

</pre>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" <a href="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd</a>">
<html xmlns="<a href="http://www.w3.org/1999/xhtml">http://www.w3.org/1999/xhtml</a>" xml:lang="en" lang="en">
<head>
<meta content="text/html; charset=UTF-8" http-equiv="content-type" />
<link rel="selenium.base" href="<a href="https://blog.cellenza.com/">https://blog.cellenza.com/</a>" />
<title>CellenzaBlog</title>
</head>
<body>
<table cellpadding="1" cellspacing="1" border="1">
<thead>
<tr><td rowspan="1" colspan="3">Onglets</td></tr>
</thead>
<tbody><tr>
<td>open</td>
<td><a href="https://blog.cellenza.com/">https://blog.cellenza.com/</a></td>
<td></td>
</tr>
<tr>
<td>clickAndWait</td>
<td>link=Cloud</td>
<td></td>
</tr>
<tr>
<td>clickAndWait</td>
<td>link=Agiles</td>
<td></td>
</tr>
<tr>
<td>clickAndWait</td>
<td>link=DevOps</td>
<td></td>
</tr>
<tr>
<td>clickAndWait</td>
<td>link=Data</td>
<td></td>
</tr>
</tbody></table>
</body>
</html>
<pre>

Selenese

Selenese est un runner de tests Selenium. Je vais me servir de celui-ci afin d’exécuter mes tests créés. Pourquoi Selenese et pas le runner officiel Selenium ? Car ce dernier intègre beaucoup plus d’options d’exécution et surtout il permet de générer des résultats au format JUnit, format connu par VSTS/TFS ! Il sera donc facile de les intégrer au résultat d’exécution du déploiement. Le Github de Selenese se trouve ici.

Il vous faudra installer JAVA pour pouvoir exécuter ce runner !

Exécution

Bien sur, pour permettre une exécution sur les différents navigateurs, il faut au préalable les avoir installés sur la machine qui va exécuter les tests !

On utilisera les options suivantes avec une commande Powershell :

  • –driver remote : on précise que l’exécution se fera en remote
  • –remote-browser “firefox” : navigateur sur lequel jouer les tests (IE/Firefox/Chrome)
  • –remote-url “http://xxx:4444/wd/hub” : adresse du serveur Selenium
  • –xml-result “resxml” : chemin de sortie des résultats de tests au format XML
  • –html-result “reshtml” : chemin de sortie des résultats de tests au format HTML
  • –strict-exit-code : pas obligatoire, permet de connaître le résultat exact de l’exécution
  • “testsscenarios.html” : suite ou Test à exécuter

Pour lancer l’exécution, il faudra donc taper via powershell :

 java -jar "selenese-runner.jar" --driver remote --remote-browser "firefox" --remote-url "http://xxx:4444/wd/hub" --xml-result "resxml" --html-result "reshtml" --strict-exit-code "testsscenarios.html" 

Drivers

Les drivers sont des composants à mettre sur votre machine qui vont exécuter vos tests. Ils vont permettre à l’agent Selenium de lancer les différents navigateurs. Il y a donc un driver pour :

Je vous conseille de les mettre dans un même répertoire. Il faut ensuite mettre ce répertoire dans la variable d’environnement PATH de votre machine.

Tâche spécifique VSTS/TFS

OK, maintenant qu’on a notre runner et qu’on a défini les options utiles à nos exécutions, il va être intéressant de créer une tâche VSTS/TFS afin de permettre à chacun d’intégrer facilement et sans effort les tests. Si vous êtes novice dans la création de tâches et d’extensions, je vous encourage à lire les articles de notre blog, notamment celui de Mikaël sur comment gérer les extensions.

On va donc packager proprement notre script Powershell pour qu’il soit correctement configurable et compréhensible via VSTS/TFS.

L’architecture donnera ceci :

Architecture VSTS/TFS Selenium

Avec dans le répertoire bin, le binaire de selenese, qui sera embarqué dans votre extension. ATTENTION cependant, le runner Selenese fait pres de 23Mo, ce qui est quasiment la taille limite pour une tâche !

Vous avez donc le choix de positionner directement la tâche sur la machine plutôt que dans le vsix.

JSON

Le fichier JSON va permettre de renseigner les informations concernant la tâche, son nom, sa description, les paramètres…

[...]
"inputs": [
{
"name": "seleniumServer",
"type": "string",
"label": "Selenium server",
"defaultValue": "http://localhost:4444/wd/hub",
"required": true,
"helpMarkDown": ".",
"groupName": "executionOptions"
},
{
"name": "seleniumWebTest",
"type": "filePath",
"label": "Selenium test suite/case",
"defaultValue": "",
"required": true,
"helpMarkDown": ".",
"groupName": "executionOptions"
},
{
"name": "seleniumDriver",
"type": "pickList",
"label": "Driver",
"defaultValue": "internet explorer",
"options":{"internet explorer":"Internet Explorer","firefox":"Firefox","chrome":"Chrome"},
"required": true,
"helpMarkDown": "Firefox/IE/Chrome.",
"groupName": "executionOptions"
},
[...]
"execution": {
"PowerShell": {
"target": "$(currentDirectory)\Invoke-SeleniumTest.ps1",
"argumentFormat": "",
"workingDirectory": "$(currentDirectory)",
"platforms": [
"windows"
]

Powershell

$resultFile = Join-Path $env:SYSTEM_DEFAULTWORKINGDIRECTORY "res"
$resultFileXMLPath = Join-Path $env:SYSTEM_DEFAULTWORKINGDIRECTORY "resxml"
$resultFileHTMLPath = Join-Path $env:SYSTEM_DEFAULTWORKINGDIRECTORY "reshtml"
$seleneserunner = "$PSScriptRoot\bin\selenese-runner.jar"

java -jar "$seleneserunner" --driver remote --remote-browser "$seleniumDriver" --remote-url "$seleniumServer" --xml-result "$resultFileXMLPath" --html-result "$resultFileHTMLPath" --strict-exit-code "$seleniumWebTest"

Intégration dans un pipeline

Une fois notre tâche déployée, on va pouvoir la référencer dans nos différents pipelines. Pour ça, rien de plus facile, la configuration est, en effet, assez simple.

Release

C’est dans la partie Release que l’on va intégrer notre nouvelle tâche afin d’exécuter les tâches :

Les différentes options visibles qui ont été définies dans notre JSON sont les suivantes :

  • Adresse du serveur Selenium,
  • Suite ou tests à exécuter,
  • Driver : sur quel navigateur exécuter les tests.

Le lancement des tests se fera donc lors du déroulement du workflow de Release définit pour l’environnement souhaité. Vous pouvez également faire en sorte d’afficher les résultats des tests dans le résumé de la Release. L’intégration sera encore plus aboutie !

Conclusion

Grâce à cette nouvelle tâche, vos testeurs fonctionnels pourront aisément mettre en place leur campagne de tests sans avoir à toucher une ligne de code 🙂

 

Livre Blanc Cell'insight 1 DevOps