目次


Rational Quality Manager に Slack および Jenkins を統合する

カスタム・テスト・ランチャーを作成して、自動リグレッション・テストおよびレポート作成を強化する

Comments

最近の話ですが、クラウド・ベースのオファリングでのリグレッション・テストに対応するために、私のチームでは Rational Quality Manager のテスト自動化フレームワークの更新が必要になりました。私たちはこれを機会に、新しいテクノロジーをテスト自動化ワークフローに統合するという目標も立てました。具体的には、ソース管理用の Git、ビルド/デプロイ用の Jenkins、そしてチームのコミュニケーションとコラボレーションのための Slack です。この記事では、Rational Quality Manager に Slack と Jenkins、そして社内のテスト・フレームワークを統合するために、私がどのようにカスタム・テスト・ランチャーを作成したかを紹介します。さらに、Rational Quality Manager の自動化テスト、Rational Quality Manager 実行ツール、Node.js、Slack Webhooks、Elasticsearch についても簡単に説明します。そして最も重要な点として、これらのテクノロジーや他のテクノロジーを利用して、ニーズに合わせて Rational Quality Manager をカスタマイズし、ワークフローを強化するためのアドバイスを提供します。

必要なもの

このチュートリアルでは、お使いの開発環境またはテスト・マシンに、以下のテクノロジーがインストールされてセットアップされていることを前提とします。

Rational Quality Manager の基礎的な用語の知識、そして RQM コマンド・ライン・アダプターを使用したテスト自動化の知識があると、このチュートリアルを最大限に活用するのに役立ちます。このチュートリアルで取り上げるテスト・ランチャーは、Node.js を使って作成されたもので、プログラミング言語には JavaScript を使用しています。ここで説明する手法は、他のテクノロジーやプログラミング言語にも適用できます。

このチュートリアルの例に従うには、登録済みの Jazz.net アカウントが必要になることに注意してください。

Rational Quality Manager をなぜカスタマイズするのか

ソフトウェア開発者は多くの場合、複数のテクノロジーを使用してソフトエア開発ライフサイクルを管理します。私のチームでは、品質管理には Rational Quality Manager を使用し、プロジェクト管理には Rational Team Concert を使用しています。この仕組みは基盤として有効に機能していましたが、最近になって新しい要件が加わったため、既存の枠組みから外れた考え方をしなければならない状況になりました。

新しい要件の 1 つは、チームが大きくなったことから、新しいチーム・メンバーが Rational Quality Manager を学ばなくても簡単に SVT リグレッションを実行できるようにすることでした。また、チーム間の関わりを促進する必要もありました。それには、特に失敗したテストの結果をはじめ、リグレッション・テストの結果を大規模なチームで確認できるようにする必要がありました。さらに、リグレッション・バケットを高速に実行して、1 日を通して何度も実行できるようにすることも必要でした。私たちはすでに、ソース管理には Git、プロジェクトのビルドには Jenkins を使用していましたが、開発チームがチームのコミュニンケーションとコラボレーションのために Slack も使い始めたので、これらすべてのテクノロジーを 1 つに結び付ける手段が必要になりました。

私たちのリグレッション・バケットは、約 20 個の Node.js テスト・アプリケーションからなります。これらのテストは、Rational Quality Manager のコマンド・ライン・アダプター (CLA) を使用することで簡単に実行できるようになりました。CLA では、コマンド・ラインから実行できるテスト・ツールであれば、どのツールでも Rational Quality Manager に統合することができます。私たちは Rational Quality Manager テスト・スイートを利用してリグレッション・バケットを作成し、「並列スイート実行」のオプションを選んでリグレッションのスピードアップを図りました。Rational Quality Manager 5.0 以降、単一の CLA インスタンスを使用して複数の自動化テストを並列実行できるようになっています。CLA と並列実行という Rational Quality Manager の機能のおかげで、私たちは 2 つの CLA インスタンスを使用して、わずか 5 分でリグレッション・バケット全体を実行できるようになりました。

テスト・ランチャーの作成

リグレッション・バケットに Jenkins と Slack を統合するために、リグレッション・スイートを起動する単純な Node.js アプリケーションを作成しました。このランチャー・アプリケーションは、リグレッションの実行、テスト結果の取得、Slack へのテスト結果の投稿に対応する URL エンドポイントを公開しています。このテスト・ランチャー・アプリケーションのソースは、下のボタンをクリックして入手できます。

