NEWS
VS CodeでIBM i エンジニア⼈⽣を楽しくしよう VS CodeでIBM i エンジニア⼈⽣を楽しくしよう
2026.10.01

【VS Code】第7回「VS CodeでRPGプログラムの単体テストを実行してみよう」

【VS Code】第7回「VS CodeでRPGプログラムの単体テストを実行してみよう」

はじめに

  • 第6回では、ローカルPCにあるRPGソースをIFSと連携させ、「VS Codeからコンパイル指示」「Gitでバージョン管理」する流れを体験しました。
  • 今回はさらに一歩進めて、VS CodeからIBM i 上のRPGプログラムに対して単体テストを実行してみましょう。
  • 使用するのは、IBM i Testingという拡張機能です。RPGの単体テストをVS Codeから実行し、テスト結果の確認やコードカバレッジの可視化が行えます。
  • 「IBM i でテスト?」と思われた方もいらっしゃるかもしれません。テストのコードを書く文化は、IBM i の現場ではまだ少ないかもしれませんが、モダン開発の中核にある考え方です。まずは体験してみましょう!

※本記事を印刷してご覧になりたい場合は、iWorld会員向けに公開しているPDF版「VS CodeでRPGプログラムの単体テストを実行してみよう」をご利用ください。

1.単体テストとプロシージャ。まず、ここから理解しよう

単体テストとは? テストコードとは?

単体テストとは、プログラムの「最小単位」を1つ1つ個別に動作確認することです。IBM i Testingを使えばそのテストをコードとして書いておけるため、毎回自動で実行でき、「修正したら別のところが壊れた」という先祖返りを、いち早く検知できます。

    IBM i の現場で、以下のような経験はないでしょうか?

  • 「修正したら別のところが壊れた(先祖返り)」
  • 「テストは本番に持っていって画面で手動確認」
  • 「前に直したはずのバグがまた出てきた…?!」

単体テストをコードとして書いておくと、実行するたびに合否を自動で判定できます。合否が自動判定されることで、「他の機能を壊していないか」を毎回手動で確認する手間がなくなります。

テストコードは、「このプロシージャは、この入力値のときに、この結果を返す」という「動く仕様書」にもなります。後からテストコードを見る人(未来の自分も含め)は、テストコードによってプロシージャの意図をすぐに理解できます。

そして、テストコードをコンパイルして実行できるようにしたものが、単体テストプログラム(ユニットテストプログラム) です。

プロシージャとは(RPG III 世代の方向け)

RPG IIIでは、プログラム全体が1つの大きな塊として書かれていました。サブルーチンで処理を分けることはできましたが、名前のある独立した「部品」として切り出す ことはできませんでした。

ILE RPGでは、プロシージャという仕組みで、処理を名前のついた独立した部品に分割できます。


上記画像をクリックすると、新規タブに拡大表示されます。

ILE RPG のプロシージャには、メイン・プロシージャーとサブ・プロシージャーの2種類があります。
なお、*PGM オブジェクトは、メイン・プロシージャーを含む *MODULE が最低1つ存在することで構成されます。

種類 説明
メイン・プロシージャー ・CALLコマンドで実行される単位。1つのプログラムにつき1つだけ存在できる。
・CALLコマンドで渡すパラメーターを設定できる。
サブ・プロシージャー ・CALLコマンドでは直接呼び出せない。
(メイン・プロシージャーから呼び出される)
・1つのプログラムに複数定義できる。
・コンパイル時にバインドされるため、CALLよりも高速に実行される。
・パラメーターを受け取り結果を返すことができる。

プロシージャを使うには、プロトタイプ定義とパラメーターインターフェースという2つの宣言が必要です。

宣言 フリーフォーム 固定形式 役割
プロトタイプ定義 dcl-pr~end-pr D仕様書(PR) プロシージャを呼び出す側が参照する「型の約束」。引数の型・数・戻り値の型を宣言する。
パラメーターインターフェース dcl-pi~end-pi D仕様書(PI) プロシージャ本体の先頭に書く実際の引数と戻り値の定義。プロトタイプと対応している必要がある。

