カテゴリー「ABAP Unit」の15件の記事

ABAP Unit:ローカルクラスの自動生成

今まで気がつかなかったのですが、Class Builder の Utilities メニューに「テストクラス生成(Test Class Generation)」という項目が追加されていました。
少なくとも NetWeaver7.00 にはあります。
これを選択するとローカルクラス名などを設定する画面が表示されて、ローカルテストクラスを生成してくれます。
ここで生成したローカルクラスは、クラス定義の画面のGoto メニューにある「Local Test ClasseS」で表示できます。
忘れがちな Risk Level 用の擬似コメントも生成してくれるのもうれしいところです。

| | コメント (0) | トラックバック (0)

ABAP Unit:新規メソッドAsser_that (つづき)

新規メソッド用のサンプルを作成したのですが、ちょっと気になることがあります。

それは、IF_CONSTRAINTの実装クラスにテストクラスが存在したらどうなるのかということです。

で、ZCL_AUNIT_THAT_SAMPLE_001 にローカルテストクラスを追加したサンプルがこれです。

ここからダウンロードしてください。「Asser_that サンプル1」です。

テストプログラム ZRP_AUNIT_THAT_SAMPLE_001 のローカルテストクラスをそのままコピーしました。
ZCL_AUNIT_THAT_SAMPLE_001 で Unit Test すると、テストプログラムでやった時と全く同じ結果になりました。

さて、今度は ZRP_AUNIT_THAT_SAMPLE_001 の方で Unit Test すると、
こちらも前回と同じ結果になります。

つまり、IF_CONSTRAINTの実装クラスにテストクラスが存在しても、全く問題ないということが確認できたわけですね。

続きを読む "ABAP Unit:新規メソッドAsser_that (つづき)"

| | コメント (0) | トラックバック (0)

ABAP Unit:新規メソッドAsser_that

CL_AUNIT_ASSERT のメソッドを見ていたら、見慣れないメソッドがありました。
Assert_that というメソッドで、テストするデータオブジェクトと IF_CONSTRAINT というインタフェースへの参照を渡すとチェック結果を返してくれます。

IF_CONSTRAINT には、2つのメソッドがあります。
1つは IS_VALID で、実際のチェックを行うメソッドになります。
もう1つは GET_DESCRIPTION で、このメソッドの実行結果が、ABAP Unit の実行結果画面にチェック失敗時の説明として表示されます。

Assert_that を使用することで、様々なチェックを実装することができます。
サンプルとして正規表現によるマッチングでチェックする IF_CONSTRAINT の実装例と、そのクラスを使用したローカルテストクラスを添付します。

ここからダウンロードしてください。「Asser_that サンプル1」です。

なお、NetWeaver7.00には、このメソッドが存在しませんでした。
NetWeaver7.01からの追加のようです。

上記のような正規表現のほか、大小比較や Select-Options の形式でのOR条件など、いろいろ活用できると思います。
ぜひサンプルで ABAP Unit を体験してみてください。

| | コメント (0) | トラックバック (0)

ABAP Unit:講習会用資料

「abap_unit_2003.zip」をダウンロード   (約1MB)

本ブログ中のABAP Unitについての内容をExcelファイルにまとめました。
講習会参加者は印刷してお持ちください。

| | コメント (0) | トラックバック (0)

ABAP Unit:実用的なサンプル

トピック「列挙型とドメイン」で作成したサンプルクラスには、ローカルクラスとしてABAP Unit を使用したテストクラスを含めてあります。
実際のテストクラスの使用例として参考にしてください。
やはり Code Inspector に統合されていることはメリットが多いです。
コードの修正後に Code Inspector を実行するように規約を定めることで、ロジックまでチェックされることになります。これは画期的なことです。
ただ、修正内容によってはテストケースを増やす必要があるでしょうから、ここらへんは注意が必要です。
また、このサンプルではテスト対象のメソッドが Constructor と Check_Value の2つになってしまっていますし、プライベートメソッドについては Constructor のケースに含めてしまっています。各メソッドごとにケースを作成しないと、本当の意味での Unit Test にはなりませんし、網羅性も曖昧です。

