J'ai un objet de service non trivial développé avec TDD. Cela a commencé par une tâche simple: Pour un objet de la file, construisez une tentative de traitement asynchrone. J'ai donc écrit un test autour de ma méthode constructAttempt()
:TDD - Refactoring en boîte noire?
void constructAttempt() {...}
Il existe de nombreux scénarios possibles qui doivent être pris en considération, j'ai donc des tests douzaine pour cette méthode. Puis j'ai implémenté ce que j'avais vraiment besoin de faire: Analyser toute la file d'attente et construire un lot de tentatives. Ainsi, le code ressemble plus:
public void go() {
for (QueuedItem item : getQueuedItems()) {
constructAttempt(item);
}
}
donc j'ai ajouté un nouveau test ou deux pour cette méthode go()
.
Enfin j'ai découvert je avais besoin de pré-traitement qui peut parfois affecter constructAttempt()
. Maintenant, le code ressemble plus:
public void go() {
preprocess();
for (QueuedItem item : getQueuedItems()) {
constructAttempt(item);
}
}
J'ai quelques doutes sur ce que je dois faire maintenant. Dois-je conserver le code tel quel, avec constructAttempt()
, preprocess()
et go()
testé de façon indépendante? Pourquoi oui/pourquoi pas? Je risque de ne pas couvrir les effets secondaires du prétraitement et de l'encapsulation de rupture.
Ou dois-je refactoriser toute ma suite de tests pour appeler seulement go()
(qui est la seule méthode publique)? Pourquoi oui/pourquoi pas? Cela rendrait les tests un peu plus obscurs, mais d'un autre côté, il prendrait en compte toutes les interactions possibles. Il deviendrait en fait un test de boîte noire utilisant uniquement l'API publique, ce qui peut ne pas être en accord avec TDD.
Si vous refactorisez votre suite de tests pour tester uniquement la méthode go() ... comment identifierz-vous si les bugs détectés sont en préprocess() ou en constructAttempt ?? –