Apple a introduit dans Xcode 7 de nouveaux tests d’interface utilisateur, mais j’ai du mal à vérifier que les tests lancent l’application, elle commence par les données que l’application possédait auparavant. Cela signifie que les tests ne peuvent pas être indépendants et peuvent être influencés par d'autres tests.
Il est impossible d'accéder aux valeurs par défaut de l'utilisateur et à d'autres données, car l'application qui exécute les tests n'a pas accès au bundle de l'application testée. Les scripts sont également hors de question car ils peuvent être exécutés avant ou après le test. Et il n’existe aucun moyen d’exécuter NSTask sur iOS pour exécuter un script avant chaque suite de tests.
Existe-t-il un moyen de réinitialiser les données de l'application avant chaque suite de tests?
Pas de manière simple. Mais il existe des solutions de contournement.
XCUIApplication
peut définir des arguments de ligne de commande et des variables d’environnement pouvant modifier le comportement de votre application.
Un exemple simple de votre fichier main.m
:
int main(int argc, char * argv[]) {
#if DEBUG
// Reset all data for UI Testing
@autoreleasepool {
for (int i = 1; i < argc; ++i) {
if (0 == strcmp("--reset-container", argv[i])) {
NSArray *folders = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
NSFileManager *fm = [[NSFileManager alloc] init];
for (NSString *path in folders) {
[fm removeItemAtPath:path error:nil];
}
// Also remove documents folder if necessary...
}
}
}
#endif
@autoreleasepool {
return UIApplicationMain(argc, argv, nil,
NSStringFromClass([AppDelegate class]));
}
}
Et dans -[XCTestCase setUp]
ajouter:
XCUIApplication *app = [[XCUIApplication alloc] init];
app.launchArguments = @[@"--reset-container"];
[app launch];
Si préparer votre application pour les UITest dans application:didFinishLaunchingWithOptions:
est correct dans votre cas, vous pouvez procéder comme suit:
Dans la méthode setUp()
de votre classe de test qui étend XCTestCase
, ajoutez le code suivant:
let application = XCUIApplication()
application.launchEnvironment = ["UITESTS":"1"]
application.launch()
Ensuite, dans application:didFinishLaunchingWithOptions:
, vous pouvez vérifier l'indicateur à l'aide du code suivant:
func application(_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey : Any]? = nil) -> Bool {
let env = ProcessInfo.processInfo.environment
if let uiTests = env["UITESTS"], uiTests == "1" {
// do anything you want
}
// further set up code
}
Bien sûr, si c'est une option pour vous.
REMARQUE: Au lieu de définir "1"
en tant qu'argument pour l'indicateur "UITESTS"
, vous pouvez spécifier différentes valeurs pour différents tests élémentaires, voire même des méthodes de test (mais dans ce cas, vous devez lancer l'application à partir de la méthode de test et non setUp()
).
NOTE 2: Je suggère de placer le code traitant du drapeau dans le bloc #if DEBUG
.
Je dois réinitialiser les données de l'application à l'aide de certains en-têtes privés pour accéder au tremplin et à l'application des paramètres.
J'ai d'abord ajouté une phase de script Exécuter pour le supprimer au démarrage des tests:
/usr/bin/xcrun simctl uninstall booted com.mycompany.bundleId
Et après cela, j’ai utilisé la solution que j’ai écrite ici pour l’enlever à l’aide d’un script de test qui s’exécute sur les appels tearDown
pour le réinitialiser après chaque test.
Dans mon cas, je devais également réinitialiser les autorisations. Et il existe une option pour supprimer votre application et réinitialiser les autorisations système, il suffit de faire le test pour supprimer l'application et d'accéder aux paramètres.
Déjà répondu dans cette S.O. fil de discussion: Est-il possible de réinitialiser l'application entre les tests dans l'interface utilisateur de Swift XCTest dans Xcode 7?