229 votes

des Tests iOS/Specs / TDD/BDD et de l'Intégration Et de Tests d'Acceptation

Quelles sont les meilleures techniques à utiliser pour behavior-driven development sur l'iPhone? Et ce sont open source, exemple des projets qui démontrent la bonne utilisation de ces technologies? Voici quelques options que j'ai trouvé:


Les Tests Unitaires

Test::Unit Style

  1. OCUnit/SenTestingKit comme expliqué dans iOS le Guide de Développement: Tests Unitaires des Applications et d'autres OCUnit références.
  2. CATCH
  3. GHUnit
  4. Google boîte à outils pour Mac: iPhone Tests Unitaires

RSpec Style

  1. Kiwi (qui vient également avec les moqueries et les attentes)
  2. Cèdre
  3. Jasmin avec UI Automation comme le montre adroit' iOS-Test d'Acceptation specs

Les Tests D'Acceptation

Le Sélénium Style

  1. UI Automation (travaux sur l'appareil)

    Mise à JOUR: Courgettes Cadre semble mélange de Concombre & UI Automation! :)

    Ancien Blog:

  2. UISpec avec UISpecRunner

  3. FoneMonkey

Concombre Style

  1. Frank et iCuke (basé sur le Concombre de rencontre iPhone parler)

  2. KIF (le Garder Fonctionnel) par Carré

  3. Courgettes Cadre utilise le Concombre syntaxe pour écrire des tests et utilise CoffeeScript pour l'étape définitions.

Ajouts

Conclusion

Eh bien, évidemment, il n'y a pas de bonne réponse à cette question, mais voici ce que je suis le choix d'aller à l'heure actuelle:

Pour les tests unitaires, je l'habitude d'utiliser OCUnit/SenTestingKit dans XCode 4. C'est simple et solide. Mais, je préfère la langue de BDD sur TDD (Pourquoi est RSpec mieux que de Test::Unit?) parce que nos mots créent notre monde. Alors maintenant, j'utilise Kiwi avec ARC & Kiwi complétion de code/auto-complétion. Je préfère Kiwi plus de Cèdre, car il est construit sur le haut de OCUnit et est livré avec RSpec-style de rapprochement et se moque/stubs. Mise à JOUR: je suis maintenant à la recherche dans OCMock car, pour l'heure, le Kiwi ne supporte pas les buter sans frais comblé objets.

Pour le test d'acceptation, j'utilise l'INTERFACE utilisateur de l'Automatisation, car il est génial. Il vous permet d'enregistrer chaque cas de test, faire de l'écriture des tests automatiques. Aussi, Apple développe, et donc il a un avenir prometteur. Il travaille également sur l'appareil et d'Instruments, ce qui permet d'autres fonctionnalités intéressantes, comme montrant des fuites de mémoire. Malheureusement, avec UI Automation, je ne sais pas comment faire pour exécuter le code Objective-C, mais avec Frank & iCuke vous le pouvez. Donc, je vais juste tester le niveau inférieur de l'Objectif-C des trucs avec des tests unitaires, ou de créer UIButtons seulement pour l' TEST configuration de build, qui lorsqu'il est cliqué, va exécuter le code Objective-C.

Quelles solutions utilisez-vous?

Questions Connexes

53voto

Adam Milligan Points 2450

tl;dr

Au Central, nous avons écrit de Cèdre, parce que nous utilisons et de l'amour Rspec sur notre Ruby projets. Le cèdre n'est pas destiné à remplacer ou concurrencer OCUnit; il est destiné à apporter la possibilité de BDD style de tests pour Objective-C, tout comme Rspec pionnier de la BDD de style de tests en Ruby, mais n'a pas éliminé Test::Unit. Le choix de l'un ou l'autre est en grande partie une question de préférences de style.

Dans certains cas, nous avons conçu de Cèdre à surmonter certaines lacunes dans la manière OCUnit travaille pour nous. Plus précisément, nous voulions être en mesure d'utiliser le débogueur de tests, exécution des tests à partir de la ligne de commande et dans CI s'appuie, et obtenir utile de texte de sortie des résultats du test. Ces choses peuvent être plus ou moins utile pour vous.

Réponse longue

À choisir entre les deux infrastructures de test, comme le Cèdre et OCUnit (par exemple) se résume à deux choses: style préféré, et la facilité d'utilisation. Je vais commencer par le style, parce que c'est simplement une question d'opinion et de préférence; la facilité d'utilisation a tendance à être un ensemble de compromis.

Style considérations de transcender ce que la technologie ou la langue que vous utilisez. xUnit style de tests unitaires a été autour pendant beaucoup plus longtemps que la BDD de style de test, mais ce dernier a rapidement gagné en popularité, en grande partie en raison de Rspec.

