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関連情報ってほんと少ないなぁ…