JenkinsからApexテスト結果を確認してみよう!

はじめに

皆さんこんにちは。

品質改善や納期短縮の取り組みされてますか?

プロジェクトに関わるメンバーがプロジェクトの品質を簡単に確認し、共有できる環境を構築できてますか?

たぶん、この記事に興味をもたれた方は、このような取組みについて興味があるのではないでしょうか。

今回は、テラスカイが実際に取り組んでいる品質向上策の一部、Apexテスト結果やカバレッジを表示させる方法を紹介します。

この方法は、Java開発で使用するJenkinsの「JUnit Plugin」と「Cobertura Plugin」を流用しています。Jenkinsには、Salesforceのテスト結果を表示するプラグインが無いためこの方法を選択しました。

また、この方法は、プラグインに読み込ませるXMLは自作する必要がありますので、少し、導入の難度が高いものになっています。

最後に、記載する内容について、画面キャプチャーや実際のプログラムで説明したいところですが、ここでは実装する際の要点のみ書きます。

システム概要

JenkinsをAWSのEC2上に構築します。

システム構成図

処理の流れは下記の通りです。

  1. JenkinsのジョブからMigrationツールとXML作成ツール(自作)のAntタスクを順に実行する
  2. Migrationツールのretrieveタスクで、ApexClassとTriggerのメタデータをダウンロードする
  3. XML作成ツールタスクを実行し、Apexテストの実行とテスト結果取得する
  4. XML作成ツールで、上記のテスト結果とメタデータの字句解析データから、JUnitとCoberturaプラグイン用の2つのXMLを作成する
  5. ジョブが、正常に終了するとプラグインが作成したXMLを読み込む
  6. ユーザがJenkinsにアクセスし、ジョブの詳細画面でApexテスト結果とカバレッジを確認する

XML作成ツール(自作)

JenkinsやMigrationツールの設定は、インターネットに情報がそろっているため説明は省き。自作のツールについて、処理内容とXMLの定義内容を書きます。

処理内容

処理の流れは下記の通りです。

  1. PartnerAPIでログインする
  2. ToolingAPIからApexテストを実行し、テスト結果を取得する
  3. テスト結果には、メソッド毎のテストの失敗と成功のデータが格納されています。クラス名、メソッド名、所要時間、テスト結果(成功|失敗)を取得する
  4. テストが失敗の場合、更に、スタックトレースを取得する
  5. メソッド名がブランクのものは、テストの異常終了です。クラス別の件数加算とエラー情報の取得する
  6. クラス毎、テスト件数、失敗件数、異常終了件数を算出する
  7. カバレッジ算出のため、ApexClassとTriggerのメタデータの字句解析を行い、クラス毎の実行可能行番号、実行状態(実行済みに設定)を取得する
  8. テスト結果にクラス毎のカバレッジ情報が格納されています。クラス名、実行可能行件数、未実行行件数、ソースの未実行行番号を取得する
    • テスト結果には行情報として未実行行番号しか取れません。なので、字句分析結果をすでにすべて実行済みとして未実行行部分を上書きする
  9. テスト結果からカバレッジの警告情報を取得する
  10. XMLを作成する

XML定義

JUnitプラグインとCoberturaプラグインのXMLの定義内容を書きます。

JUnit Plugin XML

<?xml version=\"1.0\" encoding=\"UTF-8\" ?>
<testsuites>
    <testsuite package="①" name="②" tests="③" errors="④" failures="⑤" time="⑥" timestamp="⑦"> // 0..n件
        <testcase classname="⑧" name="⑨" time="⑩"> // 0..n件
            <error type="⑪" message="⑫" >⑬</error> // 0..1件
        </testcase>
        <system-out>⑭</system-out> // 1件(テストが正常場合、要素の内容は空)
        <system-err>⑮</system-err> // 1件(テストが正常場合、要素の内容は空)
    </testsuite>
</testsuites>
No. 要素 属性 設定値
tesutsuite package パッケージ名
tesutsuite name クラス名
tesutsuite tests テスト件数
tesutsuite errors テスト失敗件数
tesutsuite failures テスト異常終了件数
tesutsuite time 所要時間
testsuite timestamp 実行時間
testcase classname クラス名
testcase name メソッド名
testcase time 所要時間
error type エラー型
error message エラーメッセージ
error 要素の内容 スタックトレース
system-out 要素の内容 テスト異常終了のスタックトレース
system-err 要素の内容 テスト異常終了のエラーメッセージ

Cobertura Plugin XML

<?xml version=\"1.0\" encoding=\"UTF-8\" ?>
<!DOCTYPE coverage SYSTEM \"http://cobertura.sourceforge.net/xml/coverage-04.dtd\">
<coverage>
	<sources>
		<source>①</source>
	</sources>
	<packages>
		<package name="②"> // 0..n件
			<classes>
				<class name="③" filename="④" > // 0..n件
					<methods>
					</methods>
					<lines>
						<line number="⑦" hits="⑧"> // 0..n件
							<conditions> // 0..1件
								<condition /> // 1..n件
							</conditions>
						</line>
					</lines>
				</class>
			</classes>
		</package>
	</packages>
</coverage>
No. 要素 属性 設定値
source 要素の内容 メタデータのルートフォルダへの相対パス
package name パッケージの名前(class,triggerなど)
class name クラス名
class filename 拡張子を含むファイル名 (パッケージ名/クラス名+拡張子)
line number 行数
line hits 実行回数

結果の確認

ジョブが正常に終了すると、Jenkinsのジョブの詳細ページに、Apexテスト結果とカバレッジの推移グラフが表示されています。

Apexテストについて

  • 異常終了の場合は件数が0、失敗の場合は赤、成功の場合は青で表示されます
  • 更に詳細なエラー内容を知りたい場合は、グラフの見たいリビジョンをクリックすると、パッケージ、クラス 、メソッドの順でドリルダウンして、詳細なメッセージを確認することができます

カバレッジについて

  • グラフの見たいリビジョンをクリックすると。 パッケージ、クラス 、ソースの順でドリルダウンして、カバレッジを確認することができます
  • カバレッジの一覧の中に条件という項目があります。この項目はブランチカバレッジ(分岐網羅)の数値です。字句解析の実装で、行情報に分岐の情報を足すことによって出力することができます

まとめ

XML作成ツールを実装することによって、JenkinsでApexテスト結果やカバレッジを確認できるようになりました。

実際に試した方は「おおおーーー!」という感じではないでしょうか?

まだまだ、プロジェクトを遂行する上で品質改善や納期短縮に関する取組みは数多くあります。そして、マルチベンダーや大規模開発ではこうした取組みが非常に重要になってきます。日々、こうした環境を整備することによって、プロジェクトに関わるメンバーに「楽になった!!」と言って貰える場面を増やせるよう頑張っていきます!