Peut-être que le problème n'est pas de savoir comment écrire des docs de test, mais comment écrire les tests eux-mêmes? Refactoriser les tests de manière à ce qu'ils soient auto-documentés peut aller loin, et votre docstring ne disparaîtra pas lorsque le code changera.
Il y a quelques choses que vous pouvez faire pour rendre les tests plus clairs:
- noms clairs méthode d'essai descriptives & (déjà mentionné)
- corps d'épreuve doit être (auto-documenté) claire et concise
- résumé loin installation compliquée/démontage etc dans les méthodes
- plus?
Par exemple, si vous avez un test comme celui-ci:
def test_widget_run_returns_0():
widget = Widget(param1, param2, "another param")
widget.set_option(true)
widget.set_temp_dir("/tmp/widget_tmp")
widget.destination_ip = "10.10.10.99"
return_value = widget.run()
assert return_value == 0
assert widget.response == "My expected response"
assert widget.errors == None
Vous pouvez remplacer les instructions de configuration avec un appel de méthode:
def test_widget_run_returns_0():
widget = create_basic_widget()
return_value = widget.run()
assert return_value == 0
assert_basic_widget(widget)
def create_basic_widget():
widget = Widget(param1, param2, "another param")
widget.set_option(true)
widget.set_temp_dir("/tmp/widget_tmp")
widget.destination_ip = "10.10.10.99"
return widget
def assert_basic_widget():
assert widget.response == "My expected response"
assert widget.errors == None
Notez que votre méthode de test est maintenant composé d'une série d'appels de méthodes avec des noms révélateurs d'intention, une sorte de DSL spécifique à vos tests. Un test comme celui-là a-t-il besoin de documentation? Une autre chose à noter est que votre méthode de test est principalement à un niveau d'abstraction. Quelqu'un lisant la méthode d'essai verra l'algorithme est:
- créer un widget
- appelant run sur le widget
- affirmant le code fait ce que nous attendons
Leur compréhension de la méthode d'essai n'est pas brouillé par les détails de la mise en place du widget, qui est un niveau d'abstraction inférieur à la méthode de test.
La première version de la méthode de test suit le modèle Inline Setup. La deuxième version suit les modèles Creation Method et Delegated Setup.
Généralement, je suis contre les commentaires, sauf s'ils expliquent le «pourquoi» du code. La lecture du Clean Code de l'oncle Bob Martin m'a convaincu de cela. Il y a un chapitre sur les commentaires, et il y a un chapitre sur les tests. Je le recommande.
Pour en savoir plus sur les meilleures pratiques en matière de tests automatisés, consultez le document xUnit Patterns.
Qu'est-ce qui se passe avec les noms de vos fonctions?Je suppose que vous nommez vos tests "testFunctionName" et c'est correct, mais vous avez sérieusement une fonction nommée InitializeSetsUpChessBoardCorrectly? Je pense que "setUpChessboard" ferait très bien. –
Non, le nom de la méthode explique exactement ce qu'il teste - ce scénario de test vérifie qu'initalize() configure correctement le tableau d'échecs. Boom, documentation automatique. –
Haha ouais, le "test" au début est juste de l'ancien temps de JUnit, dans lequel mon cerveau est toujours bloqué. Je pourrais juste le nommer initalizeSetsUpChessBoardCorrectly() et utiliser une annotation @Test. –