Le principal avantage de xUnit de style test est sa simplicité, et sa large adoption (parmi les développeurs qui écrivent des tests unitaires); presque toutes les langues que vous pourriez considérer l'écriture de code a un xUnit-cadre de style disponibles.

BDD-style cadres ont tendance à avoir deux principales différences comparativement à xUnit-style: quelle est la structure de l'essai (ou spécifications), et la syntaxe pour écrire vos affirmations. Pour moi, la différence structurelle est le principal facteur de différenciation. xUnit tests sont unidimensionnels, avec une méthode de configuration pour tous les tests dans la classe de test. Les classes que nous testons, cependant, ne sont pas unidimensionnels; nous avons souvent besoin de tester des actions dans plusieurs différentes, potentiellement contradictoires, des contextes. Prenons l'exemple d'un simple ShoppingCart classe, avec un addItem: méthode (pour les fins de cette réponse, je vais utiliser Objective-C syntaxe). Le comportement de cette méthode peut être différente lorsque le panier est vide par rapport à quand le panier contient d'autres éléments; il peut être différent si l'utilisateur a entré un code de réduction; il peut être différent si l'élément spécifié ne peut être expédié par la méthode de livraison sélectionnée; etc. Tant que ces conditions se croisent les uns avec les autres, vous vous retrouvez avec une géométriquement nombre croissant de les contextes possibles; dans xUnit style de tester ce conduit souvent à un grand nombre de méthodes avec des noms comme testAddItemWhenCartIsEmptyAndNoDiscountcodeandshippingmethodapplies. La structure de la BDD-cadres de style vous permet d'organiser ces conditions individuellement, ce qui je trouve rend plus facile pour m'assurer de couvrir tous les cas, ainsi que plus facile à trouver, modifier, ou ajouter des conditions individuelles. Par exemple, à l'aide de Cèdre de la syntaxe, de la méthode ci-dessus ressemblerait à ceci:

describe(@"ShoppingCart", ^{
    describe(@"addItem:", ^{
        describe(@"when the cart is empty", ^{
            describe(@"with no discount code", ^{
                describe(@"when the shipping method applies to the item", ^{
                    it(@"should add the item to the cart", ^{
                        ...
                    });

                    it(@"should add the full price of the item to the overall price", ^{
                        ...
                    });
                });

                describe(@"when the shipping method does not apply to the item", ^{
                    ...
                });
            });

            describe(@"with a discount code", ^{
                ...
            });
        });

        describe(@"when the cart contains other items, ^{
            ...
        });
    });
});

Dans certains cas, vous trouverez des contextes qui contiennent les mêmes séries d'affirmations, qui vous pouvez SÉCHER à l'aide partagés exemple contextes.

La deuxième différence principale entre BDD-style frameworks xUnit et le style des cadres, l'affirmation (ou "matcher") de la syntaxe, fait tout simplement le style des specs un peu plus agréable, certaines personnes vraiment l'aiment, d'autres pas.

