1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【ABAP】ABAP Unitを使ってみよう(3) ~CDSビューのテスト

Last updated at Posted at 2019-12-12

##はじめに
この記事は、「ABAP Unitを使ってみよう」シリーズの3回目です。
過去の記事はこちら↓
【ABAP】ABAP Unitを使ってみよう(1) ~簡単なところから
【ABAP】ABAP Unitを使ってみよう(2) ~Test Doubleで依存性を解決する

##【今回のテーマ】CDS Test Double Framework
CDSビューのテストをするときの課題は、テスト対象のビューが他のCDSビューやテーブルに依存している場合があるということです。これらのビューやテーブルをTest Doubleに置き換えるために、CDS Test Double Frameworkが用意されています。

##テストの種類
CDSのテストには以下の2種類があります。

###①Unit Test
テスト対象のビューの直下にあるオブジェクトをTest Doubleに置き換えて行うテスト。
image.png
ABAP CDS Test Double Frameworkより引用

###②Hierarchy Test
①階層関係にある複数のCDSビューをまとめてテストする方法。階層にあるすべてのCDSをテストするには、最下層にあるテーブルをTest Doubleに置き換える必要がある。
image.png
ABAP CDS Test Double Frameworkより引用

##テストシナリオ
受注にひもづく、最大の明細の最大の納入日程行を取得するCDSビューを作成しました。CDSビューは以下のような階層になっています。
image.png

てっぺんにあるのがテスト対象のCDSビューです。今回はビューで使用するDBを全てTest Doubleに置き換えます。

<テストの観点>
①1件の受注に複数明細、複数納入日程行がある場合に、1行だけに絞れているか
②取得した行が本当に最大明細、最大納入日程行になっているか

##テストの手順
###テスト用クラスを登録
Project Explore上でテスト対象のCDSビューを右クリックし、New ABAP Test Classを選択します。
image.png
複数階層のCDSビューをテストするので、Test TypeはHierarchy Testを選択します。Test Doubleに置き換えるテーブルとして、vbapとvbepにチェックを入れます。
image.png

###テストデータの登録
次の画面では、テスト用のメソッド名と、テストデータを入力します。赤枠で囲ったボタンを押すと、行を追加することができます。また、右端のボタンからはテストデータをテキストファイルでインポートすることができます。
※後に、受注番号を全て'0000000001'に変更
image.png

vbepにも同様にテストデータを登録しようとしましたが、なぜか2行目までしか入りませんでした。この後生成されるコードに手で追加することにします。
image.png

テストデータを登録する部分のソース(抜粋)
最終的に以下のようにテスト用のコードが自動で生成されます。テストクラスの中身は前回のABAP SQL Test Double Frameworkのテストクラスと非常によく似た構成になっています。
自動生成コードのデメリットは、データ1行追加するのに行を取ることですね…
image.png

納入日程行のテストデータを、以下の内容で追加します。(網掛けが最大明細、最大納入日程行の行)
image.png

###テストを書く
今回、ひとつのメソッドに2つのassertを書きました(1回のSELECT結果に対する確認なので)。
assert_equalsメソッドのパラメータquitにif_aunit_constants=>quit-noを指定すると、エラーがあってもテストが続行されます。

  METHOD get_schedule_line.
    data: ls_exp type zmob49_i_soschedule_max.

    prepare_testdata_set( ).
    SELECT * FROM zmob49_i_soschedule_max INTO TABLE @act_results
    WHERE vbeln = '0000000001'.

    "テスト1: 1行だけ取得されること
    describe TABLE act_results lines data(lv_lines).
    cl_abap_unit_assert=>assert_equals(
      EXPORTING
        act                  = lv_lines
        exp                  = 1
        msg                  = 'Number of records is not 1'
        quit                 = if_aunit_constants=>quit-no "エラーでも続行
    ).

    "テスト2: 最大の明細、納入日程行が取得されたこと
    read table act_results into data(ls_result) index 1.
    ls_exp = value #( vbeln = '0000000001' posnr = '000020' etenr = '0002').
    cl_abap_unit_assert=>assert_equals(
      EXPORTING
        act                  = ls_result
        exp                  = ls_exp
        msg                  = 'Max item, schedule line has not been retrieved'
        quit                 = if_aunit_constants=>quit-no
    ).

  ENDMETHOD.

##テスト結果
正常終了しました。CDSの場合、実物を作る前にテストを書くというわけにはいかなさそうです。CDSからテストクラスを作るのですから…
image.png

##CDS Test Double FrameworkとABAP CDS Test Double Frameworkの違いは?
CDS Test Double FrameworkとABAP CDS Test Double Framework、同じ使い方のように見えますが違いは何なのでしょうか。ヘルプ(ABAPCDS)を参考にできることを比べてみると以下のようになります。ざっくりとですが、CDS Test Double Frameworkのほうが色々できて、WRITE accessだけはABAP Test Double Frameworkでやる必要がある、ということでしょうか。
image.png

##感想
CDS Test Double Framework、ウィザード形式でテストデータも登録できるので、かなり便利です。多段階のCDSや複雑なパターンがあるときに役立ちそうです。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?