プロトタイプ定義はコンパイラーが「このプロシージャにはこの型の引数を渡すべき」と型チェックを行うために使います。呼び出す側と定義側で型が一致しない場合はコンパイルエラーになるため、バグを早期に防ぐことができます。

簡単なプロシージャの例を見てみましょう。数値を受け取って100を加算して返すだけのプロシージャです。以下にフリーフォームと固定形式の両方で同じ内容のサンプルを掲載します。

  **free

  ctl-opt dftactgrp(\*no) actgrp(\*new) main(main);
                          
  // プロトタイプの定義
  dcl-pr addHundred zoned(9:0);
    \*n zoned(9:0);   // 引数(名前なし)
  end-pr;

  // メイン・プロシージャー
  dcl-proc main;
    dcl-pi \*n;
      input zoned(9:0);        // 引数
    end-pi;

    dcl-s result zoned(9:0);     // ローカル変数

    result = addHundred(input); //サブプロシージャ呼び出し
    dsply result;

  end-proc;

  // ここからサブ・プロシージャー
  dcl-proc addHundred;
    // パラメーターインターフェース
    dcl-pi \*n zoned(9:0);
      number zoned(9:0);
    end-pi;

    return number + 100;          // 100を加算して返す

  end-proc;
*.. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 ...+... 8
    H DFTACTGRP(\*NO) ACTGRP(\*NEW)

     * プロトタイプの定義
    D ADDHUNDRED      PR             9Z 0
    D                                9Z 0

     * 変数の定義
    D RESULT          S              9Z 0
    D INPUT           S              9Z 0

     * メイン処理
    C     *ENTRY        PLIST
    C                   PARM                    INPUT
    C*
    C                   EVAL      RESULT = ADDHUNDRED(INPUT)
    C                   DSPLY                   RESULT
    C                   SETON                                        LR
    C                   RETURN

     * ここからサブ・プロシージャー
    P ADDHUNDRED      B
     * パラメーターインターフェース
    D ADDHUNDRED      PI             9Z 0
    D  NUMBER                        9Z 0
    C*
    C                   RETURN    NUMBER + 100
    P                 E

このように**「引数を受け取って、結果を返す」という明確なインターフェース**を持つ部品(プロシージャ)があってはじめて、「この入力値のときにこの結果が返ってくるか」を自動テストで確認できます。

サブ・プロシージャーは別ソースに分離することもできる

