こんにちは、テクマトリックスの酒井です。

ソフトウェア開発において、単体テストは品質確保に欠かせない重要な工程です。しかし、そのテスト結果を他のテスト結果と同様に管理することは、手動登録の手間やミスのリスクがあるため敬遠されがちです。

本記事では、Parasoft C/C++test、Jenkins、TestRailといったツールを組み合わせ、単体テスト結果の管理を完全に自動化する仕組みを実際に構築した事例をご紹介します。これにより、単体テストの結果をテスト管理に丸ごと反映でき、テストの透明性やトレーサビリティが向上し、品質管理の効率化が期待できます。

CI/CD環境でのテスト自動化の実践例として、ぜひ参考にしていただければ幸いです。

全体システム構成とワークフロー

本章では、Jenkinsパイプラインを通じてC/C++testによる単体テスト結果をTestRailに自動インポートする仕組みの全体構成と作業の流れを説明します。

システムの主な構成要素は以下の通りです。

  • Git:ソースコードリポジトリ。ソースコード、テストコード、C/C++testのプロジェクトファイル、Jenkinsパイプラインコードなどを管理します。
  • Jenkins:継続的インテグレーションツール。単体テストの実行およびテスト結果のTestRailへのインポートを自動化します。
  • C/C++test:C/C++向けのテストツール。単体テストを実行し、xUnit形式(JUnit形式に類似)のテストレポートを出力します。
  • TestRail:テスト管理ツール。単体テストを含む複数レベルのテストケースと結果を一元管理し、品質向上のための分析やトレーサビリティを提供します。

これらを組み合わせたワークフローは以下のとおりです。

  1. 開発者がソースコードやテストコードをGitへプッシュします。
  2. JenkinsがGitへのプッシュを検知すると、パイプラインが自動で実行されます。このパイプラインでは、以下の処理が順に行われます。
    1. Gitからソースコード、テストコード、C/C++testのプロジェクトファイル等をチェックアウトします。
    2. C/C++testを使って単体テストを実行し、テスト結果をxUnit形式のテストレポートとして出力します。
    3. 単体テストが正常に終了した後、TestRail CLIを用いてテスト結果をTestRailへ登録します。
  3. 登録が完了すると、開発者はTestRail上で単体テスト結果を確認でき、レポートや分析に活用できます。

この自動化されたフローにより、人為的な手入力ミスを削減し、効率的にテスト結果を管理することが可能となります。

なお、TestRail CLIを用いてテスト結果をTestRailへ登録するには、TestRailサーバーでAPIを有効化している必要があります。APIを有効化する方法はTestRailのドキュメントを参照してください。

Jenkinsパイプラインの実装例

C/C++testを使った単体テストの実行

C/C++testを次のように実行します。

  • パイプライン実行時のワークスペースとは別のディレクトリをワークスペースディレクトリとして指定します。これは、C/C++testがプロジェクトファイルとは別に専用のワークスペースディレクトリを必要とするためです。
  • GitリポジトリからチェックアウトしたプロジェクトをC/C++testのワークスペースにインポートします。
  • -resource オプションにC/C++testのプロジェクト名を指定し、単体テストの実行対象となるプロジェクトを明示的に指定します。
  • インポートしたプロジェクトに対して、単体テストの実行が有効に設定されたテストコンフィギュレーションを実行します。
  • xUnit形式のテストレポートを出力します。テストレポートは -report オプションで指定したディレクトリの report_xunit.xml というファイルに保存されます。

単体テストを実行する場合のコマンド例を以下に示します。${XXX} は環境変数を参照します(Linux環境を想定しています)。

# C/C++testによる単体テストを実行
"${CPPTEST_HOME}/cpptestcli" \
    -data "${CPPTEST_WORKSPACE_DIR}" \
    -import "${WORKSPACE}" \
    -resource "${CPPTEST_PROJECT_NAME}" \
    -config "${CPPTEST_TEST_CONFIG}" \
    -settings "${CPPTEST_SETTINGS_FILE}" \
    -report "${CPPTEST_REPORT_DIR}"

cpptestcli コマンドの -settings オプションで指定されるC/C++testの設定ファイルの最小限の例:

# xUnit形式のレポートを生成します
report.format=xunit
# 実行されたテストケースと結果(成功または失敗)の一覧をレポートに含めます
report.contexts_details=true

TestRail CLIを用いたテスト結果の登録

TestRail CLIはPython製のツールです。pip コマンドを使用してインストール後に利用します。仮想環境を作成してアクティベートすると確実にインストールできます。

TestRail CLIに渡すパラメーターは以下の通りです。

  • --yes:対話なしで処理を進めるオプションです。
  • --host:TestRailのURLを指定します。
  • --project(および --project-id):TestRail上の対象プロジェクトを指定します。プロジェクト名であいまいになる場合はプロジェクトIDも指定します。
  • --username と --password、または --key:TestRailの認証情報を指定します。セキュリティの観点から、認証情報はパイプラインに直書きせず、Jenkinsの認証情報から取得すべきです。
  • parse_junit:JUnit形式のテストレポートを解析してTestRailにインポートするサブコマンドです(C/C++testはxUnit形式のテストレポートを出力しますが、このサブコマンドで問題なく取り込めます)。
  • --title:テストランのタイトル。テストランが単体テスト結果であることが分かりやすくなります。
  • --run-description:テストランの説明。ブランチ名やビルド番号などを設定すると実行元の特定に役立ちます。

