Jenkinsで自動化を実現

前回までで回帰テストのバッチファイルを作成し、テストができるところまで終了しました。今回はそれを自動化するためにJenkinsを使います。

Jenkinsはパイプラインという機能で、スクリプトを実行して処理を自動化できるようになっています。そのため、設定やら前処理やらが必要ですので、そのあたりも含めて確認していきます。

Jenkinsのインストール

Jenkinsは下記のURLからWindows版をダウンロードしてインストールします。

https://www.jenkins.io/

また、Jenkinsを動かすにはJavaが必要となりますので、なければインストールしましょう。

Jenkinsの設定

Jenkinsのプロジェクトを作る前に必要な設定を行います。JenkinsはWindowsにインストールするとWindowsサービスとして動作しますので、GUIを使用したアプリが正しく動作しません。そこで、新たなノードを作ってエージェントからWindowsアプリを動作させるようにします。エージェントはWindowsサービス外で動作しますので、GUIアプリを起動することができます。

ノードを作るには、[Jenkinsの管理]から[ノードの管理]を開きます。

Jenkinsノード設定1

ノードの管理画面が開きますので、[新規ノード作成]をクリックして新規ノードを作成します。

Jenkinsノード設定2

ノード名を登録します。ここでは「node_a」と入力してOKボタンを押します。

Jenkinsノード設定3

次にノードの詳細設定を行います。ここでは[リモートFSルート]を設定すればあとはデフォルトで構いません。リモートFSルートはこのエージェントが使うワークフォルダです。ここでは「c:\jenkins」として、このフォルダを作成しておきます。設定したら保存ボタンを押して終了です。

Jenkinsノード設定4

元の画面に戻ると新しいノードが追加されています。ノードに「×」印がついていますが、現在はエージェントが起動していないためです。

Jenkinsノード設定5

エージェントを起動する前にエージェントの使用するポートの設定を行います。先頭ページの[Jenkinsの管理]から[グローバルセキュリティの設定]をクリックします。

Jenkinsポート設定1

次の画面で、[Agents]の[TCP port for inbound agents]で[ランダム]を選択します。これでエージェントが起動可能になりました。

Jenkinsポート設定2

エージェントを起動するにはノードの管理画面から[node_a]をクリックします。

Jenkinsノード設定6

以下の画面が表示されますので、[Launch]ボタンを押すか、またはコマンド・ラインをコピーしてエージェントを実行します。

Jenkinsノード設定7

Launchボタンを押すと「jenkins-agent.jnlp」というファイルがダウンロードされ、そのファイルを実行することでエージェントが起動します。小さなウィンドウが開いて「Connected」と表示されれば正しく動作しています。
(※筆者の環境では最初この方法で接続できたのですが、JAVAのアップデートを行ったあたりから接続できなくなりました。下記の方法では成功します。)

上記の方法で接続に失敗する場合は、下側のコマンドラインでの接続を試してください。この場合、最初に画面上の「agent.jar」をクリックしてagent.jarをダウンロードしておく必要があります。コマンドプロンプトを開いてagent.jarのフォルダに移動し、上記の2つ目の赤枠の2行をコピーして、コマンドプロンプトに貼り付けます。この方法で接続に成功すると以下のように表示されます。

Jenkinsノード設定8

ノードの表示画面に戻ると「×」印が消えています。GUIを使用したWindowsアプリを動作させる場合は、この状態にしておく必要があります。

Jenkinsのプロジェクト作成

それではJenkinsのプロジェクトを作成します。プロジェクトの種類は柔軟な処理が可能な、パイプラインを選択します。まず、先頭ページで新規ジョブ作成を選択します。

Jenkinsプロジェクト設定1

ジョブ名の入力とジョブの種類を選択します。ジョブ名はTEST01とし、パイプラインをクリックしてOKボタンを押します。

Jenkinsプロジェクト設定2

パイプラインのスクリプトエディタでスクリプトを記述します。

Jenkinsプロジェクト設定3

内容は以下の通りですので、これをコピペすれOKです。

pipeline {
    agent { label 'node_a' }

    environment {
        def TEST_DIR = "c:\\jenkins\\TEST"
    }

    stages {
        stage('テストA') {
            steps {
                timeout(10) {
                    bat "${TEST_DIR}\\test_a.bat"
                }
            }
        }
    }
}

