Paramètre de langage de schéma ignoré dans les tests d'unité et d'interface user iOS

Mon but final est d'émettre

xcodebuild test 

à partir de la command line en choisissant différents schémas pour différentes langues.

Actuellement, j'ai deux régimes, la seule différence entre eux est le langage d'application. Dans un schéma, c'est l'anglais, dans l'autre, c'est l'espagnol. Si j'utilise xCode pour exécuter l'application, cela fonctionne bien, il est lancé avec la langue spécifiée dans le schéma que j'ai choisi, les deux EN ou ES sont d'accord.

Si j'exécute les tests depuis xCode, le réglage de la langue est ignoré. Quel que soit le schéma que je choisis, peu importe, il est toujours affiché comme langue de l'appareil. La même chose sur le simulateur. La même chose lors de l'exécution de tests avec schéma de sélection de test xcodebuild. (L'ajout d'une command echo au schéma garantit que la bonne est sélectionnée)

Dans l'éditeur de schéma, l'option "Utiliser les arguments et les variables d'environnement de l'action Exécuter" est cochée.

Qu'est-ce que je fais mal?

Je vous remercie.

Oui, il semble que toutes les variables d'environnement et les arguments de lancement fournis dans les schémas sont ignorés dans les tests XCTest.

Cependant, vous pouvez définir la langue par programme dans le test, par exemple dans la méthode setUp() :

 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 += ["-AppleLanguages", "(en-US)"] app.launchArguments += ["-AppleLocale", "\"en-US\""] app.launch() } 

Maintenant, vous pouvez étendre cette approche et faire quelque chose comme Snapshot :

2 choses doivent être transmises de l'instantané à l'outil de command line xcodebuild:

  • Le type de périphérique est transmis via le paramètre de destination du paramètre xcodebuild

  • La langue est passée via un file temporaire qui est écrit par snapshot avant d'exécuter les tests et lu par les tests d'interface user lors du lancement de l'application

À la fin, Afin de changer la langue sur les bases de schémas, vous pouvez faire ce qui suit:

1. Rédigez un script de pré-action pour Test qui crée un file temporaire:

 mkdir -p ~/Library/Caches/xcode-helper echo "en-US" > ~/Library/Caches/xcode-helper/language.txt 

2. Chargez le file dans setUp() et définissez la langue de l'application:

 override func setUp() { super.setUp() let app = XCUIApplication() let path = NSProcessInfo().environment["SIMULATOR_HOST_HOME"]! as NSSsortingng let filepath = path.ssortingngByAppendingPathComponent("Library/Caches/xcode-helper/language.txt") let sortingmCharacterSet = NSCharacterSet.whitespaceAndNewlineCharacterSet() let language = try! NSSsortingng(contentsOfFile: filepath, encoding: NSUTF8SsortingngEncoding).ssortingngByTrimmingCharactersInSet(sortingmCharacterSet) as Ssortingng app.launchArguments += ["-AppleLanguages", "(\(language))"] app.launchArguments += ["-AppleLocale", "\"\(language)\""] app.launch() } 

A partir de maintenant, le Xcode exécutera le test avec la langue / l'environnement local spécifié dans le script de pré-action du système.

METTRE À JOUR

Il s'avère que les tests n'ignorent pas les arguments fournis dans le schéma. Les arguments sont réellement passés au test lui-même mais pas à l'application testée. Ce qui pourrait être inattendu, mais cela a du sens.

Cela étant dit, tout ce que vous devez faire:

1. Définir -AppleLanguages (en-US) et -AppleLocale en_US lancer des arguments pour le test dans le schéma

Capture d'écran - Définition des arguments <code> -AppleLanguages ​​(en) </ code> et <code> -AppleLocale "en_US" </ code> pour le test dans le schéma

2. Passez les arguments de lancement dans le test à l'instance XCUIApplication avant d'appeler la méthode launch()

 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 += NSProcessInfo().arguments app.launch() }