ということで、ローカルクラス LCL_TESTER_02 を追加しました。サンプルコードをご覧ください。

また、このテストクラスを追加したことにより不具合を発見し、ZCL_DOMAIN のメソッド Get_Values_From_Table の一部を修正しました。こちらは、元のトピックの方を修正してあります。

続きを読む "ABAP Unit:実用的なサンプル"

| | コメント (0) | トラックバック (0)

ABAP Unit:講習会のお知らせ

※一部の方向けの情報です。

開催予定日

  1. 6/19(木):希望者なしのため中止します。wobbly
  2. 6/20(金):希望者なしのため中止します。wobbly
  3. 6/24(火):希望者なしのため中止します。wobbly
  4. 6/26(木):希望者なしのため中止します。wobbly
  5. 6/27(金):都合により中止します。sad
  6. 7/1(火):希望者なしのため中止します。wobbly
  7. 7/3(木):希望者なしのため中止します。wobbly
  8. 7/4(金):開催決定。参加予定者は4名です。happy01

いずれも開始時間19時です。

参加希望の方は、このトピックのコメントで登録していただいても結構です。登録内容は公開しませんので、安心して登録してください。

ご希望によりABAPオブジェクトの基礎からお話します。

| | コメント (0) | トラックバック (0)

ABAP Unit:リスクレベルについて

ABAP Unit:テストクラスについて」のグローバルクラスからの継承に記述しました疑似コメント「"#AU Risk_Level Harmless」について説明します。

まず、疑似コメント(pseudo-comment)とは、行末コメントの形でコンパイラやシステムに指示を行うためのもので、#の後に既定の文字列を書き、さらに指示内容を記述します。

この場合は、#AUでABAP Unitへの指示であることを示し、指示内容としてRISK_LEVELHarmlessであることを記述しています。

RISK_LEVELがHarmlessであるということは、テストメソッド中で重要なデータの更新などシステムに重大な影響を与えるような処理を行っていないということになります。

そのほかの値としては「Alarming」と「Critical」があります。
「Critical」は、システムに影響するような処理を含むことを表します。
「Alarming」は、DBデータの更新などのような危険な処理を含むことを表します。
デフォルトでは「Critical」になります。

トランザクション SAUNIT_CLIENT_SETUP を使用して、どのレベルのリスクまでを実行許可するかを設定できます。初期設定は「Harmless」ですので、そのままの設定では、リスクレベルがHarmless のテストクラスのみが実行可能です。
したがって、通常のテストクラスには必ず疑似コメント「"#AU Risk_Level Harmless」を記述します。

Harmlessより上のレベルのテストを行いたい場合は、専用のクライアントを作成して、そのクライアントの設定を変更することを推奨します。

なお、グローバルクラスについては、「ABAP Unit:テストクラスについて」のサンプルのプロパティ画面の左下の方に「Limit of Risk Level」欄があります。

テストクラスを継承した場合、親クラスで設定したリスクレベル以下には子クラスのリスクレベルを設定することはできません。
親クラスで「Critical」を設定した場合、子クラスは「Critical」以外には設定できません。
親クラスで「Alarming」を設定した場合、子クラスは「Harmless」には設定できません。
親クラスで「Harmless」を設定した場合、子クラスは任意のリスクレベルを設定できます。

【参考】
HELP: ABAP Unit Tests

| | コメント (0) | トラックバック (0)

ABAP Unit:汎用モジュールの単体テスト方法について

テスト単位は

汎用グループ単位
複数の汎用モジュールが含まれる場合は、個別にテストすることはできません

テストクラスを記述できる場所は

