Lancer des tests Appium en parallèle sur plusieurs devices

Reading Time: 2 minutes

Il est parfois nécessaire d’exécuter des tests en parallèle sur plusieurs devices. Dans tous les cas, cela permet d’accélérer sa campagne de test :

  • Exécuter le même test sur des devices différents pour valider son application par rapport à la fragmentation du marché
  • Exécuter le même test sur un même type de device en changeant les paramètres d’exécution (connexion réseau, données utilisateurs…)
  • Exécuter une campagne de test rapidement en répartissant les tests sur les mêmes types de device
  • Fournir à plusieurs équipes la possibilité d’éxecuter leurs tests sur une ferme de devices

Pour cela, il est nécessaire de lancer un serveur Appium par device. Nous allons utiliser un port différent par serveur. Dans notre exemple, nous allons utiliser un client nodejs avec WebdriverIO (le binding node.js pour le protocole W3C WebDriver).

Prérequis

  • NodeJS installé globalement sur votre système
  • Android SDK installé sur votre système
  • ANDROID_HOME dans le path du système
  • WebdriverIO installé
  • Appium installé
  • Au moins 2 téléphones ou émulateurs connectés pour le test

Connexion aux téléphones

On se connecte d’abord au premier téléphone :

adb connect <device name or IP>

Puis on se connecte de la même manière au deuxième téléphone.

Lancement des serveurs

Dans une première fenêtre de commande, on lance le premier serveur :

appium -p 4727 -bp 5727 -U <device name or IP>

p indique le port du serveur.
bp indique le port sur lequel communiquer sur le device.
U est le device name (ou, dans le cas d’une connexion TCP, l’IP).

Dans une deuxième fenêtre de commande, on lance le deuxième serveur sur des ports différents :

appium -p 4728 -bp 5728 -U <device name or IP>

Vous pouvez vérifier le log de sortie dans les fenêtres de commande.

Lancement des clients de tests

Il est maintenant nécessaire d’écrire le test en node.js qui va être exécuté. Dans un fichier test1.js, il est tout d’abord nécessaire de configurer les capabilities du serveur.

const client = webdriverio.remote({
    host: "0.0.0.0",
    port : 4727, // Port du premier serveur
desiredCapabilities: {
        deviceName: <device name or IP>, // Premier device
        platformName: 'Android',
app: 'https://github.com/appium/sample-code/raw/master/sample-code/apps/ApiDemos/bin/ApiDemos-debug.apk'
     }
})

On complète ensuite le fichier avec le test à exécuter :

;(async () => {
  try {
    await client.init()
    await sleep(1000)
    await client.click('~App')
    await client.click('~Alert Dialogs')
    await client.back()
    await client.back()
    await sleep(300)
    await sleep(2000)
    await client.end()
  } catch (err) {
    console.log(err)
  }
})()

function sleep (ms) {
  return new Promise(resolve => setTimeout(resolve, ms))
}

Vous pouvez exécuter une première fois ce fichier pour vérifier le bon fonctionnement :

node test1.js

Ce fichier peut ensuite être copié dans un deuxième fichier test2.js, où les paramètres du serveur et du device doivent être modifiés (port à 4728 et deviceName).
Dans deux fenêtres en parallèle, vous pouvez préparer les commandes de lancement des tests et les lancer quasi simultanément. Les tests s’exécutent alors en parallèle sur les devices.