La construction de logiciels est un processus complexe. Au-delà de la maîtrise des différents outils et langages de programmation, il y a aussi la compréhension des différents rôles du développement logiciel. Comme la plupart d’entre nous le savent, les grands projets n’impliquent pas seulement le codage. Les grands projets impliquent également d’autres ressources pour la collecte des exigences, le prototypage et les tests.
Le processus de validation du code est souvent appelé assurance qualité. Cependant, cette expression est quelque peu trompeuse. Au lieu de garantir la qualité du code, le véritable objectif est de la mesurer – souvent au fur et à mesure de l’évolution du projet. Également connu sous le nom de développement piloté par les tests (par exemple, TDD), cette différence subtile peut être vue en examinant les rôles de la fonction qualité. Ceux-ci comprennent les éléments suivants:
POURQUOI DES TESTS UNITAIRES?
Comme on le voit, la mesure de la qualité est souvent regroupée en activités automatisées et manuelles. En tant que personne intéressée par les algorithmes, un code supplémentaire connu sous le nom de tests unitaires fonctionne pour tester votre projet logiciel principal. Les tests unitaires sont généralement écrits par les développeurs et sont le point central dans un environnement TDD. Par exemple, les tests unitaires sont essentiels dans le développement de ce livre. En utilisant le Framework XCTest d’iOS, examinons comment les tests unitaires fonctionnent dans Swift.
TRAVAILLER AVEC XCTEST
Si vous vous êtes familiarisé avec les concepts Swift examinés dans le livre, apprendre à écrire des tests unitaires devrait être simple. Comme nous l’avons vu, les tests unitaires fonctionnent pour exercer le code qui ne possède pas d’interface utilisateur final. Pour illustrer, passons en revue les cas de test qui exercent une structure de données Stack.
Bien que le livre ne passe pas en revue les particularités de l’environnement de développement intégré (IDE) Xcode, il convient de noter que les tests peuvent être exécutés par fonction, classe ou cible. Avec Xcode, les tests unitaires sont établis en ajoutant une nouvelle cible de test à votre projet de code principal. Une fois configurés, les tests unitaires peuvent être exécutés à partir de l’IDE ou de la ligne de commande.
RÈGLES DE TEST
Bien que cela ne soit pas obligatoire, il est considéré comme une meilleure pratique si le fichier de test unitaire correspond étroitement à la convention de dénomination de notre ou nos fichiers d’implémentation. Dans notre cas, nous utiliserons StackTest.swift. Pour avoir accès aux méthodes et propriétés primaires de Stack à partir de notre projet principal, le fichier comprendra également une déclaration d’importation testable :
Comme d’autres frameworks de tests unitaires, XCTest fonctionne en intégrant des fonctionnalités du langage Swift avec des fonctions spécifiques liées aux tests. Les méthodes essentielles sont regroupées sous forme d’assertions. Lors de la création de tests, le compilateur reconnaîtra les tests unitaires avec les fonctions préfixées par le mot-clé test.
Contrairement aux fonctions Swift ordinaires, les tests unitaires sont intentionnellement conçus comme des unités autonomes de logique. Par conséquent, les méthodes de test n’acceptent pas d’arguments et ne renvoient pas de valeurs. Alternativement, les données de test peuvent être gérées par des méthodes d’aide et des séquences d’initialisation / démolition. Considérez ce qui suit :
Planification des tests
Comme discuté, l’opération principale d’une structure de données Stack est l’ajout et la suppression d’éléments. Au lieu d’écrire une seule fonction pour tester toutes les opérations, notre plan de test isole chaque opération majeure de Stack avec son propre test. Comme on le voit avec testPushStack, l’assertion XCTAssertTrue vérifie l’initialisation correcte de la variable Stack.count. L’étape suivante consiste à exercer Stack.push en itérant dans le tableau des éléments de numberList. Pour vérifier que chaque test emploie les mêmes données, numberList est alimenté à l’aide de la méthode setup de la classe XCTestCase.
Avec le test unitaire pour l’ajout d’éléments de Stack implémenté, nous pouvons écrire le test suivant pour la suppression d’éléments :
.