Recherche…


Ajout de fichiers de test à un projet Xcode

Lors de la création du projet

Vous devez cocher "Inclure les tests unitaires" dans la boîte de dialogue de création de projet.

entrer la description de l'image ici

Après avoir créé le projet

Si vous avez manqué de vérifier cet élément lors de la création de votre projet, vous pouvez toujours ajouter des fichiers de test ultérieurement. Faire cela:

1- Accédez à vos paramètres de projet dans Xcode

2- Aller à "Cibles"

3- Cliquez sur "Ajouter une cible"

4- Sous "Autre", sélectionnez "Paquet de test de test Cocoa Touch Unit"

À la fin, vous devriez avoir un fichier nommé [Your app name]Tests.swift . En Objective-C, vous devez avoir deux fichiers nommés [Your app name]Tests.h et [Your app name]Tests.m place.

[Your app name]Tests.swift or .m fichier [Your app name]Tests.swift or .m inclura par défaut:

  • Une importation de module XCTest
  • Une classe de [Your app name]Tests qui étend XCTestCase
  • le tearDown testExample testPerformanceExample setUp d' setUp , tearDown , testExample , testPerformanceExample méthodes

Rapide

import XCTest

class MyProjectTests: XCTestCase {

override func setUp() {
    super.setUp()
    // Put setup code here. This method is called before the invocation of each test method in the class.
}

override func tearDown() {
    // Put teardown code here. This method is called after the invocation of each test method in the class.
    super.tearDown()
}

func testExample() {
    // This is an example of a functional test case.
    // Use XCTAssert and related functions to verify your tests produce the correct results.
    
}

func testPerformanceExample() {
    // This is an example of a performance test case.
    self.measure {
        // Put the code you want to measure the time of here.
    }
}

}

Objectif c

#import <XCTest/XCTest.h>

@interface MyProjectTests : XCTestCase

@end

@implementation MyProjectTests

- (void)setUp {
    [super setUp];
// Put setup code here. This method is called before the invocation of each test method in the class.
}

- (void)tearDown {
// Put teardown code here. This method is called after the invocation of each test method in the class.
    [super tearDown];
}

- (void)testExample {
// This is an example of a functional test case.
// Use XCTAssert and related functions to verify your tests produce the correct results.
}

- (void)testPerformanceExample {
// This is an example of a performance test case.
    [self measureBlock:^{
    // Put the code you want to measure the time of here.
    }];
}

@end

Ajout de storyboard et de View Controller en tant qu'instances pour tester un fichier

Pour commencer avec les tests unitaires, qui seront effectués dans le fichier de tests et testeront View Controller et Storyboard, nous devrions introduire ces deux fichiers dans le fichier de test.

Définition du contrôleur de vue

Rapide

var viewController : ViewController!

Présentation du storyboard et initialisation du View Controller

Ajoutez ce code à la méthode setUp() :

Rapide

let storyboard = UIStoryboard(name: "Main", bundle: nil)
viewController = storyboard.instantiateInitialViewController() as! ViewController

Objectif c

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:"Main" bundle:nil];
viewController = (ViewController *) [storyboard instantiateInitialViewController];

De cette façon, vous pouvez écrire des méthodes de test et ils sauront où rechercher les erreurs. Dans ce cas, il y a View Controller et le Storyboard.

Ajouter des méthodes de test

Selon Apple:

Méthodes d'essai

Une méthode de test est une méthode d'instance d'une classe de test qui commence par le test de préfixe, ne prend aucun paramètre et renvoie un résultat nul, par exemple (void) testColorIsRed (). Une méthode de test exerce du code dans votre projet et, si ce code ne produit pas le résultat attendu, signale les échecs à l'aide d'un ensemble d'API d'assertion. Par exemple, la valeur de retour d'une fonction peut être comparée à une valeur attendue ou votre test peut affirmer qu'une utilisation incorrecte d'une méthode dans l'une de vos classes génère une exception.

Nous ajoutons donc une méthode de test utilisant "test" comme préfixe de la méthode, comme:

Rapide

func testSomething() {

}

Objectif c

- (void)testSomething {

}

Pour tester réellement les résultats, nous utilisons la méthode XCTAssert() , qui prend une expression booléenne et, si elle est vraie, marque le test comme réussi, sinon elle le marquera comme ayant échoué.

