De mon point de vue, vous avez tous les deux l'avantage et vous êtes "désavantagé" (sic).
L'avantage est que vous disposez d'un système avec lequel vous vous sentez à l'aise et qui fonctionne pour vous. Vous êtes heureux que cela confirme la validité de votre produit, et vous ne trouveriez probablement aucune valeur commerciale en essayant de changer tous vos tests pour quelque chose qui utilise un cadre différent. Si vous pouvez refactoriser votre code et que vos tests détectent les modifications - ou mieux encore, si vous pouvez modifier vos tests et que votre code existant échoue aux tests jusqu'à ce qu'il soit refactorisé, alors toutes vos bases sont couvertes. Pourtant...
L'un des avantages d'avoir une API de test unitaire bien conçue est qu'il y a beaucoup de support natif dans la plupart des IDE modernes. Cela n'affectera pas le VI noyau dur et les utilisateurs emacs qui ricanent les utilisateurs de Visual Studio, mais pour ceux qui utilisent un bon IDE, vous avez la possibilité de déboguer vos tests et de les exécuter dans l'IDE lui-même. C'est bien, mais il y a un avantage encore plus grand en fonction du framework que vous utilisez, et c'est dans le langage utilisé pour tester votre code.
Quand je dis langage , je ne parle pas d'un langage de programmation, mais plutôt d'un ensemble de mots riches enveloppés dans une syntaxe fluide qui fait lire le code de test comme une histoire. En particulier, je suis devenu un défenseur de l'utilisation des cadres BDD . Mon API personnelle DotNet BDD est StoryQ, mais il y en a plusieurs autres avec le même objectif de base, qui est de retirer un concept d'un document d'exigences et de l'écrire dans le code d'une manière similaire à la façon dont il est écrit dans la spécification. Les très bonnes API vont cependant encore plus loin, en interceptant chaque instruction individuelle dans un test et en indiquant si cette instruction s'est exécutée avec succès ou a échoué. Ceci est incroyablement utile, car vous pouvez voir l'intégralité du test exécuté sans revenir tôt, ce qui signifie que vos efforts de débogage deviennent incroyablement efficaces car vous n'avez besoin de concentrer votre attention que sur les parties du test qui ont échoué, sans avoir besoin de décoder l'appel entier séquence. L'autre chose intéressante est que la sortie de test vous montre toutes ces informations,
À titre d'exemple de ce dont je parle, comparez les éléments suivants:
Utilisation d'assertions:
Assert(variable_A == expected_value_1); // if this fails...
Assert(variable_B == expected_value_2); // ...this will not execute
Assert(variable_C == expected_value_3); // ...and nor will this!
Utilisation d'une API BDD fluide:
(Imaginez que les bits en italique sont essentiellement des pointeurs de méthode)
WithScenario("Test Scenario")
.Given(*AConfiguration*) // each method
.When(*MyMethodToTestIsCalledWith*, variable_A, variable_B, variable_C) // in the
.Then(*ExpectVariableAEquals*, expected_value_1) // Scenario will
.And(*ExpectVariableBEquals*, expected_value_2) // indicate if it has
.And(*ExpectVariableCEquals*, expected_value_3) // passed or failed execution.
.Execute();
Maintenant, la syntaxe BDD est plus longue et plus verbeuse, et ces exemples sont terriblement artificiels, mais pour les situations de test très complexes où beaucoup de choses changent dans un système en raison d'un comportement système donné, la syntaxe BDD vous offre une une description de ce que vous testez et de la façon dont votre configuration de test a été définie, et vous pouvez montrer ce code à un non-programmeur et il comprendra instantanément ce qui se passe. De plus, si "variable_A" échoue au test dans les deux cas, l'exemple Asserts ne s'exécutera pas après la première assertion tant que vous n'aurez pas résolu le problème, tandis que l'API BDD exécutera tour à tour chaque méthode appelée dans la chaîne et indiquera laquelle certaines parties de la déclaration étaient erronées.
Personnellement, je trouve que cette approche fonctionne beaucoup mieux que les frameworks xUnit plus traditionnels dans le sens où le langage de test est le même langage que vos clients parleront de leurs exigences logiques. Malgré tout, j'ai réussi à utiliser les frameworks xUnit dans un style similaire sans avoir besoin d'inventer une API de test complète pour soutenir mes efforts, et bien que les assertions se court-circuitent toujours efficacement, elles lisent plus proprement. Par exemple:
Utilisation de Nunit :
[Test]
void TestMyMethod()
{
const int theExpectedValue = someValue;
GivenASetupToTestMyMethod();
var theActualValue = WhenIExecuteMyMethodToTest();
Assert.That(theActualValue, Is.EqualTo(theExpectedValue)); // nice, but it's not BDD
}
Si vous décidez d'explorer l'utilisation d'une API de test unitaire, mon conseil est d'expérimenter avec un grand nombre d'API différentes pendant un petit moment, et de garder l'esprit ouvert sur votre approche. Bien que je plaide personnellement pour le BDD, vos propres besoins commerciaux peuvent nécessiter quelque chose de différent selon la situation de votre équipe. La clé est cependant d'éviter de deviner votre système existant. Vous pouvez toujours prendre en charge vos tests existants avec quelques tests en utilisant une autre API si nécessaire, mais je ne recommanderais certainement pas une énorme réécriture de test juste pour que tout soit pareil. Comme le code hérité tombe en panne, vous pouvez facilement le remplacer, ainsi que ses tests, par du nouveau code, et tester à l'aide d'une API alternative, et cela sans avoir à investir dans un effort majeur qui ne vous donnera pas nécessairement une réelle valeur commerciale. Quant à l'utilisation d'une API de test unitaire,