Je suis principalement un codeur C++, et jusqu'à présent, ont géré sans vraiment l'écriture de tests pour l'ensemble de mon code. J'ai décidé que c'est une Mauvaise Idée(tm), après l'ajout de nouvelles fonctionnalités qui subtilement cassé anciennes fonctionnalités, ou, selon la façon dont vous voulez regarder, introduit quelques nouvelles "fonctionnalités" de leur propre.
Mais, tests unitaires semble extrêmement fragile mécanisme. Vous pouvez tester quelque chose de "parfait" les conditions, mais vous n'obtenez pas de voir comment votre code effectue lorsque les choses se casse. Un, par exemple, est un robot, disons qu'il analyse quelques sites spécifiques, pour les données X. Faire, il vous suffit de sauvegarder des pages d'exemple, test contre ces, et on espère que les sites ne jamais changer? Ce serait bien fonctionner en tant que tests de régression, mais, ce genre de tests écririez-vous de vérifier en permanence les sites en direct et vous permettent de savoir quand l'application n'est pas fait son travail parce que le site a changé quelque chose, qui est maintenant à l'origine de votre application crash? Vous ne voudriez pas que votre suite de tests pour surveiller l' intention de le code?
L'exemple ci-dessus est un peu artificiel, et quelque chose que je n'ai pas rencontré (dans le cas où vous ne l'avez pas deviné). Permettez-moi de prendre quelque chose que j'ai, cependant. Comment faites-vous tester une application fera son travail face à une dégradation de la pile réseau? Qui est, disons que vous avez une quantité modérée de la perte de paquets, pour une raison ou l'autre, et vous avez une fonction DoSomethingOverTheNetwork()
qui est censé dégrader gracieusement lorsque la pile ne fonctionne pas comme il est censé le faire; mais n'est ce pas? Les tests réalisés par le développeur personnellement dessein par la configuration d'une passerelle qui tombe paquets pour simuler un mauvais réseau quand il écrit d'abord. Quelques mois plus tard, quelqu'un vérifie dans le code qui modifie quelque chose de subtilement, de sorte que la dégradation n'est pas détecté à temps, ou, l'application n'a même pas reconnaître la dégradation, ce n'est jamais pris, parce que vous ne pouvez pas exécuter le monde réel des tests de ce genre à l'aide de tests unitaires, pouvez-vous?
De plus, comment au sujet de la corruption de fichiers? Disons que vous êtes stocker une liste de serveurs dans un fichier, et la somme de contrôle semble correct, mais les données n'est pas vraiment le cas. Vous voulez que le code de poignée, vous écrire un peu de code que vous pensez que le fait que. Comment tester que c'est exactement ce que fait pour la vie de l'application? Pouvez-vous?
Par conséquent, la fragilité. Les tests unitaires semblent tester le code que dans des conditions parfaites(et c'est favorisée, avec les objets fantaisie et par exemple), et non pas ce qu'ils feront face à l'état sauvage. Ne vous méprenez pas, je pense que les tests unitaires sont grands, mais une suite de test composé uniquement d'entre eux semble être une bonne manière d'introduire des bogues dans le code tout en se sentant trop confiants à ce sujet de la fiabilité.
Comment puis-je corriger les situations ci-dessus? Si les tests unitaires ne sont pas la réponse, c'est quoi?
Edit: je vois beaucoup de réponses que de dire "juste mock". Eh bien, vous ne pouvez pas "juste mock", voici pourquoi: En prenant mon exemple de la dégradation de la pile réseau, supposons que votre fonction est bien définie NetworkInterface, que nous allons simuler. L'application envoie des paquets sur TCP et UDP. Maintenant, laissez-nous dire, hey, nous allons simuler la perte de 10% sur l'interface à l'aide d'un objet fantaisie, et de voir ce qui se passe. Vos connexions TCP à augmenter leurs tentatives, ainsi que d'augmenter leur back-off, toutes les bonnes pratiques. Vous décidez de changer de X% de vos paquets UDP pour réellement faire une connexion TCP, avec perte de l'interface, nous voulons être en mesure d'être en mesure de garantir la livraison de certains paquets, et les autres ne devraient pas perdre trop. Fonctionne très bien. Pendant ce temps, dans le monde réel.. lorsque vous augmentez le nombre de connexions TCP (ou, données sur TCP) sur une connexion avec perte assez, vous finirez par l'augmentation de votre paquet UDP perte de vos connexions TCP sera la fin de la ré-envoi de leurs données de plus en plus et/ou la réduction de leur fenêtre, à l'origine de votre 10% de perte de paquets pour être réellement plus de 90% de perte de paquets UDP maintenant. Whoopsie.
Pas trop grave, on s'attaque en UDPInterface, et TCPInterface. Attendez une minute.. ceux sont interdépendants, contrôle de 10% UDP perte et 10% TCP perte n'est pas différent de ci-dessus.
Donc, la question est maintenant, vous n'êtes pas tout simplement de l'unité de tester votre code, vous introduisez vos hypothèses sur la manière dont le système d'exploitation de la pile TCP fonctionne. Et, c'est une Mauvaise Idée(tm). Une idée encore pire que tout en évitant l'ensemble de ce fiasco.
À un certain moment, vous allez avoir à créer une Maquette de l'OS, qui se comporte exactement comme votre vrai OS, à l'exception, est vérifiable. Cela ne semble pas comme une bonne voie à suivre.
Ce sont des choses que nous avons vécues, je suis sûr que d'autres peuvent ajouter leurs expériences.
J'espère que quelqu'un va me dire que je suis très mal, et le point pourquoi!
Merci!