今回のサンプルでは、メイン・プロシージャーとサブ・プロシージャーを同じソースメンバー内に書きましたが、サブ・プロシージャーだけを別のソースメンバーにまとめることもできます。その場合は、NOMAIN(メイン・プロシージャーなし)を指定してコンパイルし *MODULE を作成、それをバインドして *SRVPGM`(サービス・プログラム)を作成します。
*SRVPGM は CALL コマンドで直接実行できない呼び出し専用のオブジェクトで、他のプログラムから共通のプロシージャーを呼び出せるため、業務ロジックを部品化・再利用するうえで広く使われる構成です。RPGUnit でも *SRVPGM 内のプロシージャーをテスト対象にできます。

RPG III のソースはテストできる?

RPGUnit は ILE RPG のプロシージャを対象としたフレームワークです。RPG III / OPM RPG はテスト対象外となります。また、ILE RPG であっても、サブルーチン(EXSR)だけで書かれていてプロシージャがないソースはテストできません。
まずは、新規開発や改修のタイミングで、ILE RPG のプロシージャとして書く習慣をつけていくことがモダナイズへの第一歩です。

フリーフォームでなくてもOK

「**free(フリーフォーム)でないとダメ?」と思われるかもしれませんが、ILE RPG であれば固定形式でも、プロシージャが書かれていればテストできます。上述の固定フォームのプロシージャ例をご参照ください。

2.iRPGUnitとIBM i Testing、2つの関係を理解しよう

RPGUnit(iRPGUnit)とは

  • iRPGUnitは、IBM i 向けのオープンソースの単体テストフレームワークです。IBM i TestingのMarketplaceページでは「RPGUnit」と記載されていますが、正式にはiRPGUnitを内部的に利用しています。
  • JavaのJUnitやPythonのpytestと同じ思想で、ILE RPGやILE COBOLのプロシージャに対してテストコードを書いて自動で合否を判定できます。
  • iRPGUnitは、Lacton氏が2006年に開始したオリジナル「RPGUnit」を拡張・強化したプロジェクトで、IBM i テストの世界では事実上の標準ツールです。ただし、海外と比べると日本での利用実績は少なく、普及しているとは言い難いのが実情です。

上記画像をクリックすると、新規タブに拡大表示されます。

IBM BobとPremium Package for iが、iRPGUnitをサポート

実は、IBM Bob(iWorld掲載記事でも紹介されているAIアシスタント)とPremium Package for iは、iRPGUnitによるテスト開発を直接支援しています。IBM Bobはテストスタブの自動生成やテストケースの提案を行い、Premium Package for iはiRPGUnitのセットアップ・実行・結果確認をシームレスに統合しています。「日本では使われていない」からこそ、これらのツールをうまく活用して一歩先を行く開発スタイルを手に入れるチャンスです。

IBM i Testingとは

IBM i Testingは、iRPGUnitを「VS Codeから快適に使うためのUI拡張機能」です。iRPGUnitがエンジン(IBM i上で動くフレームワーク)、IBM i TestingがそのエンジンをVS Codeから操作するコックピット(UI)という関係です。

IBM i Testing の機能を説明する前に、本記事でよく出てくる用語を整理しておきましょう。

用語 意味
テストケース test で始まる個々のプロシージャ1つ。「〇〇のとき✕✕になるか」という1つの確認項目
テストスイート 複数のテストケースをまとめた1つのファイル(.test.rpgle など)
テストプログラム テストスイートをコンパイルして作成されたサービスプログラム
アサーション 「この値であるはず」という期待値との照合。assert() や nEqual() などのメソッドで記述

IBM i Testingの主な機能は、以下の5つです。

機能 説明
テストの実行 IBM i プロジェクトまたはライブラリー配下のILE RPG/COBOL テストプログラムを実行(RUCRTRPG / RUCRTCBL でコンパイル、RUCALLTST で実行)
スタブ生成 テストケースやテストスイートの雛形を自動生成
テスト構成の設定 コンパイル・実行パラメーターを testing.json で一元管理
テスト結果の表示 合否と失敗箇所をVS Code上で確認。合否の判定は nEqual() や assert() などのアサーションで記述
コードカバレッジの可視化 行・プロシージャ単位でカバレッジをエディター上に表示(CODECOV を利用)

3.事前準備

前提条件については、今後変更の可能性があるため、公式ドキュメント(IBM i Testing Overview)を参照するようにしてください。

必要な機能拡張

VS Codeに以下の拡張機能がインストールされていることを確認してください。(いずれも必須)

  • IBM i Testing(IBM.vscode-ibmi-testing)
  • Code for IBM i(バージョン 2.16.0 以上)
  • RPGLE(バージョン 0.31.0 以上)

ポイント

IBM i Development PackにはCode for IBM iとRPGLEが含まれているので、IBM i Development Packをインストール済みの場合は、IBM i Testingだけ、追加でインストールしてください。

IBM i 側の前提条件

  • IBM i 7.5以上を推奨します。
  • IBM i 7.3 / 7.4の場合は、下表のPTFがインストールされていれば利用可能です。
OS バージョン 必要なPTF
7.4 ILE RPG runtime: SI71537 / ILE RPG compiler: SI71536 / SQL Precompile UTF-8: SI70942
7.3 ILE RPG runtime: SI71535 / ILE RPG compiler: SI71534 / SQL Precompile UTF-8: SI70936

RPGUnitのセットアップ

    RPGUnitは、IBM i Testingの機能から直接インストールできます。
  1. VS CodeでIBM i に接続します。
  2. ステータスバーの接続名にカーソルを合わせ、Settingsを選択します。
  3. Componentsタブに移動し、Install componentを押下します。
  4. 一覧から RPGUnitを選択し、OKを押下します。
  5. Proceedを押下します。
  6. IBM i Testingの出力チャンネルで、インストールの進捗を確認できます。完了通知が表示されれば、セットアップは完了です。


    ※ 上記画像をクリックすると、新規タブに拡大表示されます。
バージョン対応表
IBM i Testingのバージョン 必要な RPGUnitバージョン
1.2.3 以下 5.1.0
1.3.2 以上 6.0.0 以上

CODECOVのセットアップ

コードカバレッジを利用するには、IBM i にCODECOVコマンドをPTFでインストールする必要があります(5770WDS)。

  • IBM i 7.3:PTF SI80728
  • IBM i 7.4:PTF SI80737 および SI81204
  • IBM i 7.5:PTF SI81216 および SI81217
  • IBM i 7.6:PTF 適用不要

注意

コードカバレッジは今回の記事では扱いません。まずは、テストの実行からはじめましょう。

4.サンプルソースを準備する

  • 今回は IBM が公開しているサンプルリポジトリ ibmi-company-system を使用します。
  • このリポジトリには、テストの練習に適したRPGソースと既存のテストスイートが含まれています。

ダウンロード方法

Gitを利用する場合

  • VS Codeでコマンドパレット(Ctrl+Shift+P)を開き git clone と入力します。
  • 以下のURLを貼り付けてクローンします。
    https://github.com/IBM/ibmi-company_system.git

Gitを利用しない場合

  • リポジトリのページにアクセスし、Code → Download ZIP でダウンロードします。
  • 任意のフォルダーに解凍し、VS Codeで開きます。

IBM i 環境へのビルド

  • テストを実際に実行するには、IBM i 側にサンプルプログラムやDBのオブジェクトが必要です。
  • 以下は、参考手順です。VS Codeのターミナルから SSH で IBM i に接続し、実行してください。
  # パスを通す(未設定の場合)
  export PATH=/QOpenSys/pkgs/bin:$PATH

  # TOBi と IBMi Repos をインストール(未インストールの場合)
  yum install ibmi-repos tobi

  # オブジェクト配置先ライブラリーを作成
  cl "CRTLIB LIB(CMPSYS) TEXT('Company System')"

  # サンプルリポジトリをクローン
  git clone https://github.com/IBM/ibmi-company\_system
  cd ibmi-company\_system

  # 環境変数を設定してビルド
  export CURLIB=CMPSYS
  makei build

ポイント

ビルドが完了すると、CMPSYSライブラリーにプログラムオブジェクトが作成されます。

VS Codeから、Code for IBM i を使って IBM i に接続

未接続の場合は、RPGUnit を導入した IBM i に接続します。

サンプルソースの全体像

  • ダウンロードしたサンプルには、テスト対象プログラムとテストスイートがセットで含まれています。
  • 今回は、以下画像の2ファイルを使ってテストの流れを体験します。

    ※ 上記画像をクリックすると、新規タブに拡大表示されます。
  • qrpglesrc/empdet.sqlrpgle(テスト対象プログラム):ctl-opt nomain で宣言し、getEmployeeDetail(社員詳細取得)と getDeptDetail(部署詳細取得)の2つのプロシージャを持ちます。
  • qtestsrc/empdet.test.sqlrpgle(テストスイート):setUpSuite でモックテーブルを準備し、正常系・異常系あわせて計4つのテストケースが定義されています。

5.命名規則を理解する

IBM i Testingでテストを検出するには、ファイル名やメンバー名が、一定の命名規則を満たす必要があります。

テストケースの命名規則

RPGUnit では、test で始まる名前のエクスポートプロシージャがテストケースとして認識されます。
逆に言うと、テストケースとして意図していないプロシージャを test で始まる名前でエクスポートしてはいけません。

  // テストケースとして認識される
  dcl-proc test\_getEmployeeDetail export;
  dcl-proc testIsPalindrome export;

  // テストケースとして意図しない場合はNG
  dcl-proc testHelper export;   // test で始まるので検出されてしまう

テストスイートの命名規則

テストスイートとは、1つ以上のテストケースを含むファイルまたはソースメンバーです。テストスイートはサービスプログラムにコンパイルされ、テストケースが実行されます。

RPGUnit自体はテストスイートの命名規則を強制しません。命名規則を適用するのは、IBM i Testing 拡張機能です。
IBM i Testingは、PC上のローカルファイルとIBM i 上のソースメンバー(QSYS)のどちらでも、テストを検出・実行できます。ただし、それぞれ、命名規則が異なります。

  // テストケースとして認識される
  dcl-proc test\_getEmployeeDetail export;
  dcl-proc testIsPalindrome export;

  // テストケースとして意図しない場合はNG
  dcl-proc testHelper export;   // test で始まるので検出されてしまう
項目 ローカルファイル IBM i ソースメンバー
命名規則 .test.rpgle / .test.sqlrpgle / .test.cblle で終わる 自由(T_、_T などのプレフィックス・サフィックスを推奨)
ファイル名の長さ 制限なし 10文字まで
配置場所 任意のディレクトリー QTESTSRC ソースファイルを推奨
オブジェクト名 自動的に T で始まる 手動で管理

ローカルファイルの例

  employee.test.rpgle
  department.test.sqlrpgle

ソースメンバーの例(QTESTSRCソースファイル内)

  EMPLOYEET.RPGLE
  T\_STRING.RPGLE

6.テストスタブを自動生成する

テストコードを0から書くのは、やや大変ですよね。IBM i Testing には、テストスタブ(テストコードの雛形)を自動生成する機能があります。

スタブ生成の手順

  1. サンプルソースの /qrpglesrc/empdet.sqlrpgle を、VS Codeで開きます。
  2. ファイル内の任意の場所にカーソルを置きます。
  3. コードアクションボタン(💡)を押下します。


    ・Generate test case for getEmployeeDetail:このプロシージャのテストケースのみ生成
    ・Generate test suite for empdet`:ファイル内の全プロシージャのテストスイートを一括生成
  4. 今回は、Generate test suite for empdet を選択します。
  5. リファクター・プレビューで確認し、すべてにチェックをいれ`適用`を押下します。

    ※ 上記画像をクリックすると、新規タブに拡大表示されます。
  6. /qtestsrc/empdet.test.sqlrpgle が作成されます。

