Pour atteindre une pleine mesure de la confiance dans votre code que vous avez besoin de différents niveaux de tests: unitaires, d'intégration et fonctionnels. Je suis d'accord avec les conseils donnés ci-dessus que les états que les essais devraient être automatiques (intégration continue) et que les tests unitaires doivent couvrir toutes les branches à une variété de cas de bord ensembles de données. Les outils de couverture de Code (par exemple, Cobertura, Trèfle, EMMA etc) permet d'identifier des trous dans tes branches, mais pas dans la qualité de votre essai des ensembles de données. L'analyse statique de code comme FindBugs, PMD, la formation continue peut identifier les zones à problème dans votre code avant qu'ils ne deviennent un problème et aller un long chemin vers la promotion de meilleures pratiques de développement.
Les essais doivent tenter de reproduire l'ensemble de l'environnement que l'application va être en cours d'exécution dans la mesure du possible. Il devrait commencer à partir de la plus simple possible (unité) à la plus complexe (fonctionnelle). Dans le cas d'une application web, l'obtention d'un processus automatisé dans tous les cas d'utilisation de votre site web avec une variété de navigateurs est un must si quelque chose comme SeleniumRC devrait être dans votre boîte à outils.
Cependant, il existe des programmes pour répondre à un besoin de l'entreprise il y a donc aussi des tests contre les exigences. Ceci tend à être plus d'un manuel de processus, sur la base fonctionnelle (web) des tests. Essentiellement, vous aurez besoin pour construire une matrice de traçabilité à l'encontre de chacune de ces exigences dans le cahier des charges et le test fonctionnel. Comme les tests fonctionnels sont créés, ils sont jumelés contre l'une ou plusieurs des exigences (par exemple, la Connexion comme Fred, mettre à jour les détails du compte pour un mot de passe, vous déconnecter à nouveau). Cela répond à la question de savoir si ou non le produit correspond aux besoins de l'entreprise.
Dans l'ensemble, je serais partisan d'un développement piloté par les tests approche basée sur certains saveur de traitement automatisé de tests unitaires (JUnit, nUnit, etc). Pour les tests d'intégration, je vous recommande de vous constituer une base de données de test qui est rempli automatiquement à chaque build avec un ensemble de données qui illustre cas d'utilisation courante, mais qui permet à d'autres tests pour construire sur. Pour les tests fonctionnels, vous aurez besoin d'une sorte d'interface utilisateur robot (SeleniumRC pour le web, l'Abbé pour le Swing, etc). Des mesures concernant chacun peut facilement être recueillies pendant le processus de construction et affiché sur le serveur CI (par exemple Hudson) pour tous les développeurs à voir.