おそらく問題は、テストdocstringを書くのに最適な方法ではなく、テスト自体を書く方法にありますか?自己文書化するような方法でテストをリファクタリングすることは大いに役立つ可能性があり、コードが変更されてもdocstringが古くなることはありません。
テストをより明確にするためにできることがいくつかあります。
- 明確で説明的な試験方法名(すでに述べた)
- テスト本体は明確かつ簡潔である必要があります(自己文書化)
- メソッド内の複雑なセットアップ/ティアダウンなどを抽象化します
- もっと?
たとえば、次のようなテストがある場合:
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
セットアップステートメントをメソッド呼び出しに置き換えることができます。
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
テストメソッドは、テストに固有のDSLの一種である、意図を明らかにする名前を持つ一連のメソッド呼び出しで構成されていることに注意してください。そのようなテストにはまだドキュメントが必要ですか?
もう1つの注意点は、テストメソッドは主に1つの抽象化レベルにあるということです。テストメソッドを読んでいる人は、アルゴリズムが次のようになっていることを確認できます。
- ウィジェットの作成
- ウィジェットで実行を呼び出す
- コードを主張することは私たちが期待することをしました
テスト方法についての彼らの理解は、ウィジェットの設定の詳細によって混乱することはありません。これは、テスト方法よりも1レベル低い抽象化です。
テストメソッドの最初のバージョンは、インラインセットアップパターンに従います。2番目のバージョンは、作成方法と委任されたセットアップのパターンに従います。
コードの「理由」を説明する場合を除いて、一般的にコメントには反対です。ボブ・マーチンおじさんのクリーンコードを読んで、私はこれを確信しました。コメントに関する章とテストに関する章があります。私はそれをお勧めします。
自動テストのベストプラクティスの詳細については、xUnitパターンを確認してください。