私は新しい仕事で新しいプロジェクトを始めています。Python で本格的に作業するのはこれが初めてです。モッキングは、静的に型付けされた言語でジャンプしなければならなかったフープと比較すると、まったく新しい獣です。私はチームの単体テストを調査し、うまくいけばそれらのいくつかを Dingus から Mock にアップグレードすることにしました。
今日、変換クラスをチェックしているいくつかのテストに出くわしました。具体的には、16 進数の文字列を Mongo ObjectId (一意の識別子) に変換しました。私が期待していたのは、有効な 16 進数が指定された場合、同じ 16 進数の ObjectId が返されることを検証するテストでした。または、16 進数が正しくない場合、エラーが発生します。代わりに、テストで検証されたのは、ObjectId が作成されて返されたことだけでした。実際、ObjectId は完全にモックアウトされ、16 進数も同様です!
これで、文字列から ObjectId を作成するのに、サーバーなどに出向く必要がなくなりました。すべてローカルで実行されます。
この特定のテスト スイートについて、新しい同僚に尋ねました。彼らの考えでは、実際の変換は統合テストを使用して単体テストとして検証する必要があり、単体テストで行う必要があるのは、コードが期待どおりに上から下に流れ、ObjectId が作成されて返されることを確認することだけです。したがって、基本的に、テストでは、このクラスが期待どおりに環境と対話することのみを確認します。
私は長い間単体テストを書いてきました。私の経験では、モックをまったく使用せず、変換が期待どおりに行われたことを確認するだけでした。これは、別のモジュールの ObjectId クラスと対話することを意味します。おそらく、単体テストに関する私の考えは包括的すぎます。リモートサーバー、ファイルなどに接続するための統合テストを常に予約しています。
私の見方では、この例で ObjectId を操作することは、str または list を操作することと何ら変わりはありません。確かに、str と list をモック アウトすることはできますが、これらはコードの実行に不可欠であるため、それらをモック アウトすることはあまり意味がありません。依存関係とのやり取りを気にする必要があるのは、それがテストの結果を変える可能性があるときだけです。
コードの流れをチェックするだけの単体テストを書く価値はありますか? 単体テストは、コードの動作/正確性を念頭に置いて検証した結果であってはなりませんか?