19 mars 2014

Appium et cibles multiples

Pour les tests automatisés d’applications iOS, j’ai dit utiliser Appium — voir : iOS et tests automatisés

Pour plusieurs raisons (public ciblé, non régression, couverture des tests, captures d’écrans…) il est important de tester sur plusieurs cibles. En se limitant à l’iPhone / iPod Touch, citons en particulier :
  • iOS Simulator : iOS 6.0 / 6.1 (non Retina)
  • iOS Simulator : iOS 6.0 / 6.1, Retina 3.5-inch
  • iOS Simulator : iOS 6.0 / 6.1, Retina 4-inch
  • iOS Simulator : iOS 7.0 / 7.1, Retina 3.5-inch
  • iOS Simulator : iOS 7.0 / 7.1, Retina 4-inch 
  • (real device) iPod Touch 4e génération : iOS 6.1.3
  • (real device) iPod Touch 5e génération : iOS 7.0.3
iOS Simulator Résolution iOS 6.0 / 6.1 iOS 7.0 / 7.1
iPhone 320×480 OK n/a
iPhone Retina 3.5-inch 640×960 OK OK
iPhone Retina 4-inch 640×1136 OK OK

Voici comment je m’en sors avec Appium 0.16.0, Xcode 5.1 et Xcode 4.6.3 installés sous OS X 10.8.5.

Pour iOS 7.1, facile, puisque c’est le niveau de SDK du simulateur par défaut. On fera donc simplement dans le test JUnit :
final DesiredCapabilities capabilities = new DesiredCapabilities();
capabilities.setCapability("deviceName", "iPhone Retina (3.5-inch)");
driver = new RemoteWebDriver(new URL("http://localhost:4723/wd/hub"), capabilities);
ou :
(...)
capabilities.setCapability("deviceName", "iPhone Retina (4-inch)");
(...)
Rappelons que pour le simulateur, la capability « app » pointe vers l’application sur le poste de développement :
capabilities.setCapability("app", "/Users/dandriana/Library/Developer/Xcode/DerivedData/"
    + MON_APPLI_DIR // XXX-abcdefetc.
    + "/Build/ProductsDebug-iphonesimulator/"                       
    + MON_APPLI_NAME + ".app"
);
Pour iOS 6.1, c’est un peu plus compliqué, car pour lancer le simulateur, Apple Instruments sélectionne systématiquement le dernier SDK du simulateur par défaut dans Xcode. Il va donc falloir se passer de Xcode 5.1 et utiliser Xcode 4.6.3, grâce à la ligne de commande suivante :
$ sudo xcode-select -switch /Applications/Xcode-4.6.3.app/Contents/Developer/
Et pour choisir la résolution, c’est le même code que ci-dessus, avec comme possibilités :
capabilities.setCapability("deviceName", "iPhone");

capabilities.setCapability("deviceName", "iPhone Retina (3.5-inch)");

capabilities.setCapability("deviceName", "iPhone Retina (4-inch)");
Il n’y a pas à changer la capability "app".

En ce qui concerne les real devices, Appium va seulement avoir besoin de l’UDID et du bundleID :
capabilities.setCapability("device", "f98cda012etc.");
capabilities.setCapability("app", "com.avcompris.MON-APPLI"); 
À propos des simulateurs, pour info voici ce qui est donné par défaut :
$ xcode-select --print-path 
/Applications/Xcode.app/Contents/Developer 
$ defaults read com.apple.iphonesimulator 
{ 
   LocationMode = 3102; 
   SimulateDevice = "iPhone Retina (4-inch 64-bit)"; 
   SimulatorWindowCenterX = 657; 
   SimulatorWindowCenterY = 497; 
   SimulatorWindowLastScale = 1; 
   currentSDKRoot = "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator7.1.sdk"; 
   windowOrientation = 3; 
}
Modifier ces valeurs soi-même (defaults write) ne change rien : Apple Instruments les remet à jour avec le SDK du simulateur par défaut.

Notons aussi que, même si Xcode 4.6.3 est également installé sur ma machine et sert bien d’aiguillage pour lancer un autre simulateur que celui du SDK 7.1, il est a priori impossible d’ouvrir le projet iOS avec cette installation de Xcode, puisque des formats de fichiers, notamment les Xib, sont incompatibles entre 4.6.3 et 5.1.