Depuis Xcode 7 nous avons une API Nice pour tester l’UI. Surtout j'en suis satisfait. La seule préoccupation est liée à la vitesse.
Au début, un test élémentaire d’assurance-chômage ordinaire (environ 15 actions) durait environ 25 secondes . Ensuite, je me suis complètement moqué de la mise en réseau. Maintenant, cela prend 20 secondes . Étant donné que le temps pris ne prend que des animations et un temps de lancement (1 seconde ou même moins), je suppose qu’il doit exister un moyen de l’accélérer.
Essayez de définir cette propriété lors de l'exécution de vos tests d'interface utilisateur:
UIApplication.shared.keyWindow?.layer.speed = 100
Voici comment je l'ai configuré:
func application(_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
if ProcessInfo.processInfo.arguments.contains("UITests") {
UIApplication.shared.keyWindow?.layer.speed = 100
}
}
Et dans mes tests d'interface utilisateur:
class MyAppUITests: XCTestCase {
// MARK: - SetUp / TearDown
override func setUp() {
super.setUp()
let app = XCUIApplication()
app.launchArguments = ["UITests"]
app.launch()
}
}
Il y a quelques autres astuces utiles dans ce blog post .
Une autre possibilité est de désactiver les animations:
[UIView setAnimationsEnabled:NO];
Swift 3:
UIView.setAnimationsEnabled(false)
Après @Mark answer, le Swift 3 version:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
if ProcessInfo.processInfo.arguments.contains("UITests") {
UIApplication.shared.keyWindow?.layer.speed = 200
}
}
Sur votre fichier de test ui:
override func setUp() {
super.setUp()
// Put setup code here. This method is called before the invocation of each test method in the class.
let app = XCUIApplication()
app.launchArguments = ["UITests"]
app.launch()
Ajoutez-le dans didFinishLaunch
[UIApplication sharedApplication].keyWindow.layer.speed = 2;
La valeur par défaut est 1, faites-le doubler sa vitesse.
Exécutez-les en parallèle.
Si vous ne possédez qu'une seule machine, vous pouvez utiliser Bluepill: https://github.com/linkedin/bluepill
Si vous avez plusieurs machines, vous pouvez utiliser Emcee: https://github.com/avito-tech/Emcee (cela fonctionne également pour une configuration à une seule machine)
Nous avons 50 heures de tests d’interface utilisateur, et Emcee nous permet de les exécuter en une heure. Il existe plusieurs astuces pour accélérer les tests d'interface utilisateur, mais il est inutile si vous ne les exécutez pas en parallèle. Par exemple. vous ne pouvez pas exécuter vos tests de 25 secondes en 0,5 seconde.
Des trucs:
XCUIApplication(
privateWithPath: nil,
bundleID: "your.bundle.id"
)
Remarque: vous devez lancer l'application avec XCUIApplication().launch()
au moins une fois par lanceur de test XCUI pour l'installer. Cela nécessite l'utilisation d'une API privée.
let someDataFromApi = getSomeData() // start request asynchronously and immediately return
launchApp() // this can be few seconds
useInTest(someDataFromApi) // access to data will wait request to finish
Vous pouvez faire en sorte que le code ne ressemble à aucune chose asynchrone, ce serait plus facile pour le contrôle qualité. Nous voulons appliquer cela, mais nous ne l'avons pas fait, alors ce n'est qu'une idée.
Passez à EarlGrey et faites des tests qui durent quelques secondes (mais ils ne seront pas une boîte noire).
Ouvrez les écrans via des liens profonds si vous avez des liens profonds.
Utilisez beaucoup d’API privées et d’autres hacks. Exemple: au lieu d'aller via l'interface utilisateur à l'application Paramètres, puis de réinitialiser les paramètres de confidentialité, vous pouvez appeler une API privée.
Ne jamais utiliser de longues nuits. Utilisez polling.
Je voulais désactiver TOUTES les animations lors des tests de capture instantanée. J'ai pu y parvenir en désactivant les animations Core Animation et UIView comme indiqué ci-dessous.
Remarquez que mon application utilisait les storyboards UIApplication.shared.keyWindow
étant nuls au lancement, j'accède donc à UIWindow en me référant directement à la propriété window
.
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
if ProcessInfo.processInfo.arguments.contains("SnapshotTests") {
// Disable Core Animations
window?.layer.speed = 0
// Disable UIView animations
UIView.setAnimationsEnabled(false)
}
return true
}