最近、Python で GUI アプリケーションを開発しながら TDD を試しています。コードの機能を検証するテストがあることは非常に心強いことですが、TDD の推奨されるプラクティスのいくつかに従うのは難しいことです。つまり、最初にテストを書くのは大変でした。また、テストを読みやすくするのが難しいと感じています (モッキング ライブラリを多用しているため)。
私はmockerというモッキングライブラリを選びました。私がテストしているコードの多くは、(a) システム状態に依存するアプリケーション内の他のメソッド、または (b) イベント ループなしでは存在できない ObjC/Cocoa オブジェクトなどを呼び出すため、これをよく使用します。
とにかく、次のようなテストがたくさんあります。
def test_current_window_controller():
def test(config):
ac = AppController()
m = Mocker()
ac.iter_window_controllers = iwc = m.replace(ac.iter_window_controllers)
expect(iwc()).result(iter(config))
with m:
result = ac.current_window_controller()
assert result == (config[0] if config else None)
yield test, []
yield test, [0]
yield test, [1, 0]
これは実際には 3 つのテストであることに注意してください。すべて同じパラメータ化されたテスト関数を使用します。テスト中のコードは次のとおりです。
def current_window_controller(self):
try:
# iter_window_controllers() iterates in z-order starting
# with the controller of the top-most window
# assumption: the top-most window is the "current" one
wc = self.iter_window_controllers().next()
except StopIteration:
return None
return wc
モッカーを使用して気づいたことの 1 つは、最初にアプリケーション コードを書き、次に戻ってテストを書く方が簡単だということです。呼び出しは、アプリケーション コードよりもはるかに冗長です (したがって、記述するのが難しくなります)。アプリ コードを記述し、それからテスト コードをモデル化する方が簡単です。
このテスト方法 (および少しの規律) により、100% のテスト カバレッジでコードを簡単に記述できることがわかりました。
これらのテストが良いテストであるかどうか疑問に思っていますか? 良いテストを書く秘訣を最終的に発見したとき、この方法を後悔するでしょうか?
テストが無駄になるほど、TDD のコア原則に違反していませんか?