生成されたスタブの構造

Generate test suite for empdet を選択すると、ファイル内の全エクスポートプロシージャ分のテストケースが一括生成されます。

今回は getEmployeeDetail と getDeptDetail の2プロシージャ分が生成されます。なお、コメント行は記事用に追記しているものであり、自動生成はされません。

**free

ctl-opt nomain ccsidcvt(\*excp) ccsid(\*char : \*jobrun);

/include qinclude,TESTCASE
/include 'qrpgleref/empdet.rpgleinc'

dcl-proc test\_getEmployeeDetail export;
  dcl-pi \*n extproc(\*dclcase) end-pi;

  // ① DECLARATIONS(宣言): テストに必要な変数とデータ構造
  dcl-s empno char(6);
  dcl-ds actual likeDs(employee\_detail\_t) inz;
  dcl-ds expected likeDs(employee\_detail\_t) inz;

  // ② INPUTS(入力): テスト対象プロシージャに渡す入力値 ← ここを修正
  empno = '';

  // ③ ACTUAL RESULTS(実際の結果): プロシージャを実行して結果を取得
  actual = getEmployeeDetail(empno);

  // ④ EXPECTED RESULTS(期待される結果)← ここを修正
  expected.found = \*off;
  expected.name = '';
  expected.netincome = 0.0;

  // ⑤ ASSERTIONS(アサーション): 実際の結果と期待値を比較
  nEqual(expected.found : actual.found : 'found');
  assert(expected.name = actual.name : 'name');
  assert(expected.netincome = actual.netincome : 'netincome');
