test
JUnit
testing
TestLink

TestLinkで手動テストと自動テストを統合する : JUnit編

More than 1 year has passed since last update.

徐々にテスト自動化していく場合のニーズ

コンポーネントテストや統合テストなど開発者主体の自動テストの場合最初から自動テストのみを管理して、特に手動テストと管理をまとめたいというニーズはありません。

しかし、システムテストレベルの場合、全自動化がされていることは少なく、また現実的ではないので、現状手動のテストを徐々に自動化していくというのが良くあるパターンではないでしょうか?

そのような徐々に自動テスト化していく中では手動テストと自動テストを同時にリグレッションテストやスモークテストとして行ったりするので、両方をまとめて管理したい、まとめて状況を見たいというお話をマネージャーさんからリクエストされることが度々あります。

私にそんな話が来るぐらいと言うことは世の中でもそういうニーズがあるに違いない、そもそもHPのQuality CenterやIBMのRational Quality Managerのような商用のテスト管理ツールにはそういう機能ありますね。

でも、そのためだけに商用を買うのも・・・っていうことで、俺たちのOSSテスト管理ツールのTestLinkにもそういう機能がありました。

というのでTestLinkの自動テスト統合機能を調査してみましたのでまとめてみます。

JUnitとの統合

いくつがありますが、

http://unitils.org/tutorial-testlink.html

が一番楽ちんでした。

TestLink側の準備

事前準備として、TestLinkのdocker imageをdockerhubにアップロードしてみた等でTestLinkの環境を作っておきます。Docker Composeで一撃で環境を作れるので素晴らしいです。

まず、左上のユーザーアイコンを押して、"Account Settings"に移動し、"API interface"の"Generate a new key"で"Personal API access key"を作成します。

続いて、構築したTestLinkの環境に"Test Project"を作成してから、下記のスクリーンショットのようにテストスィートとテストケースを登録します。この記事はTestLinkの使い方を説明する記事ではないのでTestLink自体の使い方はTestLinkユーザーズマニュアルを参考にして下さい。この統合方法では"Execution type"が"Automated"でなくてもなぜか動いてしまいますが、次のJenkinsとの統合では動作しないので念のために"Automated"にしておきましょう。

テストケース登録

"Test Plan"(必須)と"Builds /Releases"(オプション)も作成しておきます。"Builds / Releases"はないと自動テストを実行したときに勝手に作られますが、手動テストとまとめて結果を見たいときには実施するテストの単位で予め作っておいた方が良いです。

続いて、"Assign Test Case Execution"で作成したテストケースを実行対象にします。ここまでで準備完了です。

JUnit側の設定

TestLinkIntegrationにサンプルプロジェクトをアップしました。

ほぼ、チュートリアルに沿えばできるのですが、嵌まりポイントがあります。

unitils-local.properties
unitils.modules=inject,testlink

unitils.module.testlink.className=org.unitils.testlink.TestLinkModule
unitils.module.testlink.runAfter=
unitils.module.testlink.enabled=true

org.unitils.testlink.url=http://192.168.99.100/testlink/
org.unitils.testlink.project=TestLinkJUnitIntegration
org.unitils.testlink.testPlan=AutomatedTestingPlan
org.unitils.testlink.buildName=First
org.unitils.testlink.username=admin
org.unitils.testlink.devkey=85864654021bffaf19ca1f22470683d0
org.unitils.testlink.createTestIfNeeded=true
org.unitils.testlink.assingTestIfNeeded=true

このファイルの記述のどこかが間違っていると、ライブラリの途中で例外が握りつぶされているため、TestLinkの接続で失敗して、詳細なスタックトレースがでません。まず、"project"や"testPlan"、"devkey"のスペルミスを疑って下さい。また、"devkey"はTestLinkで設定した"Personal API access key"のことで、ユーザー毎に発行されますので、"username"には"Personal API access key"を作成したユーザーを設定して下さい。ここでは簡単のためにadminにしていますが、実際の運用ではセキュリティーのため自動化専用のユーザーを作ってそのユーザーでキーの作成と指定をすることをお勧めします。

なお、設定ファイルだけだとJenkinsなどのCI環境で使いにくそうですが、この設定はJavaのシステムプロパティーで上書きできるようにUnitlsライブラリが作られていますので、MavenやGradleで"-Dorg.unitils.testlink.buildName=Second"のように指定すればビルド名をビルドツールから指定できます。

ここまでできれば、後はJUnitでRunnerとアノテーションを指定するだけです。

TestLinkIntegrationTest.java
import org.junit.Test;
import org.junit.runner.RunWith;
import org.unitils.UnitilsJUnit4TestClassRunner;
import org.unitils.testlink.annotation.TestLink;

import static org.hamcrest.core.Is.is;
import static org.junit.Assert.assertThat;

/**
 * Created by kenichiro_ota on 2016/01/28.
 */
@RunWith(UnitilsJUnit4TestClassRunner.class)
public class TestLinkIntegrationTest {
    @TestLink(value="junit-1")
    @Test
    public void createTodoList() throws Exception {
        assertThat(true, is(true));
    }

    @TestLink(value="junit-2")
    @Test
    public void readTodoList() throws Exception {
        assertThat(true, is(true));
    }

    @TestLink(value="junit-3")
    @Test
    public void updateTodoList() throws Exception {
        assertThat(false, is(true));
    }

    @TestLink(value="junit-4")
    @Test
    public void deleteTodoList() throws Exception {
        assertThat(true, is(true));
    }
}

Runnerとして、"UnitilsJUnit4TestClassRunner.class"を指定すると@TestLinkのアノテーションが有効になります。正しくと言うと、このRunnerは@TestLink専用というわけでなく、本ライブラリを含む、UnitilsというライブラリのためのRunnerです。TestLinkとの統合機能以外にもMockやデータベースマイグレーション、データベース用のテストライブラリなど便利な機能がたくさんありますので一度サイトを覗いてみるのをお勧めします。

@TestLinkには"value"でTestLinkテストケースのidを指定します。"suite"も指定できますが、id自体がTestLinkでは一意なので特にsuiteは指定しなくても動作します。

これで通常通りJUnitを実行すれば、テスト結果がTestLinkに送信されます。今回はわざとテストが失敗するシナリオ(ダミーなのでfalse is trueとかしているだけですが)を作成していますので同じようにTestLinkでどのように表示されるか確認してみると良いと思います。

テストレポート

TestLinkはテストレポートが非常に充実しています。テストスィートを手動テストと自動テストで分けたり、移動させたりすると、自動化した効果や進捗が簡単に分かります。

TestLinkレポート

これまでテスト自動化の効果が手動テストチームやマネージャーに分かりにくい、伝わりにくいという悩みがあった方は是非このTestLinkの自動テスト統合機能を試して頂けると良いかなと思います。

JUnitとの統合の場合、TestLink側の設定変更は最小限で、自動テスト側でがんばれば良い形なので、既存の手動テストチームの負担も少なくて済むのがメリットです。只、自動テスト作成時には@RunWithをコメント化して連携しないようにするなどの工夫が必要かも知れません。

Jenkins編

TestLink Pluginを使います。これはこれでボリュームありますので、別途別の記事ととして作成したいと思います。