ランチャー・アプリケーションを利用するには、Elasticsearch が必要です。Elasticsearch は、ランチャー・アプリケーションと一緒にテスト・マシンの 1 台の上で実行します。Elasticsearch では、プログラムによって簡単にテスト結果にアクセスすることができます。Rational Quality Manager にもプログラムによってテスト結果にアクセスするための URL ユーティリティーが用意されていますが、このユーティリティーは扱いにくく、私たちは Elasticsearch を使用して結果にアクセスするほうが簡単だという結論に至ったのです。

物事を学ぶのに一番良い方法は実際に試してみることなので、ここからは、統合リグレッション・テスト・フレームワークをセットアップし、カスタム・テスト・ランチャーを使用してテストを実行する手順を案内します。

ステップ 1. Elasticsearch をセットアップする

  • このリンク先から Elasticsearch をダウンロードして圧縮解除します。
  • elasticsearch/config/elasticsearch.yml という名前の構成ファイルに、次のようにして変更を加えます。
    • # network.host:」で始まる行を見つけます。
    • 行の先頭にあるハッシュタグを削除して、この設定を有効にした後、IP アドレスを変更して、Elasticsearch を実行しているマシンのホスト名にします。これで、他のマシン上で実行されているアプリケーションが Elasticsearch にアクセスできるようになります。
  • lasticsearch/bin/elasticsearch (Unix の場合) または elasticsearch/bin/elasticsearch.bat (Windows の場合) を実行して Elasticsearch を起動します。
  • ブラウザーを使用して http://network.host:9200 を指定し、Elasticsearch にアクセスできることを確認します。この URL の「network.host」部分は、先に構成したホスト名に置き換えてください。Elasticsearch にアクセスすると、使用中の Elasticsearch インスタンスに関する情報を示す JSON オブジェクトが返されます。
  • テスト結果を保管するためのリポジトリーを作成します。Elasticsearch では、このリポジトリーをインデックスと呼んでいます。インデックスは JSON オブジェクトを保管するデータベースのようなものだと考えてください。以下のコマンドを実行して、test_results という名前のインデックスを作成します。
    $ curl -X PUT -d '' http://network.hosts:9200/test_results

    Windows 上で作業していて curl を利用できない場合は、Chrome ブラウザーの Postman 拡張を使用することで、簡単に HTTP リクエストを実行できます。
  • Elasticsearch に、保管するテスト結果ドキュメントに関する情報を提供する必要があります。それには、ランチャー・アプリケーションに含まれている TestResult マッピング・ファイルをダウンロードします。テスト結果の有効期限を設定する場合や、主な属性の検索動作を指定する場合は、このマッピングが必要です。curl を使用して、ダウンロードした TestResult.map を Elasticsearch に POST 送信します。
    $ curl -i -X POST http://network.hosts:9200/test_results/TestResult/_mapping --data @TestResult.map

    Postman を使用している場合は、TestResult.map ファイルの内容をそのまま POST リクエストの本文として使用できます。

Elasticsearch のセットアップはこれで完了です!

ステップ 2. Slack と Rational Quality Manager をセットアップする

このセクションの例では、Rational Quality Manager サーバーにアクセスできること、そしてアクティブな Slack アカウントを持っていることを前提とします。Rational Quality Manager 上で Slack を使用するには、着信 Webhook を作成する必要があります。Webhook とは、突き詰めれば投稿先の URL です。投稿されたデータはその宛先 Webhook に関連付けられている Slack チャネルに表示されます。Slack プロジェクトの管理者であれば、このリンク先のページ上で Webhook を作成できます。Slack プロジェクトの管理者でない場合は、使用する Slack チャネルの Webhook をプロジェクトの管理者に作成してもらう必要があります。Webhook が作成された後は、自動化テストの結果を Slack に投稿できるようになります。

最終的には皆さん独自の自動化テストを使用することになると思いますが、この演習のためにサンプル・テストの実装を用意しておきました。テスト結果を Elasticsearch に挿入するには、このサンプル・テストを使用できます。サンプル・テストについては後で詳しく説明するとして、とりあえず、rqm-test-launcher という Git プロジェクトを、Rational Quality Manager CLA を実行しているテスト・マシンにダウンロードしてください。ダウンロードが完了したら、rqm-test-launcher ディレクトリー内にある test-stub.js という名前のサンプル・テスト・ファイルに変更を加えます。このファイル内で ESEARCH_URL 変数を見つけて、Elasticsearch を実行しているマシンのホスト名と一致するようにサーバー名を変更します。次に、test-stub.js が格納されているディレクトリーから、npm install を実行します。これにより、サンプル・テスト用の Node.js ライブラリーがダウンロードされます。

Rational Quality Manager テスト・スクリプト、テスト・ケース、およびテスト・スイートを作成する

