2

私は新しい仕事で新しいプロジェクトを始めています。Python で本格的に作業するのはこれが初めてです。モッキングは、静的に型付けされた言語でジャンプしなければならなかったフープと比較すると、まったく新しい獣です。私はチームの単体テストを調査し、うまくいけばそれらのいくつかを Dingus から Mock にアップグレードすることにしました。

今日、変換クラスをチェックしているいくつかのテストに出くわしました。具体的には、16 進数の文字列を Mongo ObjectId (一意の識別子) に変換しました。私が期待していたのは、有効な 16 進数が指定された場合、同じ 16 進数の ObjectId が返されることを検証するテストでした。または、16 進数が正しくない場合、エラーが発生します。代わりに、テストで検証されたのは、ObjectId が作成されて返されたことだけでした。実際、ObjectId は完全にモックアウトされ、16 進数も同様です!

これで、文字列から ObjectId を作成するのに、サーバーなどに出向く必要がなくなりました。すべてローカルで実行されます。

この特定のテスト スイートについて、新しい同僚に尋ねました。彼らの考えでは、実際の変換は統合テストを使用して単体テストとして検証する必要があり、単体テストで行う必要があるのは、コードが期待どおりに上から下に流れ、ObjectId が作成されて返されることを確認することだけです。したがって、基本的に、テストでは、このクラスが期待どおりに環境と対話することのみを確認します。

私は長い間単体テストを書いてきました。私の経験では、モックをまったく使用せず、変換が期待どおりに行われたことを確認するだけでした。これは、別のモジュールの ObjectId クラスと対話することを意味します。おそらく、単体テストに関する私の考えは包括的すぎます。リモートサーバー、ファイルなどに接続するための統合テストを常に予約しています。

私の見方では、この例で ObjectId を操作することは、str または list を操作することと何ら変わりはありません。確かに、str と list をモック アウトすることはできますが、これらはコードの実行に不可欠であるため、それらをモック アウトすることはあまり意味がありません。依存関係とのやり取りを気にする必要があるのは、それがテストの結果を変える可能性があるときだけです。

コードの流れをチェックするだけの単体テストを書く価値はありますか? 単体テストは、コードの動作/正確性を念頭に置いて検証した結果であってはなりませんか?

4

1 に答える 1

1

したがって、コードを見ずに何が起こっているのかを正確に理解するのは難しいですが、あなたの説明のみに基づいています...

私はあなたに同意します。重要なのは動作であり、コードの流れではありません。

後で誰かが別のケースをサポートするためにコードの流れを変更する必要がある場合 (たとえば、同じ結果を達成する別の引数を持つ関数を使用する場合); 既存のテストを壊すことなくそうすることができます。

使用されているライブラリをアップグレードし、実際に関数を呼び出すと、実際に必要な結果とは異なる場合はどうなるでしょうか? テストは引き続き機能しますが (関数が呼び出されています)、単体テストが実際にテストしようとしているものは機能しません。

実際、モックとテストがどのように使用されるかは、まだかなり新しい分野です。単体テスト (および単体テストで使用されるモッキングなどのさまざまな戦略) が「良いこと」と見なされるかどうかについては、まだ結論が出ていません。しかし、間違いなく、実際に動作をテストするためではなく、テストを持っていると言うことができるようにテストを作成していることに気付きました。コードがより厳密にテストされたという誤った達成感を生み出しただけです。

于 2012-07-26T17:44:22.493 に答える