ここでのポイントを簡単に説明しておきます。

内容 説明
agent { label 'node_a' } 定義したスクリプトがnode_aで動作するエージェントであることを宣言します。この宣言を行うことでWindowsのGUIアプリが動作します。
timeout(10) ハードウェアトラブルなどで処理がデッドロック状態の時にタイムアウトします。10分間、処理が戻らなければスクリプトを強制終了させます。
bat "${TEST_DIR}\\test_a.bat" バッチファイルを実行します。Windowsの実行ファイルはbatコマンドで呼び出します。Windowsのパスの区切りは\\とするところに注意が必要です。

テストの実行

ここまでで準備は整いましたので、テストを実行します。ダッシュボードから[ビルド実行]をクリックするとパイプラインが実行されます。

Jenkinsテスト1

実行中の状態がStage Viewに表示されます。テストに失敗すると赤色のボックスで表示されます。

Jenkinsテスト2

最終的な結果はファイルの比較でresult_a.txtに出力されます。ファイルの比較が一致しない場合も失敗となりますが、それ以外で、ツールの起動に失敗している場合などの原因はログを確認します。赤色のボックス上にマウスを移動させるとLogsと表示されますので、それをクリックすればログが表示されます。

Jenkinsテスト3

この場合はバッチ処理が最後まで実行されましたので、ツールなどの問題ではなさそうです。比較結果のresult_a.txtを確認すると、以下のように正解ログがResult=3なのに対して、Result=5で不一致となっていました。

Comparing files C:\JENKINS\TEST\ok_test_a.log and C:\JENKINS\TEST\TEST_A.LOG
***** C:\JENKINS\TEST\ok_test_a.log
Function_A:Result=3
***** C:\JENKINS\TEST\TEST_A.LOG
Function_A:Result=5
*****

正しく終了した場合は以下のように緑色のボックスで表示されます。

Jenkinsテスト4

テストのスケジューリング

手動でのテストが正しく動作すれば、次はテストをスケジューリングします。テストのスケジューリングはビルドトリガで設定します。ビルドトリガの設定は[ダッシュボード]から[設定]の[ビルドトリガ]にあります。

トリガとしていくつかの選択肢がありますが、以下の設定では毎日23時00分に起動するようにしています。

Jenkinsテスト5

下側に「H 23 * * *」を使用するように警告が出ていますが、Hを指定すると起動する時間(0~59分)をJenkinsが決定しますので、同じ時間に別のジョブが起動しないように負荷を分散させることができます。ここではジョブが一つなので00分を指定しています。この設定で保存ボタンを押せば設定は完了です。あとはブラウザを閉じていても、Jenkinsがバックグラウンドで時間通りにジョブを実行してくれます。

テスト結果の確認

Jenkinsは別のパソコンのブラウザからテストの結果を確認することができます。デフォルトの設定では「localhost:8080」となっていますので、Jenknsをインストールしたパソコンのブラウザで「http://localhost:8080」を指定すれば画面が表示されます。別のパソコンからアクセスするには、localhostの代わりにインストールしたパソコンのIPアドレスを指定します。例えばJenkinsをインストールしたパソコンのIPアドレスが192.168.0.133とすると、以下のように指定します。

http://192.168.0.133:8080/
Jenkinsテスト6

回帰テスト自動化への道

以上のように、回帰テストの自動化に向けての骨組みを説明させていただきましたが、実際のテストを行うにはもっと多くのスクリプトや、場合によってはプログラム自体にテストルーチンを組込みむことも必要となってきます。全てを完璧に自動化しようとすると、メンテナンスで挫折します。小さなところから積み上げて、継続できるシステムを構築することが重要だと思います。

また、流行っぽいところもあり、Jenkinsを使って自動化しましたが、ぶっちゃけスケジューリングだけならWindows標準のタスクスケジューラを使うのもアリかと思います。

次回は動的解析の考え方を回帰テストに持ち込むとどんなことができるのか、動的テストツール「CodeRecorder」を使ってやってみます。

ダウンロード

この記事で使用したファイルをまとめてダウンロードできます。