ABAPUnitを触ってみたよ・1

今日の仕事は、集中力を切らすことなく一日中トップスピードで駆け抜けることができました。なんで、ちょっと息抜きで最後の一時間はABAPUnitを触ってみましたよ*1。R/3って、家でちょっと試すってのができないのが難点。


今日やったことは、基本的にをそのまま。とりあえず、どんなもんかなだけを試そうかと。

ふむふむ。クラスの宣言時に「FOR TESTING」をオプションでつけてやって、「cl_aunit_assert」クラスの「assert_equals」スタティックメソッドなどで判定するのね。じゃ、さっそく実践っと。

REPORT  percentages.

PARAMETERS: price TYPE p.
PERFORM minus_ten_percent CHANGING price.
WRITE price.

FORM minus_ten_percent CHANGING fprice TYPE p.
  price = fprice * '0.9'.
ENDFORM.                    "minus_ten_percent


CLASS test DEFINITION FOR TESTING.
 "#AU Risk_Level Harmless
 "#AU Duration   Short
  PRIVATE SECTION.
        METHODS test_minus_ten_percent FOR TESTING.
ENDCLASS.
                   
CLASS test IMPLEMENTATION.
    METHOD test_minus_ten_percent.
        DATA: testprice type p value 200.
        PERFORM minus_ten_percent CHANGING testprice.
        cl_aunit_assert=>assert_equals( 
          act = testprice
          exp = 180
          msg = 'ninety percent not calculated correctly').
    ENDMETHOD.                    
ENDCLASS.

SE80から実行。予想とテスト結果が合っていません!コピペしただけなのになぜ!?

よくソースを見ると、サブルーチンの中のロジックがおかしい。

FORM minus_ten_percent CHANGING fprice TYPE p.
  price = fprice * '0.9'.
ENDFORM.                    "minus_ten_percent

じゃなくて、

FORM minus_ten_percent CHANGING fprice TYPE p.
  fprice = fprice * '0.9'.
ENDFORM.                    "minus_ten_percent

ですね。って、Blogをよく読むと著者がわざと誤りを入れてるみたい…orz

ま、これはそんなに時間かからなかったので、いっか。


で、次にソースを整形しようとしてコメントを除いたり段落分けとかしたりすると、これまた意味不明なエラーが!ロジックはいじってないのに何故??

原因がさっぱり分からなかったので、しょうがなく全部消してもう一度コピペしなおしてリトライ。どうやら、現在のバージョンでは

CLASS test DEFINITION FOR TESTING.
 "#AU Risk_Level Harmless
 "#AU Duration   Short

(略)

ENDCLASS.

の、「"」から始まるコメント行は除いちゃいけないみたい。ロジック的には意味がないけど、ABAPUnit実行環境がこれを参照しているらしい。Javaでいう、アノーテーションみたいなものか。ここに説明が載っていますね。

↑のリンク先をもうちょい詳しく読んだところ、"Risk_Level"は必ず宣言する必要があるみたい。以下の三つが設定できるとのこと。

Critical
システム設定やカスタマイズを変更するようなテスト
Dangerous
(テーブルのデータを変更するような)アプリケーションの永続的なデータを変更するようなテスト
Harmless
システム設定やテーブル変更などを伴わないテスト

"Duration"はテストの予想実行時間で必ずしも必要というわけではないけど、設定しておくとより適切にテストを行えるものらしい。例えば、無限ループとか実行時間が長すぎるテストとか?

Short
1秒以内に終わることが期待されているテスト(デフォルト)
Medium
1〜10秒に終わることが期待されているテスト
Long
10秒以上かかるテスト


今日は、ほんとにさわりだけやってみました。明日も一時間でも時間見つけてやってみたいですね。他のツールと連携させてカバレッジをレポート形式で取れるぐらいまでやれたら有用なものになるので、その辺を目標に試します*2

けど、Web上のABAP関連情報ってほんと少ないなぁ…

*1:個人的な趣味も強いので、業務時間にはカウントしてません

*2:期待も込めて、タイトルを「1」としてます