end-proc;

dcl-proc test\_getDeptDetail export;
  dcl-pi \*n extproc(\*dclcase) end-pi;

  // ① DECLARATIONS(宣言): テストに必要な変数とデータ構造
  dcl-s deptno char(3);
  dcl-ds actual likeDs(department\_detail\_t) inz;
  dcl-ds expected likeDs(department\_detail\_t) inz;

  // ② INPUTS(入力): テスト対象プロシージャに渡す入力値 ← ここを修正
  deptno = '';

  // ③ ACTUAL RESULTS(実際の結果): プロシージャを実行して結果を取得
  actual = getDeptDetail(deptno);

  // ④ EXPECTED RESULTS(期待される結果)← ここを修正
  expected.found = \*off;
  expected.deptname = '';
  expected.location = '';
  expected.totalsalaries = 0.0;

  // ⑤ ASSERTIONS(アサーション): 実際の結果と期待値を比較
  nEqual(expected.found : actual.found : 'found');
  assert(expected.deptname = actual.deptname : 'deptname');
  assert(expected.location = actual.location : 'location');
  assert(expected.totalsalaries = actual.totalsalaries : 'totalsalaries');
end-proc;

各テストケースは以下の5つのセクションで構成されています。開発者が修正すべき箇所は ②INPUTS と ④EXPECTED RESULTS の2か所だけです。残りのセクションは通常そのままで使えます。

