L'excuse principale du développeur pour ne pas avoir un bon test unitaire est "Le code n'est pas conçu de manière testable unitaire". J'essaie de comprendre quel type de conception et de code ne peut pas être testé à l'unité.
L'excuse principale du développeur pour ne pas avoir un bon test unitaire est "Le code n'est pas conçu de manière testable unitaire". J'essaie de comprendre quel type de conception et de code ne peut pas être testé à l'unité.
Réponses:
Plusieurs facteurs peuvent rendre le code difficile à tester unitaire. Dans ce cas, le refactoring permet d'améliorer le code afin qu'il soit testable.
Quelques exemples de code qui seraient probablement difficiles à tester:
function pGetDp_U(int i, int i2, string sText)
.Notez que le manque d'architecture claire ne rend pas le code difficile à tester unitaire, car les tests unitaires concernent de petites parties du code. Une architecture peu claire aurait toujours un impact négatif sur l'intégration et les tests du système.
Il y a beaucoup de choses qui rendent le code difficile à tester unitaire. Par coïncidence, beaucoup de ceux-ci rendent également le code difficile à maintenir:
Exemples courants de code que les gens ne souhaitent pas tester unitaire:
En utilisant un cadre factice, tous ces exemples peuvent être testés à l'unité. Il suffit de configurer les faux remplacements pour les dépendances internes.
Des choses qui ne peuvent vraiment pas être testées à l'unité:
Il existe quelques domaines pour lesquels il est plus difficile d'écrire des tests unitaires. Cependant, je tiens à souligner que cela ne signifie pas que vous devez ignorer les techniques utiles tout de suite simplement parce qu'elles peuvent ajouter une certaine complexité à vos tests. Comme avec tout codage, vous devriez faire votre propre analyse pour déterminer si les avantages dépassent les coûts, et ne pas accepter aveuglément ce que certains gars aléatoires publient sur le net.
Le coût de la plupart de ces spirales est incontrôlable, sauf si vous savez ce que vous faites. Malheureusement, beaucoup ne savent souvent pas comment utiliser ces techniques de manière à atténuer des choses comme les tests de complexité.
Le code ne peut pas être testé. Il existe cependant quelques exemples de code qui sont VRAIMENT, VRAIMENT difficiles à tester (au point de ne pas en valoir la peine):
Interactions matérielles - Si le code manipule directement le matériel (par exemple, écrire dans un registre pour déplacer un périphérique physique), les tests unitaires peuvent être trop difficiles ou coûteux. Si vous utilisez du matériel réel pour le test, cela peut coûter cher pour obtenir des commentaires appropriés dans le faisceau de test (encore plus d'équipement!), Et si vous ne le faites pas, vous devez émuler le comportement exact des objets physiques - pas une petite astuce certains cas.
Interactions d'horloge - Ceci est généralement plus facile, car il est presque toujours possible de simuler les fonctions d'horloge du système de manière assez triviale. Mais lorsque vous ne le pouvez pas, ces tests deviennent ingérables - les tests basés sur le temps réel ont tendance à prendre beaucoup de temps à s'exécuter, et d'après mon expérience, ils ont tendance à être très fragiles car les charges du système rendent les choses plus longues qu'elles ne le devraient , provoquant des échecs du test fantôme.
Mes trois principaux groupes pour cela sont:
code qui s'appuie sur des services externes
les systèmes qui ne permettent pas aux testeurs de modifier l'état indépendamment de l'application.
environnements de test qui ne reproduisent pas la configuration de production.
C'est ce que j'ai vécu le plus en tant que développeur devenu ingénieur QA.