Est-il généralement admis que vous ne pouvez pas tester de code à moins que le code ne soit configuré pour être testé?Possible de créer un code de test unitaire qui n'était pas initialement conçu pour être testé, sans changer de code?
Un peu hypothétique de code:
public void QueueOrder(SalesOrder order)
{
if (order.Date < DateTime.Now-20)
throw new Exception("Order is too old to be processed");
...
}
Certains considéreraient refactorisation dans:
protected DateTime MinOrderAge;
{
return DateTime.Now-20;
}
public void QueueOrder(SalesOrder order)
{
if (order.Date < MinOrderAge)
throw new Exception("Order is too old to be processed");
...
}
Note: Vous pouvez trouver des solutions encore plus compliquées; impliquant une interface IClock
et usine. Cela n'affecte pas ma question.
Le problème avec la modification du code ci-dessus est que le code a changé. Le code a changé sans que le client demande de le modifier. Et tout changement nécessite des réunions et des conférences téléphoniques. Et je suis au point où il est plus facile de ne rien tester.
Si je ne suis pas disposé/capable de faire des changements: est-ce que cela ne me rend pas capable d'effectuer des tests?
Remarque: Le pseudo-code ci-dessus peut ressembler à C#, mais c'est seulement pour qu'il soit lisible. La question est agnostique de la langue.
Remarque: L'extrait de code hypothétique, le problème, le besoin de refactorisation et le refactoring sont hypothétiques. Vous pouvez insérer votre propre échantillon de code hypothétique si vous prenez ombrage avec le mien.
Remarque: Le code hypothétique ci-dessus est hypothétique. Toute relation avec un code, vivant ou mort, est une pure coïncidence.
Remarque: Le code est hypothétique, mais les réponses ne le sont pas. La question n'est pas subjective: comme je crois qu'il y a une réponse.
Mise à jour: Le problème ici, bien sûr, est que je ne peux pas garantir que le changement dans l'exemple ci-dessus ne rien casser. Bien sûr, j'ai refacturé une pièce de code à une méthode distincte, et le code est logiquement identique.
Mais je ne peux pas garantir que l'ajout d'une nouvelle méthode protégée n'a pas déporté la table de méthode virtuelle de l'objet, et si cette classe est dans une DLL alors je viens d'introduire une violation d'accès.
Vous pouvez tester n'importe quel code. Certaines classes sont plus difficiles à tester que d'autres. Par exemple, une classe de servlet est plus difficile à tester qu'un POJO car la classe de servlet dépend de plus d'infrastructure qu'un POJO. – DwB