次は、Rational Quality Manager UI を使用して新しいテスト・スクリプトを作成します。

  • Rational Quality Manager UI を開きます。「Construction Menu (構成メニュー)」から、新しいテスト・スクリプトを作成するためのリンクを選択します。作成するスクリプトには「Script Example 1」という名前を付けます。
  • セットアップ・ページ上で、スクリプトのタイプとして「Command-Line (コマンド・ライン)」を選択します。「Command (コマンド)」フィールドに「node」と入力し、その下に、引数として test-stub.js のパスを指定します。以上の設定が完了すると、セットアップ・ページは以下のようになります。
    図 1. Rational Quality Manager テスト・スクリプトのセットアップ・ページ
  • 「Execution Variables (実行変数)」タブで、「Artifact Variables (成果物変数)」タイプの組み込み変数を使用可能にするためのチェック・ボックスをクリックします。「Script Example 2」という名前の 2 つ目のテスト・スクリプトを作成し、最初のスクリプトと同じオプションをすべて入力します。
  • 次に、Rational Quality Manager テスト・ケースを 2 つ作成します (テスト・スクリプトごとに 1 つ)。続いて、両方のテスト・ケースを含めるテスト・スイートを作成し、このテスト・スイートでテスト・ケースを並列実行するように指定します。以上の設定が完了すると、テスト・スイートのセットアップ・ページは以下のようになります。
    図 2. Rational Quality Manager テスト・スイートのセットアップ・ページ
  • 上記のページの左側ナビゲーション・バーにある「Test Suite Execution Records (テスト・スイート実行レコード)」(TSER) をクリックします。「TSER」表の上にある「Generate New Test Suite Execution Record (新しいテスト・スイート実行レコードを生成)」をクリックします。表示されるダイアログ上でデフォルト値を受け入れて、「Next (次へ)」 > 「Finish (完了)」の順にクリックします。TSER の生成ダイアログが閉じた後、テスト・スイートを保存します。必ず、テスト・スイート実行レコードの一覧表に示されている ID 値をメモしておいてください。後で、この ID が必要になります。

ステップ 3. テスト・ランチャーをセットアップして実行する

ようやく、ランチャー・アプリケーションの使用を開始できる状態になりましたが、テスト・ランチャーを実行する前に、その機能を知っておく必要があります。

  • テスト・ランチャーは、Rational Quality Manager 実行ツールから Rational Quality Manager テスト・スイートを起動するための URL エンドポイントを提供します。
  • 常にテスト・スイートの単一のインスタンスだけが実行されるよう、このテスト・ランチャーはタスク・キューを実装します。ごく簡単に起動できるテストがあれば、テストを開始するチーム・メンバーが増えます。キューを実装することで、テスト・アダプターを実行する Rational Quality Manager テスト・マシンに対する需要を制御できるようになります。
  • テストの完了後、Rational Quality Manager 実行ツールの終了コードを、意味のあるステータス・メッセージにマッピングします。
  • 個々のテストについて、Elasticsearch に保管された結果を照会し、説明的な内容を持つ結果を Slack に投稿します。
  • このテスト・ランチャーは、テスト・スイートの実行ステータスを照会するための URL エンドポイントも提供します。他のツールを使用してテスト・スイートを起動して、それが完了したことを把握する必要がある場合に、ツールとランチャーを統合するために、この URL エンドポイントは重要です。

ランチャーを実行する前に、このリンク先の launcher.js ファイルを開き、ファイルの先頭に定義されている定数を変更して、ご使用の環境を指すようにしてください。これらの定数には、Elasticsearch サーバー名、Slack Webhook、Rational Quality Manager の情報 (ステップ 2 でメモした TSER ID を含む) が含まれます。

ランチャーは、Node.js v0.12.7 以降および Java 8 以降がインストールされているマシンであれば、どのマシン上でも実行できます。起動手順は以下のとおりです。

  • このリンク先の Rational Quality Manager ダウンロード・ページ「All Downloads (すべてのダウンロード)」タブで、Rational Quality Manager 実行ツールを見つけます。ツールをダウンロードして、rqm-test-launcher プロジェクト・ディレクトリー内の rqm_execution_tool フォルダーに抽出します (このステップを実行するには、jazz.net に登録してログインする必要があります)。
  • rqm-test-launcher ディレクトリーから npm install を実行して、必要な依存関係をダウンロードします。
  • node launcher.js を実行して、テスト・ランチャーを起動します。

express Node.js ライブラリーにより、テスト・ランチャー内には HTTP リクエストに対応可能な Web サーバーが収容されています。適切な /run エンドポイントを使用して、Rational Quality Manager テスト・スイートをトリガーしてください。