セクション 役割
① DECLARATIONS テストに必要な変数・データ構造の宣言
② INPUTS テスト対象プロシージャに渡す入力値(要修正)
③ ACTUAL RESULTS プロシージャを実行して実際の結果を取得
④ EXPECTED RESULTS 期待される結果の設定(要修正)
⑤ ASSERTIONS 実際の結果と期待値を比較・検証

期待値を設定する

今回は2つのテストケースそれぞれに、正常系の期待値を設定します。

test_getEmployeeDetail の期待値設定

  • まず、以下のSQLで CMPSYS/EMPLOYEE にテストデータを追加します。
      INSERT INTO CMPSYS.EMPLOYEE
        (EMPNO, FIRSTNME, MIDINIT, LASTNAME, WORKDEPT, PHONENO,
         HIREDATE, JOB, EDLEVEL, SEX, BIRTHDATE, SALARY, BONUS, COMM)
      VALUES
        ('12345', 'ZAKURO', 'J', 'KOINUMA', '55', '08',
         '2023-04-18', 'POWER', 0, 'F', '2023-04-17', 10, 20, 30)
    
  • 次に、スタブの ② と ④ を以下のように修正します。
      // ② INPUTS(入力)を修正
      empno = '12345';
    
      // ④ EXPECTED RESULTS(期待される結果)を修正
      expected.found = \*on;
      expected.name = 'ZAKURO J KOINUMA';
      expected.netincome = 60.00;
    