Disons que nous avons une méthode dans la classe View Controller appelée sum() qui calcule la somme de deux nombres. Pour le tester, nous utilisons cette méthode:

Rapide

func testSum(){
    let result = viewController.sum(4, and: 5)
    XCTAssertEqual(result, 9)
}

Objectif c

- (void)testSum {
    int result = [viewController sum:4 and:5];
    XCTAssertEqual(result, 9);
}

Remarque

Par défaut, vous ne pouvez pas accéder à l'étiquette, à la zone de texte ou à d'autres éléments d'interface utilisateur de la classe View Controller à partir de la classe de test s'ils ont été créés pour la première fois dans le fichier Storyboard. En effet, ils sont initialisés dans la méthode loadView() de la classe View Controller, et cela ne sera pas appelé lors du test. La meilleure façon d'appeler loadView() et toutes les autres méthodes requises est d'accéder à la propriété view de notre propriété viewController . Vous devez ajouter cette ligne avant de tester les éléments de l'interface utilisateur:

XCTAssertNotNil(viewController.view)

Lancer le test

Tester une méthode spécifique

Pour tester une méthode spécifique, cliquez sur le carré en regard de la définition de la méthode.

Tester toutes les méthodes

Pour tester toutes les méthodes, cliquez sur le carré situé en regard de la définition de classe.

Voir le résultat du test

S'il y a une coche verte à côté de la définition, le test a réussi.

entrer la description de l'image ici

S'il y a une croix rouge à côté de la définition, le test a échoué.

entrer la description de l'image ici

Lancer tous les tests

Product -> Test OR Cmd + U

Il exécutera tous les tests de toutes les cibles de test!

Importer un module pouvant être testé

Les classes, les structures, les énumérations et toutes leurs méthodes sont internal par défaut. Cela signifie qu'ils ne peuvent être accédés qu'à partir du même module. Les cas de test se trouvent dans une cible différente, ce qui signifie qu'ils se trouvent dans un module différent. Pour pouvoir accéder à la méthode que vous souhaitez tester, vous devez importer le module à tester à l'aide du mot clé @testable .

Disons que nous avons un module principal appelé ToDo et que nous voulons y écrire des tests. Nous importons ce module comme ceci:

@testable import ToDo

Toutes les méthodes de test du fichier avec cette instruction d'importation peuvent désormais accéder à toutes internal classes internal , structures, énumérations et toutes internal méthodes internal du module ToDo .

Vous ne devez jamais ajouter les fichiers avec les éléments que vous souhaitez tester à la cible de test car cela peut entraîner des erreurs de débogage difficiles.

Chargement de la vue et apparence

Afficher le chargement

Dans un test pour un contrôleur de vue, vous voulez parfois déclencher l'exécution de loadView() ou viewDidLoad() . Cela peut être fait en accédant à la vue. Disons que vous avez une instance de contrôleur de vue dans votre test appelée sut (système sous test), alors le code ressemblerait à ceci:

XCTAssertNotNil(sut.view)

Voir l'apparence

Vous pouvez également déclencher les méthodes viewWillAppear(_:) et viewDidAppear(_:) en ajoutant le code suivant:

sut.beginAppearanceTransition(true, animated: true)
sut.endAppearanceTransition()

Ecrire une classe de test

import XCTest
@testable import PersonApp

class PersonTests: XCTestCase {
    func test_completeName() {
        let person = Person(firstName: "Josh", lastName: "Brown")
        XCTAssertEqual(person.completeName(), "Josh Brown")
    }
}

Maintenant, discutons de ce qui se passe ici. La ligne d' import XCTest nous permettra d'étendre XCTestCase et d'utiliser XCTAssertEqual (parmi d'autres assertions). En étendant XCTestCase et en préfixant notre nom de test avec test , vous vous assurez que Xcode exécute automatiquement ce test lors de l'exécution des tests du projet ( ⌘U ou Product > Test ). La @testable import PersonApp importera notre cible PersonApp afin que nous puissions tester et utiliser des classes, comme la Person dans notre exemple ci-dessus. Et enfin, notre XCTAssertEqual fera en sorte que person.completeName() soit égal à la chaîne "Josh Brown" .



Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow