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.