ソース コードのモックおよびスタブ

プログラムのテストを実施する場合、コードの一部だけを実行すれば済むことがあります。また、多くの場合は、必要なデータを返すだけのより単純で効率的なコードを代わりに使用できます。このようなシナリオに当てはまる場合は、ソース プログラムのモックおよびスタブを使用することを検討する必要があります。

モックを使用すると、テスト実行時に、実行する必要のないコードをスキップして、ソースの実行を制御できます。また、テスト実行中に他の部分を独自のカスタム コード (スタブ) に置き換えることもできます。たとえば、データベースで顧客レコードを検索するコードを実行する代わりに、コードのその部分を、単一のレコードに相当するデータを返すコードに置き換えることができます。このような手法は、テスト実行の効率を大幅に向上させることができるうえに、いずれの機能でも、ソース コード プログラムを実際に編集する必要がありません。

まず、ソース プログラムのモックを作成するには、MFUPP プリプロセッサで MOCK 指令を設定してコンパイルする必要があります。残りの構成は、テスト ケース自体で行います。

テスト ケースには、実行のフローを制御するためのコントローラー、および (オプションで) 代替の「スタブ」コードを実行するためのリダイレクターが必要です。コントローラーとリダイレクターはどちらもテスト ケースのエントリ ポイントであり、MFU-MD-PP-CONTROLLER メタデータ フィールドおよび MFU-MD-PP-REDIRECTOR メタデータ フィールドによって指定します。

コントローラーのエントリ ポイントは、テスト実行時にソース プログラムまたはエントリ ポイントを呼び出すたびに実行されます。

コントローラーのエントリ ポイント内では、特別な戻り値によって実行のフローを制御できます。たとえば、次の抜粋は、フローを制御できる 3 つの指定可能な値 (MFU-PP-ACTION というプレフィックス付き) をすべて示しています。

entry "MOCK-CONTROLLER" using by reference lnk-program-to-mock
                                by value lnk-program-to-mock-len.

    evaluate function upper-case(lnk-program-to-mock(1:lnk-program-to-mock-len))
        when "GETCUSTOMERID"
            goback returning MFU-PP-ACTION-REDIRECT
        when "LOGINPROMPT"
            goback returning MFU-PP-ACTION-GOBACK
    end-evaluate

    goback returning MFU-PP-ACTION-DO-NOTHING.

テストで LOGINPROMPT を現在呼び出している場合、実行はそれをスキップして続行します (MFU-PP-ACTION-GOBACK アクションによって証明されます)。テストで GETCUSTOMERID を現在呼び出している場合、コードの該当部分を実行するのではなく、実行を (リダイレクターに) リダイレクトします (MFU-PP-ACTION-REDIRECT アクションによって証明されます)。そして、これらの評価文のいずれも真でない場合、実行は通常どおりに続行されます (MFU-PP-ACTION-DO-NOTHING アクションによって証明されます)。

MFU-PP-ACTION-REDIRECT アクションが真の場合、制御はリダイレクターのエントリ ポイントに渡されます。

       entry "MOCK-REDIRECTOR" using by reference lnk-redirect-to
                                     by value lnk-redirect-to-len
                                     by reference lnk-who
                                     by value lnk-who-len.

           string "MOCK-" delimited by size
                   lnk-who(1:lnk-who-len) delimited by size
                   into lnk-redirect-to(1:lnk-redirect-to-len)
           end-string
           inspect lnk-redirect-to(1:lnk-redirect-to-len)
               replacing all "@" by "-"

           goback.

       entry "MOCK-getCustomerId" using lnk-lastname,
                                        lnk-customer-id
                                   .
           move 0 to lnk-customer-id
           evaluate lnk-lastname
               when "Smith"        move 42 to lnk-customer-id
               when "Jones"        move 21 to lnk-customer-id
           end-evaluate
           
           goback.

上記の抜粋はリダイレクターの例であり、スタブ コードはハードコーディングされた顧客詳細を返します。このコードを、大規模なデータベースの検索を実行して「ライブ」情報を返すソース プログラムのコードに代えて使用できます。

これらの手法を使用するテスト対象のソース コードの詳しい例については、「プログラムのモックとスタブへの MFUPP の使用」を参照してください。