ユニットテスト、正しく書き込もうとするので、後でそれが耐え難いほど苦痛にならないように

ほとんどの人は単体テストの書き方を知りません。 そして、日常の開発で単体テストを使用する人でさえ、結果のテストが特定の理由であまり効果的でない場合があることをしばしば認識しています。 私は自分自身をこのカテゴリーの人々に帰することができます。 まず、このような「理由」はコードの特定の「慣性」です。これは、キーアルゴリズムをわずかに変更する必要がある場合、数行のコードを追加し、100個のユニットテストが「落下」し、長い時間を費やす必要があるという事実にありますそれらを再び機能させる時間です。 それでは、自動単体テストを作成するときに「良い推奨事項」を始めましょう。 いいえ、私は証拠のキャプテンではありません。もう一度、AAA(Arange-Act-Assert)と呼ばれる一般的なスタイルのテストを記述します。 しかし、モックがスタブとどのように異なり、すべてのテストオブジェクトが「moka」ではないことを説明しようとします。



グローバルな単体テストは、 状態ベースのテストと相互作用テストの 2つのグループに条件付きで分割できます。



状態テスト-オブジェクトの呼び出されたメソッドが正しく機能したことを確認するテスト。メソッドが呼び出された後、テストされたオブジェクトの状態をチェックします。



相互作用テストは、テストオブジェクトが他のオブジェクトとの操作を実行するテストです。 テストオブジェクトが他のオブジェクトと正しく相互作用することを確認する必要がある場合に使用されます。



データベース、ファイルシステムなどの実際の環境(外部依存関係)をテストで使用する場合、単体テストが統合テストに簡単に変換できることも注目に値します。



統合テストは、システムの2つ以上のモジュールの操作性を検証するテストですが、全体としては、つまり、単一のユニットとしての複数のオブジェクトです。

相互作用テストは、特定の特定のオブジェクトと、外部依存関係との相互作用をテストします。



外部依存関係は、コードが相互作用し、直接制御できないオブジェクトです。 単体テストの外部依存関係を排除するために、スタブ(スタブ)などのテストオブジェクトが使用されます。



Gerard Mesarocheによって作成された「 xUnitテストパターン:テストコードのリファクタリング 」と呼ばれるユニットテストに関する古典的な作業があることに注意する価値があります。



-通常、テスト対象のクラスにパラメーターとして渡されるダミーオブジェクト 。動作はなく、何も起こりません。メソッドは呼び出されません。 このようなダミーオブジェクトの例は、新しいオブジェクト()、null、「無視された文字列」などです。



-テストスタブ (スタブ)。外部の依存関係からデータを取得し、置き換えます。 同時に、スタブ内のテスト済みオブジェクトから取得できるすべてのデータを無視します。 最も一般的なタイプのテストオブジェクトの1つ。 テストオブジェクトは設定ファイルからの読み取りを使用していますか? ファイルシステムへの依存関係を取り除くためのテスト構成行を返すConfigFileStubを指定します。



-相互作用テストに使用されるテストスパイ (テストスパイ)。主な機能は、依存オブジェクトの呼び出しの正確性を後で検証するために、テストオブジェクトからのデータと呼び出しを記録することです。 依存オブジェクトをチェックせずに、テストされたオブジェクトのロジックを正確にチェックできます。



-モックオブジェクト (モックオブジェクト)はテストスパイに非常に似ていますが、後続の検証のために渡されたパラメーターで呼び出しのシーケンスを記録しませんが、誤って送信されたデータに対して例外をスローする可能性があります。 つまり テスト対象オブジェクトの動作の正確性をチェックするのは、モックオブジェクトです。



-偽オブジェクト (偽オブジェクト)。主に(非実行)テストを実行(高速)し、作業を高速化するために使用されます。 重い外部依存オブジェクトをその軽量実装で置き換える一種。 主な例は、メモリ内の特定のデータベースアプリケーション(偽のデータベース)または偽のWebサービス用のエミュレータです。



書籍「 The Art of Unit Testing 」のRoy Osheroveは、この分類を簡素化し、3つのタイプのテストオブジェクト(Fakes、Stubs、Mocks)のみを残しています。 さらに、Fakeはスタブまたはモックのいずれかであり、テストスパイはモックになります。 個人的には、テストスパイとモックオブジェクトを混在させるのはあまり好きではありませんが。



混乱した? おそらく。 この記事には、適切な単体テストの作成がかなり複雑なタスクであり、すべてがモックフレームワークを使用して作成されたモックではないことを示すタスクがありました。



読者に本題を理解してもらいたいと思います。高品質の単体テストを書くのは簡単な作業ではありません。 単体テストは、テスト対象のメインアプリケーションと同じルールに従います。 単体テストを作成するときは、モジュールをできる限り相互に分離してテストする必要があります。もちろん、これで使用されるさまざまなタイプのテストオブジェクトが役立ちます。 単体テストの記述スタイルは、アプリケーション自体を記述している場合と同じである必要があります-コピーアンドペーストを行わず、よく考えられたクラス、動作、ロジックを使用します。



All Articles