Votre stratégie et votre squelette dépendent, de manière non triviale, des types de tests que vous cherchez à générer, du type de couverture que vous recherchez et de la langue / de l'environnement dans lequel vous travaillez.
Il est assez simple d'écrire un générateur de test qui, pour des langages comme C ou Java, lit les signatures de classe et génère automatiquement des tests pour les cas d'angle standard (passage de 0, 2 valeurs aléatoires, MAX_INT, MIN_INT, à un argument entier, null pour nullables , etc...). Vous pouvez ensuite exécuter les tests générés, enregistrer les résultats de chaque test et les filtrer manuellement pour supprimer ceux qui ne sont pas pertinents, approuver les résultats acceptables pour les tests qui réussissent (afin qu'ils puissent passer automatiquement à partir de là) et les marquer comme invalides qui échouent .
Vous pouvez augmenter cela avec le balisage / commentaire / refactorisation des classes pour aider votre générateur avec des conseils supplémentaires. Vous pouvez avoir une balise qui répertorie toutes les exceptions possibles qu'un appel de méthode est autorisé à lever, ou qui donne une plage réduite d'entiers valides pour un argument entier. Considérez-les comme un raccourci pour avoir à passer les tests vous-même.
Donc, voici quelques composants que vous voudrez regarder:
- Un composant pour analyser automatiquement le code source / les signatures de fonction / annotations manuelles, produisant des cas de test standard, ou des contours / signatures pour les cas de test qui attendent la fin de votre entrée.
- Un langage de balises / annotations / commentaires perpétuellement croissant / changeant qui peut aller à n'importe quel niveau de granularité (méthode / classe / signature / boucles while / etc ...) représentant des conseils pour le générateur de tests automatisé. Idéalement, vous devriez pouvoir jouer avec ce langage sans avoir à recoder votre framework ou ses morceaux
- Runner de test automatisé, avec la capacité d'identifier les nouveaux / anciens tests et d'enregistrer / tester les réponses "acceptables" pour chaque test. Idéalement, ce coureur construira une base de données des essais, des résultats acceptés / refusés et des résultats acceptables actuels pour chaque essai.
- "Objet faker" automatisé qui, étant donné un nom de classe et une carte de noms-> valeurs, peut générer un objet imitant la classe, renvoyant des données personnalisables pour les appels de fonction, les accesseurs, les emplacements de données publics, etc.
Il existe de nombreux frameworks de test qui incluent déjà des morceaux de cette fonctionnalité pour différents langages et plates-formes. Bien qu'il soit assez facile de commencer à faire ce travail vous-même et de développer ce type de cadre de manière organique en interne, il s'agit également d'un projet à long terme sans fin qui reproduira probablement le travail existant. Je recommanderais de prendre beaucoup de temps pour regarder ce qui est disponible en premier, puis décider si cela vaut la peine de plonger.