test_getDeptDetail の期待値設定

  • まず、以下の SQL で CMPSYS/DEPARTMENT にテストデータを追加します。EMPLOYEE.WORKDEPTが55なので、部署番号も55に合わせます。
      INSERT INTO CMPSYS.DEPARTMENT (DEPTNO, DEPTNAME, MGRNO, ADMRDEPT, LOCATION)
      VALUES ('55', 'SYSTEM DEVELOPMENT', '12345', '55', 'TOKYO')
    
  • スタブの ② と ④ を以下のように修正します。
      // ② INPUTS(入力)を修正
      deptno = '55';
    
      // ④ EXPECTED RESULTS(期待される結果)を修正
      expected.found = \*on;
      expected.deptname = 'SYSTEM DEVELOPMENT';
      expected.location = 'TOKYO';
      expected.totalsalaries = 60.00;
    
  • Ctrl+S で保存します。

7.テスト実行前の設定

testing.jsonとは

IBM i Testing は、テストのコンパイル・実行方法を testing.json という設定ファイルで管理します。
このファイルでは RUCRTRPG(RPGテストのコンパイル)、RUCRTCBL(COBOLテストのコンパイル)、CODECOV(カバレッジ計測)のパラメーターをJSON形式で指定できます。

testing.jsonの配置場所

ライブラリー内のすべてのテスト
種別 配置パス 適用範囲
ローカルファイル(プロジェクト全体) .vscode/testing.json プロジェクト内のすべてのテスト
ローカルファイル(ディレクトリー単位) <ディレクトリー>/testing.json そのディレクトリー内のテスト
ソースメンバー(ライブラリー全体) VSCODE.FILE/testing.json QTESTSRC ソースファイルを推奨
ソースメンバー(ソースファイル単位) <ソースファイル>/testing.json そのソースファイル内のテスト

ディレクトリーレベルの設定が優先され、設定されていない項目はプロジェクト全体の設定から継承されます。

testing.jsonの設定例

今回は /qtestsrc/testing.json を使用します。以下の内容を設定します。

{
    "rpgunit": {
        "rucrtrpg": {
            "tgtCcsid": "\*JOB",
            "dbgView": "\*SOURCE",
            "rpgPpOpt": "\*LVL2",
            "bndDir": \["CMPSYS/APP"],
            "cOption": \[
                "\*EVENTF"
            ]
        }
    },
    "codecov": {
        "module": \[
            "CMPSYS/EMPDET"
        ]
    }
}

ポイント:bndDirの指定

  • rucrtrpg.bndDirに、バインディングディレクトリーを配列で指定します。
  • コンパイル時のシンボル解決と CRTSRVPGM時のバインディングの両方に使用されます。
  • サービスプログラムをテストする場合は必須の設定です。

IBM i Project Explorer のセットアップ

IBM i Testingでローカルファイルをコンパイル・実行するには、IBM i Project ExplorerでプロジェクトとIFSを紐づける必要があります。この詳細な手順は、第6回「VS CodeでGitを使ってIBM i のソースを管理してみよう」を参照ください。本記事では、サンプルリポジトリに必要な設定をさらっと進めます。

IFSデプロイ先の設定

  1. エクスプローラーの PROJECT EXPLORER エリアを開きます。
  2. Source の →(Please configure deploy location)を押下します。
  3. IFSのデプロイ先パスを確認し、Enterを押下します(デフォルト: /home/ユーザー名/builds/ibmi-company_system)。

ライブラリーリストの設定

  • PROJECT EXPLORER エリアの Library List からライブラリーを追加します。
    ※ RPGUNIT、QDEVTOOLS を追加します。
  • Library List の Set Current Library でカレントライブラリーに CMPSYS を設定します。

注意:カレントライブラリーの設定を忘れずに

カレントライブラリーが正しく設定されていないと、テストプログラムが QGPL など意図しないライブラリーにコンパイルされます。必ず CMPSYS を設定してください。

設定後、iproj.json は、以下のようになります。

  {
    "description": "Company System project",
    "includePath": \["qrpgleref"],
    "curlib": "\&CURLIB",
    "objlib": "\&CURLIB",
    "preUsrlibl": \[
      "\&CURLIB",
      "RPGUNIT",
      "QDEVTOOLS"
    ],
    "buildCommand": "/QOpenSys/pkgs/bin/gmake BIN\_LIB=\&CURLIB"
  }