下記のとおりです。

  • TOPインクルード(汎用グループ内共通のデータ型・定数・変数)
  • Formインクルード(サブルーチン記述)
  • 汎用モジュールインクルード(FUNCTION…ENDFUNCTION)

クラス定義(DEFINITION)とクラス実装(IMPLEMENTATION)は、専用のインクルードに記述することを推奨します。
実効コードと混在すると、余計な混乱を招きます。

以下のサンプルを参照してください。

続きを読む "ABAP Unit:汎用モジュールの単体テスト方法について"

| | コメント (0) | トラックバック (0)

ABAP Unit:プログラムの単体テスト方法について

テスト単位は

プログラム全体です。
個々のテスト内容をサブルーチン単位にすることは可能です。

テストクラスの記述場所は

専用のインクルードに記述することを推奨します。
プログラム本体やサブルーチン用インクルードなどに記述すると、実効コードとテスト用コードが混在し余計な混乱を招きます。
なお、テストクラスは他のクラス定義よりも前に記述する必要があります。

以下のサンプルを参照してください。

続きを読む "ABAP Unit:プログラムの単体テスト方法について"

| | コメント (0) | トラックバック (0)

ABAP Unit:メソッドの単体テスト方法について

テスト単位は

クラス単位
複数のメソッドが含まれる場合は、個別にテストすることはできません

テストクラスを記述する場所は

ローカルクラスとして記述します。

以下のサンプルを参照してください。

続きを読む "ABAP Unit:メソッドの単体テスト方法について"

| | コメント (0) | トラックバック (0)

ABAP Unit:結果画面について

ABAP Unitのテスト結果

ABAP Unitのテスト結果は、CL_AUNIT_ASSERTのメソッドを呼び出した結果です。

テスト結果の例

  • ASSERTによるチェックが失敗した場合やFAILメソッドを実行した場合は、Status欄が赤になります。
  • 各メソッドのパラメータ MSG の値が表示されますので、MSGにエラー原因などを設定してメソッドを実行するを推奨します。
  • テストメソッド内のエラー発生行番号が表示されます。
  • 各メソッドのパラメータ LEVEL の値によって深刻度が「Fatal」「Critical」「Tolerable」に分類されて表示されます。
  • ABORTメソッドを実行した場合は、Status欄が黄色に、深刻度が「Tolerable」になります。

| | コメント (0) | トラックバック (0)

ABAP Unit:CL_AUNIT_ASSERTについて

CL_AUNIT_ASSERTとは

ABAP Unitのテスト結果を処理するための標準クラスです。
このクラスのメソッドを使用することでABAP Unitの実行結果画面が表示されます。

CL_AUNIT_ASSERTの利用方法

直接 CL_AUNIT_ASSERT のメソッドを呼び出すこともできますが、テストクラスを CL_AUNIT_ASSERT のサブクラスとするとメソッドの呼び出しが簡単になります。

CL_AUNIT_ASSERTの主なメソッド

ASSERT_EQUALS

→ メソッドの実行結果などが想定した値と等しいことをチェックします。

ASSERT_DIFFERS

→ メソッドの実行結果などが想定した値と等しくないことをチェックします。

ASSERT_BOUND

→ 参照変数が有効であることをチェックします。

ASSERT_NOT_BOUND

→ 参照変数が有効でないことをチェックします。

ASSERT_INITIAL

→ 変数が初期値であることをチェックします。

ASSERT_NOT_INITIAL

→ 変数が初期値でないことをチェックします。

ABORT

→ テストステータスを CAUTION で中断します。
     テストクラスを中断するのか、テストメソッドを中断するのかを制御可能です。
    想定外の状況によりテストが続行できない場合に使用します。

FAIL

→ テストステータスを ERROR で中断します。
     テストクラスを中断するのか、テストメソッドを中断するのかを制御可能です。
     深刻度も設定できます。
     ASSERTによるチェックでカバーできない複雑な判定を行う場合に使用します。