以下はLinux環境でのTestRail CLIのインストールとテスト結果登録コマンドの例です。

# Pythonの仮想環境を作成・アクティベート
python -m venv .venv
source .venv/bin/activate

# TestRail CLIをインストール
pip install trcli --quiet

# xUnit形式のテストレポートをTestRailに送信
trcli --yes \
    --host "${TESTRAIL_URL}" \
    --project "${TESTRAIL_PROJECT_NAME}" \
    --username "${TESTRAIL_CRED_USR}" \
    --password "${TESTRAIL_CRED_PSW}" \
    parse_junit \
    --file "${CPPTEST_REPORT_DIR}/report_xunit.xml" \
    --title "C/C++test Automated Unit Tests Run" \
    --run-description "Build #${BUILD_NUMBER} from ${GIT_BRANCH}"

実行結果

Jenkinsパイプラインを実行し、TestRailに単体テスト結果をインポートすると、TestRailでは以下のようにテスト結果が表示されます。

インポートされた単体テスト結果をTestRailの画面で確認している様子

まとめ

本記事では、Jenkinsパイプラインを通じてC/C++testによる単体テストを自動実行し、その結果をTestRailに自動インポートする仕組みについて、全体構成から具体的な実装例まで詳しく解説しました。Gitによるコード管理からテスト実行、レポート生成、TestRailへの連携に至るまでを自動化することで、人為的なミスを削減し、効率的かつ確実なテスト結果の管理を実現しています。

この自動化フローにより、開発者はTestRail上で単体テストの結果をリアルタイムに確認できるようになり、品質向上やトレーサビリティ強化に大いに役立てられます。本記事が、テスト管理と継続的インテグレーション構築の基礎としてお役に立てば幸いです。

付録

Jenkinsfile全文サンプル

pipeline {
    agent any

    environment {
        // TestRail設定

        // TestRailのURL。認証情報の種類は「Secret Text」
        TESTRAIL_URL = credentials('testrail-url')

        // TestRailの認証情報。認証情報の種類は「ユーザー名とパスワード」
        TESTRAIL_CRED = credentials('testrail-user-password')

        // TestRailのプロジェクト名
        TESTRAIL_PROJECT_NAME = 'サンプルプロジェクト'

        // C/C++test設定

        // C/C++testプロジェクト名
        CPPTEST_PROJECT_NAME  = "trcli"

        // テストレポート作成ディレクトリ
        CPPTEST_REPORT_DIR    = "${WORKSPACE}/reports/unit-testing"

        // C/C++testの設定ファイル
        CPPTEST_SETTINGS_FILE = "${WORKSPACE}/cpptest/settings.properties"

        // テストコンフィギュレーション名
        CPPTEST_TEST_CONFIG   = "${WORKSPACE}/cpptest/configs/Run Unit Tests.properties"

        // ワークスペースディレクトリ
        CPPTEST_WORKSPACE_DIR = "${HOME}/parasoft/workspace"
    }

    stages {
        stage('単体テスト') {
            steps {
                sh label: 'C/C++testで単体テストを実行', script: '''
                    # レポート出力ディレクトリを再作成
                    rm -rf "${CPPTEST_REPORT_DIR}"
                    mkdir -p "${CPPTEST_REPORT_DIR}"

                    # C/C++testのワークスペースをクリア
                    rm -rf "${CPPTEST_WORKSPACE_DIR}"

                    # C/C++testによる単体テストを実行
                    "${CPPTEST_HOME}/cpptestcli" \
                        -data "${CPPTEST_WORKSPACE_DIR}" \
                        -import "${WORKSPACE}" \
                        -resource "${CPPTEST_PROJECT_NAME}" \
                        -config "${CPPTEST_TEST_CONFIG}" \
                        -settings "${CPPTEST_SETTINGS_FILE}" \
                        -report "${CPPTEST_REPORT_DIR}"
                '''
            }
            post {
                success {
                    sh label: 'テスト結果をTestRailにアップロード', script: '''
                        # Pythonの仮想環境を作成・アクティベート
                        python -m venv .venv
                        source .venv/bin/activate

                        # TestRail CLIをインストール
                        pip install trcli --quiet

                        # テスト結果をTestRailに送信
                        trcli --yes \
                            --host "${TESTRAIL_URL}" \
                            --project "${TESTRAIL_PROJECT_NAME}" \
                            --username "${TESTRAIL_CRED_USR}" \
                            --password "${TESTRAIL_CRED_PSW}" \
                            parse_junit \
                            --file "${CPPTEST_REPORT_DIR}/report_xunit.xml" \
                            --title "C/C++test Automated Unit Tests Run" \
                            --run-description "Build #${BUILD_NUMBER} from ${GIT_BRANCH}"
                    '''
                }
            }
        }
    }
}

By tsakai

Jenkins関連のサービスやCloudBees製品を主に担当しています。 Certified CloudBees Jenkins Engineer (CCJE) および CloudBees CI DevOps Associate です。