8.テストを実行する

テストの検出と実行

  1. VS Codeで、IBM i に接続します。
  2. IBM i Testing 拡張機能が、ワークスペース内の .test.rpgle ファイルを自動的に検出します。
  3. アクティビティバーのテストエクスプローラー(ビーカーアイコン)を押下すると、検出されたテストが一覧表示されます。
  4. プロシージャごとにテストもできますが、今回は empdet.test.sqlrpgle を選択し、テストスイートのテストを実行します。テスト実行ボタン(▶)を押下します。
  5. デプロイ方法の確認ダイアログが表示されたら Compare を選択します。
    ※ ローカルの最新テストソースが IFS へアップロードされた後、テストが実行されます。

テスト結果の確認

テスト実行後、テストエクスプローラーに結果が表示されます。


上記画像をクリックすると、新規タブに拡大表示されます。
表示項目 内容
WORKSPACE テストファイルとコンパイル結果
EXECUTION ビルド・デプロイの成否
RESULTS テストの合否と詳細(失敗時はインライン表示)

PASS が表示されれば成功です。正常系の動きが期待通りであることが確認できました。

FAIL が表示された場合は、失敗箇所がVS Codeのエディター上にインラインで表示されます。

確認ポイント

PASS が確認できたら、今度は、わざと期待値を間違えてみましょう。
例えば expected.netincome = 99.00; に変えて再実行すると、失敗した箇所がエディター上でどのように表示されるかを体験できます。

終わりに

  • 今回は IBM i Testing を使って、VS CodeからRPGプログラムの単体テストを実行する基本的な流れを体験しました。
  • スタブ自動生成 → 期待値を設定 → テスト実行 → 結果確認 というサイクルを繰り返すことで、品質を保ちながら開発を進めることができます。
  • 今回は、コードカバレッジについては触れませんでした。ぜひ、テスト実行時のコードカバレッジのエディター上の可視化もお試しください。(テスト実行のボタンの横にあります)
  • また、Git と組み合わせることで、featureブランチで開発 → テストをパスしたらマージという、より実践的な開発フローも実現できます。
  • IBM i の開発も、テストの自動化を当たり前にすることでもっと楽しく、もっと安心して進めていきましょう!

筆者

日本アイ・ビー・エム株式会社
Technical Sales 肥沼 沙織

  • 2015年 ユーザー系企業のIT子会社に入社
  • 2017年 IBM i 保守開発(主にRPGⅢ)+RPA開発に従事
  • 2023年 IBM入社 Powerテクニカルセールスとして従事

Qiitaに、シュッとシリーズを投稿中

いいねと思ったらシェア
twitter
facebook
hatena
linkedin
VS CodeでIBM i エンジニア⼈⽣を楽しくしよう 目次を見る

この連載は…

VS CodeでIBM i エンジニア⼈⽣を楽しくしよう
関連記事
【VS Code】第4回「VS CodeでGitを触ってみよう(2) 基礎学習編」
【VS Code】第4回「VS CodeでGitを触ってみよう(2) 基礎学習編」
【VS Code】第6回「VS CodeでGitを使ってIBM i のソースを管理してみよう」
【VS Code】第6回「VS CodeでGitを使ってIBM i のソースを管理してみよう」
【VS Code】第1回「VS Codeをインストールし、画⾯操作のイメージをつかもう」
【VS Code】第1回「VS Codeをインストールし、画⾯操作のイメージをつかもう」
あなたにオススメの連載
VS CodeでIBM i エンジニア⼈⽣を楽しくしよう
7記事
VS CodeでIBM i エンジニア⼈⽣を楽しくしよう
改めてAIについて学んでみよう
21記事
改めてAIについて学んでみよう
Qiita記事まとめ
4記事
Qiita記事まとめ