web-dev-qa-db-fra.com

Comment accélérer les cas de test d'interface utilisateur dans Xcode?

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.

15
Artem Stepanenko

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 .

18
Mark

Une autre possibilité est de désactiver les animations:

[UIView setAnimationsEnabled:NO];

Swift 3:

UIView.setAnimationsEnabled(false)
7
Artem Stepanenko

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()
3
mourodrigo

Ajoutez-le dans didFinishLaunch

[UIApplication sharedApplication].keyWindow.layer.speed = 2;

La valeur par défaut est 1, faites-le doubler sa vitesse.

2
Shelly Pritchard

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:

  1. Exécutez XCUIApplication sans le réinstaller: 
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.

  1. Vous pouvez déplacer quelque chose sur le fil d’arrière-plan. Par exemple.
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.

  1. Passez à EarlGrey et faites des tests qui durent quelques secondes (mais ils ne seront pas une boîte noire).

  2. Ouvrez les écrans via des liens profonds si vous avez des liens profonds.

  3. 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.

  4. Ne jamais utiliser de longues nuits. Utilisez polling.

1
artyom.razinov

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
}
0
Oliver Pearmain