Qui conduit à la question de la facilité d'utilisation. Dans ce cas, chaque cadre a ses avantages et inconvénients:

  • OCUnit a été autour de beaucoup plus de temps que de Cèdre, et est directement intégré à Xcode. Cela signifie qu'il est simple de faire un nouveau test de la cible, et, la plupart du temps, l'obtention d'essais en place et en cours d'exécution "fonctionne, tout simplement." D'autre part, nous avons constaté que, dans certains cas, comme en cours d'exécution sur un appareil iOS, obtenir OCUnit tests de travail était à peu près impossible. La configuration de Cèdre spécifications prend un peu plus de travail que OCUnit tests, puisque vous avez obtenir la bibliothèque et le lien à l'encontre de vous-même (jamais une tâche triviale dans Xcode). Nous travaillons à rendre l'installation plus facile, et toutes les suggestions sont plus que bienvenus.

  • OCUnit exécute des tests dans le cadre de la construction. Cela signifie que vous n'avez pas besoin d'exécuter un fichier exécutable pour faire de votre exécution des tests; si l'un des tests échoue, votre échec de la construction. Cela rend le processus de l'exécution de tests une étape de plus simple et de sortie de test va directement dans votre fenêtre de sortie qui le rend facile à voir. Nous avons choisi de Cèdre ont spécifications construire dans un fichier exécutable qui vous exécuter séparément pour quelques raisons:

    • Nous voulions être en mesure d'utiliser le débogueur. Vous exécutez Cèdre specs comme vous le feriez exécuter tout autre exécutable, vous pouvez utiliser le débogueur de la même manière.
    • Nous voulions facile de journalisation de la console dans les tests. Vous pouvez utiliser NSLog() dans OCUnit tests, mais le résultat va dans la fenêtre de construction où vous avez à se dérouler l'étape de génération en vue de le lire.
    • Nous voulions facile à lire des rapports d'essais, à la fois sur la ligne de commande et dans Xcode. OCUnit résultats s'affiche bien dans la fenêtre de construction dans Xcode, mais la construction de la ligne de commande (ou dans le cadre d'un processus de veille) des résultats de test de sortie mêlé avec beaucoup, beaucoup d'autres la sortie de la construction. Distincte de créer et d'exécuter des phases de Cèdre sépare la sortie de sorte que la sortie d'un test est facile à trouver. La valeur par défaut de Cèdre de test runner copie le style standard de l'imprimerie "." le passage de chaque spec, "F" pour ne pas avoir les specs, etc. Le cèdre a également la possibilité d'utiliser des journaliste objets, de sorte que vous pouvez l'avoir sortie les résultats de n'importe quelle façon, avec un peu d'effort.
  • OCUnit est l'unité officielle framework de test pour Objective-C, et est pris en charge par Apple. Apple a pratiquement illimité de ressources, donc si ils veulent quelque chose, il va se faire. Et, après tout, c'est Apple sandbox nous allons jouer. Le revers de la médaille, cependant, c'est que Apple reçoit de l'ordre de un bajillion des demandes de support et les rapports de bug à chaque jour. Ils sont remarquablement bien à propos de la manipulation de tous, mais ils peuvent ne pas être en mesure de traiter des questions vous signalez immédiatement, ou à tous les. Le cèdre est beaucoup plus récente et moins cuit que OCUnit, mais si vous avez des questions ou des problèmes ou des suggestions, envoyez un message à la Cèdre liste de diffusion (cedar-discuss@googlegroups.com) et nous allons faire ce que nous pouvons pour vous aider. Aussi, n'hésitez pas à la fourchette le code à partir de Github (github.com/pivotal/cedar) et ajouter ce que vous pensez est manquant. Nous faisons nos tests, les cadres de l'open source pour une raison.

  • L'exécution de OCUnit des tests sur les appareils iOS peuvent être difficiles. Honnêtement, je n'ai pas essayé cela fait déjà quelques temps, donc il peut avoir obtenu plus facile, mais la dernière fois que j'ai essayé je ne pouvais simplement pas obtenir OCUnit de tests pour chaque UIKit de la fonctionnalité de travail. Lorsque nous avons écrit le Cèdre nous avons fait en sorte que nous puissions tester UIKit-code dépendant à la fois sur le simulateur et sur les périphériques.

Enfin, nous avons écrit de Cèdre pour les tests unitaires, ce qui signifie qu'il n'est pas vraiment comparable avec des projets comme UISpec. Il a été un certain temps depuis que j'ai essayé d'utiliser UISpec, mais j'ai compris qu'il se concentrer principalement sur par programme de conduite de l'INTERFACE utilisateur sur un appareil iOS. Plus précisément, nous avons décidé de ne pas essayer de Cèdre ont l'appui de ces types de spécifications, puisqu'Apple a été (à l'époque) sur le point d'annoncer UIAutomation.

8voto

raidfive Points 4308

Je vais avoir à lancer Franc dans les essais d'acceptation mélanger. C'est une assez nouvelle, mais a travaillé excellent pour moi jusqu'à présent. Aussi, il est effectivement travaillé activement sur, contrairement à icuke et les autres.

5voto

Richard J. Ross III Points 33152

Développement dirigé par les tests, j'aime utiliser GHUnit, c'est un jeu d'enfant, et fonctionne très bien pour le débogage.

4voto

user1129998 Points 1

Grande Liste!

J'ai trouvé une autre solution intéressante pour l'INTERFACE utilisateur de test des applications iOS.

Courgettes Cadre

Il est basé sur UIAutomation. Le cadre vous permettent d'écrire l'écran centrée sur les scénarios de Concombre comme style. Les scénarios peuvent être exécuté dans le Simulateur et sur l'appareil à partir d'une console (c'est de l'IC de l'environnement).

Les affirmations sont en fonction de capture d'écran. Sons rigide, mais il est agréable de rapport HTML, avec en surbrillance l'écran de comparaison et vous pouvez fournir des masques qui définissent les régions que vous souhaitez avoir des pixels exacte de l'assertion.

Chaque écran doit être décrit en CoffeScript et l'outil lui-même est écrit en ruby. Il est une sorte de polyglott cauchemar, mais l'outil offre une belle abstraction pour UIAutomation et lorsque les écrans sont décrites il est maniable même pour le contrôle de qualité de la personne.

2voto

SamCee Points 83

Je choisirais iCuke pour les tests d'acceptation et de Cèdre pour les tests unitaires. UIAutomation est un pas dans la bonne direction pour Apple, mais les outils ont besoin d'un meilleur soutien pour l'intégration continue; il s'exécute automatiquement UIAutomation tests avec des Instruments n'est actuellement pas possible, par exemple.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X