図 3. Rational Quality Manager テスト・スイートを起動する

ここで説明している手順は curl を使用した場合のものですが、Web URL にアクセスできるフレームワークであれば、どのフレームワークでも使用できます。curl は Jenkins スクリプトの実行およびビルド・ステップで有効に機能します。私のチームでは、ビルド/デプロイの完了後、午前中にリグレッション・テストを起動する Jenkins プロジェクトをスケジューリングしています。

ランチャーのエンドポイントをテストする

ランチャー・アプリケーション には、/run (上記のステップで使用したエンドポイント) と /task (起動したテストのステータスを通知するエンドポイント) という有用な 2 つのエンドポイントがあります。上記の /run に対するレスポンスに、runId が含まれていることに注目してください。起動したテストの実行ステータスを取得するには、この ID を使用します。

図 4. 実行ステータス

初期状態の exitStatus 属性は、実行がまだ完了していないことを意味する「pending」に設定されます。一方、実行が完了すると、Rational Quality Manager Web UI では、説明的な内容のストリングがexitStatus に表示され、合格したテストの数と失敗したテストの数が summary 属性に示されます。そして、関連するテスト・スイートの結果へのリンクが resultUrl に表示されます。このように /run および /task エンドポイントによって、Rational Quality Manager テスト・スイートの実行を、他のフレームワークと簡単に統合できます。また、これらのエンドポイントがあることで、テスト・スイートのユーザーは Rational Quality Manager の持つ特異性の影響を免れることにもなります。

結果を照会して Slack に投稿する

テスト・ランチャーは、runId に関連付けられた個々のテスト・スクリプトの結果をすべて取得するために、Node.js superagent ライブラリーを使用して Elasticsearch サーバーに照会リクエストを発行します。結果を取得した後は、情報を提供するメッセージを Slack Webhook に投稿します。テスト・ランチャーから提供されるメッセージは、Slack チャネルでは以下のように表示されます。

図 5. 基本的な slack メッセージ

テスト結果は、Rational Quality Manager テスト・スクリプトを使用して Elasticsearch にアップロードする必要があります。test-stub.js 内を見ると、Elasticsearch に対する POST リクエストによって、テスト結果が Elasticsearch にアップロードされていることがわかります。このリクエストの本文は JSON ドキュメントであり、これが Elasticsearch に保管されます。このドキュメントには、テスト・ランチャーから Rational Quality Manager 実行変数を介してテスト・スクリプトに渡された runId が記録されます。また、テスト・ケース名とテスト・ケース判定も、このドキュメントに記録されます。

デモンストレーション用であるため、ランチャー、テスト・スクリプト・スタブ、および Elasticsearch に保管されているドキュメントは、いずれも単純にしてありますが、このサンプルを拡張して、Elasticsearch に保管するデータを増やし、より多くの情報を提供するメッセージを Slack に表示することもできます。実際、私のチームでは、プロジェクトのテスト出力全体を JSON 形式にして Elasticsearch に格納しています。Slack に表示されるリンクはテスト・ランチャーを指していて、テスト・ランチャーに戻ってテスト・スイートの結果を HTML 形式または JSON 形式で表示できるようになっています。Slack メッセージも拡張してあって、個々のテスト・スクリプトの判定を示すようになっています。さらに、面白さを織り込むために、全体的なテストの判定に基づいて異なる絵文字が表示されるようにしました。

図 6. 拡張された Slack メッセージ

以上の拡張は、私たちのチームの生産性を大いに高めています。それは、これらの拡張によって、各リグレッション・テストのステータスを簡単に確認できるようになっているからです。Rational Quality Manager では、クリックして多数のページとタブをナビゲートしてからでないと、詳細なテスト結果を確認することができませんが、Slack ではワンクリックで詳細なテスト出力を表示できます。

まとめ

Jenkins、Elasticsearch、および Slack を統合した Rational Quality Manager テスト・ランチャーを作成したことは、私たちのチームにとって効果がありました。HTTP エンドポイントのおかげで、このテスト・ランチャーは非常に使いやすくなっています。また、Slack インターフェースにより、テスト結果の可視性と使いやすさも改善されています。結果として、開発者と開発チームのメンバーは Rational Quality Manager の知識がなくても、リグレッションを毎日使用するようになっています。皆さんのプロジェクトにもこの手法が役立つことを願っています。


ダウンロード可能なリソース


関連トピック


コメント

コメントを登録するにはサインインあるいは登録してください。

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Rational, DevOps
ArticleID=1037632
ArticleTitle=Rational Quality Manager に Slack および Jenkins を統合する
publish-date=09232016