CL_AUNIT_ASSERT の定義を以下に示します。

続きを読む "ABAP Unit:CL_AUNIT_ASSERTについて"

| | コメント (0) | トラックバック (0)

ABAP Unit:Fixtureについて

Fixtureとはあらかじめ名称が決められた特殊なPrivateメソッドで、下記の4種類があります。

1. SETUP メソッド

各テストメソッドの開始直前に実行されるメソッドです。
テストケース開始の通知、テストメソッド開始前の準備などを記述します。
インスタンスメソッドとして定義しなければなりません。

2. TEARDOWN メソッド

各テストメソッドの終了直後に実行されるメソッドです。
テストケース終了の通知、テストメソッド終了後のデータ整理などを記述します。
インスタンスメソッドとして定義しなければなりません。

3. CLASS_SETUP メソッド

テスト全体の開始直前に実行されるメソッドです。
テスト開始の通知、テスト全体のデータ準備などを記述します。
クラスメソッドとして定義しなければなりません。

4. CLASS_TEARDOWN メソッド

テスト全体の終了直後に実行されるメソッドです。
テスト終了の通知、テスト全体のデータ整理などを記述します。
クラスメソッドとして定義しなければなりません。

| | コメント (0) | トラックバック (0)

ABAP Unit:テストクラスについて

テストクラスとは                                           

ABAP UNIT のテスト内容を記述するためのローカルクラスです。クラス定義にFOR TESTING句を指定することでテストクラスとすることができます。

NetWeaver7.0以降では、グローバルクラスとして定義することも可能ですが、このクラスは抽象クラスとなるため、そのまま使用することはできません。
では何に使うかというと、ローカルテストクラスの親クラスにして、共通メソッドなどを提供させます。

テストクラスには、テスト内容を記述するためのテストメソッドが含まれています。

また、Fixtureと呼ばれる固定名称のメソッド(SETUP, TEARDOWN, CLASS_SETUP, CLASS_TEARDOWN)を含めることができます。
グローバルテストクラスにはFixtureを含めることはできません。
 ※Fixtureメソッドについてはこちらを参照してください。

適宜、データ保存用の属性や補助的なメソッドを追加することも可能です。

グローバルクラスからの継承

クラス定義で、下記のように定義できます。

CLASS lcl_tester_01 DEFINITION FOR TESTING  "#AU Risk_Level Harmless
    INHERITING FROM zcl_abapunit_common .

ここで継承している ZCL_ABAPUNIT_COMMON は、共通メソッドを持ったグローバルクラスです。

テストクラスの雛型                                           

継承の例に挙げた ZCL_ABAPUNIT_COMMON は、テストクラスの雛型として作成したものです。
ZCL_ABAPUNIT_COMMON は、さらに標準クラス CL_AUNIT_ASSERT を継承しています。
標準クラス CL_AUNIT_ASSERT は、ABAP Unit へテスト結果を通知するためのクラスで、テストクラスに必須のメソッドを含んでいます。
 ※CL_AUNIT_ASSERT についてはこちらを参照してください。
CL_AUNIT_ASSERTを継承すると、テストメソッドの記述が簡単になります。

ZCL_ABAPUNIT_COMMON のサンプルを以下に示します。

続きを読む "ABAP Unit:テストクラスについて"

| | コメント (0) | トラックバック (0)

ABAP Unit について

ABAP Unitについてまとめてみました。

ABAP Unit:テストクラスについて
ABAP Unit:Fixtureについて
ABAP Unit:CL_AUNIT_ASSERTについて
ABAP Unit:結果画面について
ABAP Unit:メソッドの単体テスト方法について
ABAP Unit:プログラムの単体テスト方法について
ABAP Unit:汎用モジュールの単体テスト方法について
ABAP Unit:リスクレベルについて
ABAP Unit:実用的なサンプル

続きを読む "ABAP Unit について"

| | コメント (0) | トラックバック (0)