Utile modèles de conception pour les tests unitaires/TDD?
Lecture cette question m'a aidé à consolider certains des problèmes que j'ai toujours eu avec les tests unitaires, TDD, et al.
Depuis de venir à travers le TDD approche du développement, je savais que c'était le bon chemin à suivre. La lecture des différents tutoriels m'ont aidé à comprendre comment faire un début, mais ils ont toujours été très simpliste, pas vraiment quelque chose que l'on peut appliquer à un projet actif. Le meilleur que j'ai réussi est l'écriture de tests autour de petites parties de mon code - des choses comme les bibliothèques, qui sont utilisés par l'application principale, mais ne sont pas intégrés, en quelque sorte. Tout cela a été utile, il équivaut à environ 5% de la base de code. Il y a très peu là-bas sur la façon de passer à l'étape suivante, pour m'aider à faire quelques tests dans l'application principale.
Des commentaires tels que "la Plupart des code sans tests unitaires est construit en dur dépendances (c'est à dire la nouvelle en a partout) ou des méthodes statiques." et "...il n'est pas rare d'avoir un haut niveau de couplage entre les classes, dur-à-configurer les objets à l'intérieur de votre classe [...] et ainsi de suite." m'ont fait réaliser que la prochaine étape est de comprendre comment de-couple de code pour rendre testable.
Que dois-je regarder pour m'aider à faire cela? Est-il un ensemble de modèles de conception que j'ai besoin de comprendre et de commencer à mettre en œuvre qui permettra de tester plus facilement?
Vous devez vous connecter pour publier un commentaire.
Ici Mike Clifton décrit les 24 modèles de test à partir de 2004. Ses une heuristique utile lors de la conception des tests unitaires.
http://www.codeproject.com/Articles/5772/Advanced-Unit-Test-Part-V-Unit-Test-Patterns
De Réussite/D'Échec Des Modèles
Ces modèles sont votre première ligne de défense (ou d'attaque, selon votre point de vue) pour garantir le bon code. Mais attention, elles sont trompeuses en ce qu'ils vous disent au sujet du code.
De Données Les Modèles De Transaction
De données les modèles de transaction sont un point de départ à embrasser les enjeux de la persistance des données et de la communication. Plus sur ce sujet est abordé sous "Modèles de Simulation". Aussi, ces modèles délibérément omettre les tests de stress, par exemple, le chargement sur le serveur. Cette question sera examinée sous "Stress-Test des Modèles".
Collection Sur Les Modes De Gestion
Beaucoup de ce que les applications de faire, c'est gérer des collections d'informations. Bien qu'il existe une variété de collections à la disposition du programmeur, il est important de vérifier (et donc le document) que le code est à l'aide de la bonne collection. Cette touche de commande et de contraintes.
Schémas De
Unité de test ne doit pas être concerné par la fonction, mais aussi de la forme. Comment efficacement le code sous test effectuer sa fonction? À quelle vitesse? De combien de mémoire faut-il utiliser? Est-il compromis d'insertion de données pour l'extraction des données de manière efficace? Est-il libérer les ressources correctement? Ce sont toutes les choses qui sont du ressort de l'unité de test. En incluant les performances des modèles dans l'unité de test, l'opérateur a un but à atteindre, ce qui résulte en un code de meilleure qualité, une meilleure application, et le bonheur de la clientèle.
Processus De Modèles
Unité de test est destiné à tester, eh bien, unités...les fonctions de base de l'application. Il peut être soutenu que les processus de test devrait être relégué à l'acceptation des procédures de test, cependant je n'achète pas dans cet argument. Un processus est juste un autre type d'unité. Les processus de test avec un testeur unitaire de fournir les mêmes avantages que les autres tests unitaires--il des documents de la manière dont le processus est destiné à travailler et l'unité testeur peut aider le responsable de l'implémentation par aussi de tester le processus de séquence, d'identifier rapidement les éventuels problèmes de l'interface utilisateur ainsi. Le terme "processus" comprend également les transitions de l'état et des règles de gestion, qui doit être validée.
Modèles De Simulation
Des transactions de données sont difficiles à tester, car ils ont souvent besoin d'une configuration prédéfinie, une connexion ouverte, et/ou en ligne de l'appareil (pour n'en nommer que quelques-uns). Les objets fantaisie peut venir à la rescousse par la simulation de la base de données, des services web, l'utilisateur, la connexion et/ou de matériel avec lequel le code est concluant. Les objets fantaisie ont également la capacité de créer des conditions d'échec qui sont très difficiles à reproduire dans le monde réel--une perte de connexion, un serveur lent, l'échec d'un concentrateur de réseau, etc.
Multithreading Modèles
Tests unitaires des applications multithread est probablement l'une des choses les plus difficiles à faire parce que vous avez à mettre en place une condition qui, par sa nature, est destiné à être asynchrone et donc non-déterministe. Cette rubrique est probablement un article en lui-même, donc je vais en donner un très générique modèle ici. En outre, pour effectuer de nombreuses opérations de filetage tests correctement, l'unité de testeur de l'application doit lui-même d'exécuter des tests comme des threads séparés de sorte que l'appareil testeur n'est pas désactivé lorsqu'un thread se termine dans un état d'attente
De Stress-Test Des Modèles
La plupart des applications sont testées dans des environnements idéaux--le programmeur est à l'aide d'une machine rapide avec peu de trafic réseau, à l'aide de petits jeux de données. Le monde réel est très différent. Avant de quelque chose de complètement pauses, l'application peut souffrir de la dégradation et répondent mal ou avec des erreurs de l'utilisateur. Unité de tests visant à vérifier que le code de la performance sous stress devraient être satisfaits avec une égale ferveur (si pas plus) que les tests unitaires dans un environnement idéal.
Couche De Présentation Des Modèles
L'un des aspects les plus difficiles de l'unité de test est de vérifier que l'information est d'entrer dans le droit de l'utilisateur à la couche de présentation elle-même et que le fonctionnement interne de l'application sont correctement réglage de la couche de présentation de l'état. Souvent, les couches de présentation sont mêlés à des affaires objets, des objets de données, et la logique de contrôle. Si vous avez l'intention de l'unité de test de la couche de présentation, vous vous rendez compte que la séparation des préoccupations est obligatoire. Une partie de la solution consiste à développer un Modèle-Vue-Contrôleur (MVC) de l'architecture. L'architecture MVC fournit un moyen de développer de bonnes pratiques de conception lorsque vous travaillez avec la couche de présentation. Toutefois, il est facile d'abus. Une certaine discipline est nécessaire pour s'assurer que vous êtes, en fait, la mise en œuvre de l'architecture MVC correctement, plutôt que de simplement en parole seulement.
Je dirais que vous devez principalement deux choses à tester, et ils vont main dans la main:
J'ai moi-même n'avons pas la maîtrise de l'art de tests unitaires (et je suis loin de ça), mais c'est là que mes efforts se passe actuellement. Le problème est que je n'ai toujours pas de conception, de tests, et comme un résultat mon code a plier vers l'arrière pour accueillir...
Michael Plume du livre Travailler Efficacement Avec Le Code Existant est exactement ce que vous cherchez. Il définit legacy code "code sans tests" et parle de la façon de l'obtenir en vertu de test.
Comme avec la plupart des choses, c'est une étape à la fois. Lorsque vous apportez une modification ou une correction d'essayer d'augmenter la couverture de test. Comme le temps passe, vous aurez un ensemble plus complet de tests. Il parle de techniques de réduction de couplage et comment le test d'ajustement de pièces entre la logique de l'application.
Comme indiqué dans d'autres réponses de l'injection de dépendances est un bon moyen d'écrire vérifiables (et faiblement couplés en général) du code.
Gérard Meszaros' xUnit des Modèles de Test: Refactoring de Code de Test est plein à craquer de modèles pour les tests unitaires. Je sais que vous êtes à la recherche pour les modèles de l'ATS, mais je pense que vous trouverez beaucoup d'informations utiles dans ce livre
Le livre est sur le safari de sorte que vous pouvez obtenir un très bon oeil à ce qui est à l'intérieur pour voir si elle pourrait vous être utile:
http://my.safaribooksonline.com/9780131495050
Organiser, d'Agir, de faire Valoir est un bon exemple d'un modèle qui vous aide à structurer votre code de test autour notamment des cas d'utilisation.
Voici quelques hypothétique de code C# qui illustre le schéma.
Si vous avez beaucoup de scénarios de test, vous pouvez extraire une classe abstraite commune avec le béton Organiser & Loi sur les bits (ou tout simplement Organiser et mettre en œuvre le reste abstrait bits & fonctions de test dans les classes héritées de ce groupe de fonctions de test.
Droit! SOLIDE est ce que vous cherchez (oui, vraiment). Je garde de recommander ces 2 ebooks, spécialement la une seule sur le MASSIF de la question à portée de main.
Vous devez comprendre que c'est très dur si vous êtes l'introduction de tests unitaires pour un code de base. Malheureusement étroitement couplé code est beaucoup trop commun. Cela ne veut pas dire de ne pas le faire, mais pour un bon moment ça va être juste comme vous l'avez mentionné, les tests seront plus concentrés dans les petites pièces.
Au fil du temps ces grandir dans un champ d'application plus large, mais cela dépend de la taille de la base de codage, la taille de l'équipe et combien sont en train de faire au lieu de les aggraver le problème.
Modèles de conception ne sont pas directement pertinentes pour les ATS, car ils sont des détails de mise en œuvre. Vous ne devriez pas essayer de s'adapter à des modèles dans votre code, simplement parce qu'ils existent, mais ils ont plutôt tendance à apparaître comme votre code évolue. Ils deviennent également utile si votre code est puant, car ils aident à résoudre de tels problèmes. Ne pas développer du code avec des modèles de conception dans l'esprit, il suffit d'écrire le code. Ensuite d'obtenir des tests de passage, et refactoriser.
Un grand nombre de problèmes comme cela peut être résolu avec une bonne encapsulation. Ou, vous pourriez avoir ce problème si vous êtes le mélange de vos préoccupations. Disons que vous avez un code qui valide un utilisateur, la validation d'un objet de domaine, puis enregistre le domaine objet de tous dans une méthode ou d'une classe. Vous avez mélangé à vos préoccupations, et vous n'allez pas être heureux. Vous avez besoin de séparer ces préoccupations (authentification, autorisation, la logique métier, la persistance), de sorte que vous pouvez les tester dans l'isolement.
Les modèles de conception de l'aide, mais beaucoup de les exotiques ont très peu de problèmes auxquels ils peuvent être appliqués. Des modèles comme les composites, de commande, sont souvent utilisés, et sont simples.
La ligne directrice est la suivante: si il est très difficile de tester quelque chose, vous pouvez probablement à refactoriser en problèmes plus petits et test de la refonte des bits dans l'isolement. Donc, si vous avez un 200 méthode de la ligne avec 5 niveaux de if et un peu pour les boucles, vous pouvez diviser que meunier jusqu'.
Donc, commencer par voir si vous pouvez faire compliqué code plus simple par la séparation de vos préoccupations, et ensuite voir si vous pouvez faire compliqué code plus simple par éclater. Bien sûr, si un modèle de conception saute au visage, puis aller pour it.
De L'Injection De Dépendances/Cio. Lire également sur l'injection de dépendance des frameworks tels que SpringFramework et google guice. Ils sont également la cible des comment écrire du code testable.