テクマトリックス株式会社の会田です。
2022年11月2日に弊社主催でJenkins Day Japan 2022を開催しました。参加されたみなさま、ありがとうございました。Launchable, Inc.の川口耕介さんや、株式会社MIXI モンスト事業本部の松原信忠さんをお招きし、貴重なお話を共有いただきました。ご参加いただけなかった方も、資料や動画が今後配信されますので、お待ちください。
このイベントでは参加者の方に興味のある技術領域や課題についてアンケートを取らせていただいたのですが、テスト管理に興味のある方が多かったです。そのため、今回はテスト管理をテーマにした記事を書いてみます。テスト管理やテスト自動化の参考となれば幸いです。
目次
最終目標
今回の最終目標は、さまざまなテストの結果を時系列に並べてレポートを作成することとします。
以下は単体テスト、UIテスト、負荷テストの結果を5回分並べたレポートの例です。ビルド(自動テスト)ごとにどのテストが失敗し、次のビルドで修正されたか・継続して失敗しているかが一目でわかります。
JUnit, Selenium, Jmeterのテスト(縦)の時系列(横)ごとの結果一覧が確認できます
今回使うツール
以下のツールを使います。
- テスト管理:TestRail
- 単体テスト:JUnit (Parasoft Jtest)
- UIテスト:Selenium IDE (pytest)
- 負荷テスト:Jmeter
各テストツールの結果をTestRailに登録します。テストの実行はすべてコマンドラインで行い、JUnit形式のXMLファイルを出力、TestRailCLIを用いてTestRailへ結果を登録します。
今回登録したJUnit形式のXMLファイルはこちらからダウンロードできます。
TestRail CLIはJUnit形式のXMLファイルをTestRailのテストケースおよびテスト結果として登録してくれるコマンドラインツールです。このツールのおかげでJUnit形式のXMLファイルであれば、どんなテストツールの結果であっても簡単にTestRailに登録できます。とても便利です。
※以前は、Parasoft C++testのテスト結果レポートを自力で変換にてTestRailに登録していましたが、自力で変換する必要がなくなり、楽になりました。
テストツールの結果を登録
TestRailはセットアップ済として記載します。(ココから弊社がホスティングしているTestRailを無償で1か月間ご利用になれます!)
TestRail CLIのインストール
TestRail CLIをインストールします。Python3.10以降の環境が必要です。
$ pip install trcli
trcliのオプションは --help
で確認できます。実行時にTestRailのURLやプロジェクト、ユーザーアカウントの指定ができます。今回はyamlファイルにTestRailのURLやアカウント情報などを記載し、--config
オプションで指定する方法を使いました。(マニュアル)
$ trcli --help
Usage: trcli [OPTIONS] COMMAND [ARGS]...
TestRail CLI
Options:
-c, --config Optional path definition for testrail-credentials file or
CF file.
-h, --host Hostname of instance.
--project Name of project the Test Run should be created under.
--project-id Project id. Will be only used in case project name will
be duplicated in TestRail [x>=1]
-u, --username Username.
-p, --password Password.
-k, --key API key.
-v, --verbose Output all API calls and their results.
--verify Verify the data was added correctly.
--insecure Allow insecure requests.
-b, --batch-size Configurable batch size. [default: (50); x>=2]
-t, --timeout Batch timeout duration. [default: (30); x>=0]
-y, --yes answer 'yes' to all prompts around auto-creation
-n, --no answer 'no' to all prompts around auto-creation
-s, --silent Silence stdout
--help Show this message and exit.
Commands:
parse_junit Parse report files and upload results to TestRail
テスト結果の登録場所の準備(TestRail)
TestRailにWebブラウザでアクセスし、テストラン(テスト結果を登録する場所)を作成しておきます。作成したテストランのID(今回は32)を以降の手順で使用します。
TestRail CLIを実行する際に新規作成することも可能です。今回は複数のテストツールの結果を1つのテストランに登録したいため、テストランをあらかじめ作成しておき、TestRail CLIでテスト結果を登録する際にテストランIDを指定します。
単体テスト(Parasoft Jtest → JUnit)
JUnitの単体テストを作成し、結果を取得します。
- Parasoft Jtestの単体テストアシスタントでJUnit形式のテストを作成
ちなみに、JtestはJUnitの単体テストレポートをきれいに出してくれます。 - 単体テストの実行(Mavenプロジェクトの場合)
$ mvn clean test-compile jtest:agent test jtest:jtest -Djtest.config="builtin://Unit Tests" - TestRail CLIでTestRailに結果を登録
$ trcli -y --config alternate_config.yaml parse_junit --run-id 32 -f examples.junit.NaiveStringBuilderParameterizedTest.xml
JUnitのXMLファイルはテストクラスごとに出力されるため、複数のXMLファイルが出力された場合はファイルごとにtrcliコマンドを実行します。XMLファイルの中身は以下の通りです。(一部省略)
<?xml version="1.0" encoding="UTF-8" ?>
<testsuite errors="1" failures="0" hostname="Pana-7600U-06" name="examples.junit.NaiveStringBuilderParameterizedTest" skipped="1" tests="5" time="0.582" timestamp="2022-11-11T10:03:21">
:
<testcase classname="examples.junit.NaiveStringBuilderParameterizedTest" name="testAppend( , 01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890) [0]" time="0.047" />
<testcase classname="examples.junit.NaiveStringBuilderParameterizedTest" name="testAppend(, hello world) [1]">
<skipped/>
</testcase>
<testcase classname="examples.junit.NaiveStringBuilderParameterizedTest" name="testAppend(hello world, ) [2]" time="0.002" />
<testcase classname="examples.junit.NaiveStringBuilderParameterizedTest" name="testAppend(01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890, null) [3]" time="0.015">
<error type="java.lang.IllegalArgumentException">java.lang.IllegalArgumentException
:
at junitparams.JUnitParamsRunner.runChild(JUnitParamsRunner.java:393)
</error>
</testcase>
<testcase classname="examples.junit.NaiveStringBuilderParameterizedTest" name="testAppend(null, ) [4]" time="0.001" />
<system-out><![CDATA[]]></system-out>
<system-err><![CDATA[]]></system-err>
</testsuite>
TestRailには以下のように登録されます。Skipされたテストは Retest として登録されていました。
UIテスト(Selenium IDE→pytest)
ChromeのSelenium IDEを利用しテストケースを作成、pytestで実行可能なとしてエクスポートし実行しました。なお、Seleniumのプロジェクトファイル(.side)をコマンドラインで実行する selenium-side-runnerでもJUnit形式での結果出力が出来るようです。※ selenium-side-runner 4.0.0-alpha.32で試しましたが、私の環境では--output-format=junit
オプションが動作しませんでした。
- pytest, seleniumのパッケージをインストール
$ pip install pytest selenium - Selenium IDE(Chrome)でテストを作成
- pytestとしてエクスポート
- テスト実行
$ pytest --junitxml junit-report.xml test_defaultSuite.py - TestRail CLIでTestRailに結果を登録
$ trcli -y --config alternate_config.yaml parse_junit --run-id 32 -f pytest-report.xml
TestRailには以下のように登録されます。
負荷テスト(Jmeter)
最後にJmeterの負荷テストの結果を登録します。JmeterでJUnit形式のXMLファイルを出力するために、JUnit Reporterプラグインを利用しました。
- JMeterでテストを作成
- JUnit Reporterプラグインをインストールし、設定
KPIsで指定した内容が1つ1つのテストとしてXMLファイルに出力されます。 - Jmeterでテストを実行
$ jmeter -n -t jmeter_test.jmx -l result.jtl
- TestRail CLIでTestRailに結果を登録
$ trcli -y --config alternate_config.yaml parse_junit --run-id 32 -f Jmeter_JUnit_report.xml
TestRailには以下のように登録されます。
1画面で単体/UI/負荷テストの結果を確認できるのは良い
3つのテスト結果を登録した後のテストランの表示は以下のようになりました。見やすいように、テストケースのセクションの名前変更を行っています。
今回は見栄えのためにわざと失敗するテストを実行していますが、実際にこんなテスト結果だったら根本的なミスを疑います…。とはいえ、複数の種類のテストがNGであることを1つの画面で確認できるのは、やはり便利です。
以下は1回の単体テスト、UIテスト、負荷テストの結果を1つのテストランにまとめた画面です。
自動化~レポート生成まで
記載したテスト実行~TestRailへのテスト結果の登録を自動化し、自動実行するようにします。具体的な設定は割愛しますが、Jenkins等のCIツールを用いて自動化することをおすすめします。
自動化したテストにより、毎時間・毎日・毎週の任意の頻度でテスト結果が登録されていきますので、後はTestRailでレポート出力を行うだけです。TestRailのレポート出力は定期実行が可能なので、手動での作成は要りません。
今回出力したレポートはこちらから確認できます。
日々のテスト結果をまとめて確認できるので、品質低下の兆候を掴んだり、フレイキーテスト(原因不明で失敗するテスト)を発見するのに役立ちます。
開発では複数のテストツールを使い、そのツール独自の結果レポートを確認することが一般的です。現在開発しているソフトウェアの品質は良いのか、悪い兆候は無いかを確認するためには、テスト結果をまとめて確認できるテスト管理ツールが便利だと感じました。
お使いのテストツールがJUnit形式のXMLファイル出力に対応しているのであれば、TestRail CLIで簡単に結果の登録ができます。(TestRailの体験版をぜひお試しください。)