継続的インテグレーションを使用した要件に基づくテスト メトリクスの収集
概要
要件に基づくテスト メトリクスを使用すると、要件に基づくテスト アクティビティのステータスと品質を評価できます。モデル テスト ダッシュボードを使用してその結果を可視化し、継続的インテグレーションのワークフローを使用してメトリクスの収集を統合できます。これらのメトリクスを継続的に収集すると、プロジェクトの進行と品質の監視に役立ちます。この例では、GitLab® を使用してプロジェクト ソースをホストし、Jenkins® を使用してプロジェクトをビルドおよびテストして、結果をアーカイブします。
要件
MATLAB® プロジェクトの使用
Simulink テスト マネージャーのテスト ハーネスの使用
ソース管理でのプロジェクトの設定
GitLab の設定
プロジェクトのソース管理のための GitLab プロジェクトを作成します。詳細については、https://docs.gitlab.com/ee/index.html を参照してください。
Git クライアントをインストールします。
分岐ワークローを設定します。GitLab を使用して、メイン ブランチから、モデル ファイルに変更を実装するための一時的なブランチを作成します。統合担当のエンジニアは Jenkins のテスト結果を使用して、一時的なブランチをメイン ブランチにマージすべきかを判断できます。詳細については、https://git-scm.com/book/en/v2/Git-Branching-Branching-Workflows を参照してください。
[Settings]、[Repository] で、開発者がメイン ブランチに変更をマージする際にマージ要求の使用を強制することで、メイン ブランチを保護します。
[Settings]、[Integrations] で、Jenkins プロジェクトの URL に Web フックを追加します。この Web フックは、Jenkins のビルド ジョブをトリガーします。
プロジェクトの追加
この例では、ダッシュボードのプロジェクト例を使用します。このプロジェクトの作業コピーを作成するには、コマンド ラインに以下を入力します。
dashboardCCProjectStart('incomplete')
Git™ を使用して、プロジェクトのすべてのファイルを、この例に添付されているファイルとともにメイン ブランチに追加します。これらのスクリプトは、テストの実行とメトリクスの収集に使用します。
派生したアーティファクトのフィルター処理
メトリクスを収集すると、通常はソース管理にチェック インさせないファイルが生成されます。Git では、ルート ディレクトリにある .gitignore
という名前のテキスト ファイルにフィルターを追加することでファイルを無視できます。この例に添付されているサンプル .gitignore
ファイルを追加すると、この例で生成され、ソース管理に追加する必要のないファイルをフィルター処理できます。.gitignore
ファイルの詳細については、https://git-scm.com/docs/gitignore を参照してください。
継続的インテグレーション ツールでのプロジェクトの設定
継続的インテグレーション ツールでは、プロジェクトのビルドとテストが自動化されます。同様の一般的手順に従うことによって、多くの異なるツールを使用して要件に基づくテストの結果を生成できます。この例では、Jenkins を自動化ツールとして使用します。この例を実行するには、Jenkins 用の GitLab プラグインと MATLAB プラグインをインストールしなければなりません。
プロジェクトの作成
CI ツールは、プロジェクトのソース管理リポジトリに統合する必要があります。この統合により、CI ツールが変更をリッスンし、ビルドするプロジェクトにアクセスできるようになります。Jenkins には、あらゆるソース管理 (SCM) と連携可能なプロジェクトの汎用テンプレートとして機能するフリースタイル プロジェクトが用意されています。フリースタイル プロジェクトで、ソース管理情報を追加することによって、ホストされたプロジェクトに SCM がアクセスできるようになります。
[New Item] をクリックし、名前を記入して、フリースタイル プロジェクトを選択します。または、既存のフリースタイル Jenkins プロジェクトに対して [Configure] をクリックします。
[Source Code Management] タブをクリックし、[Repository URL] フィールドで、GitLab リポジトリの URL を指定します。
[Build Triggers] タブをクリックし、[Build when a change is pushed to GitLab] を選択します。
[Build Environment] タブをクリックし、[Use MATLAB Version] を選択し、[MATLAB root] を入力してビルドの MATLAB バージョンを指定します。
ビルドおよびテスト
Jenkins 用の MATLAB プラグインを使用すると、MATLAB コマンドを指定して統合したり、コマンド ラインを使用せずにテストを構成したりすることができます。この例では、1 回のビルド ステップでプロジェクトを開き、メトリクス構造を初期化し、テストを実行し、結果を収集します。
[Build] セクションで、[Add build step]、[Run MATLAB Command] を選択します。[Command] フィールドに次を入力します。
openProject(pwd);collectModelTestingResults();runTests();collectModelTestingResults();
メトリクス結果のアーカイブと使用
メトリクス結果は、ビルド ステップ中にアーカイブし、その後、レビューするときに MATLAB に再インポートできます。この例では、結果の収集スクリプトによって、メトリクス データが derived
ディレクトリに保存されます。一部のメトリクスはエクスポートされた Simulink Test の結果に依存しているため、エクスポートされた .mldatx
ファイルをアーカイブに含めてください。
後でレビューするために結果をアーカイブするには、CI システムを以下のファイルをエクスポートするように設定します。
<project-root>/derived
ディレクトリにあるすべてのファイル。<project-root>/testresults/.mldatx
ファイルにエクスポートされたすべてのテスト結果。
この例では、Jenkins が提供しているビルド後のアクションを使用して、ビルド中に生成されたアーティファクトをアーカイブします。
[Post-build Actions] タブをクリックし、[Add post-build action] をクリックします。[Archive the artifacts] を選択します。次のパスを入力します。
derived/**,testresults/*.mldatx
保存されているすべてのファイルがこのディレクトリにアーカイブされます。
[Save] ボタンをクリックし、構成を保存して閉じます。
Jenkins でのビルド ジョブの実行
Jenkins は、プロジェクトへの新しい変更が GitLab リポジトリにコミットされるたびに、新しいビルド ジョブを実行するように構成されました。Jenkins のプロジェクト ページの [Build Now] をクリックして、手動でビルドを実行することもできます。
MATLAB でのアーカイブされた結果のレビュー
Jenkins では、ビルドが正常に実行されるたびに、生成されてアーカイブされたすべてのファイルが保存されます。これらは、個別に表示したり、1 つの zip ファイルにまとめてダウンロードしたりできます。MATLAB で結果を表示するには、次を行います。
結果の生成に使用したプロジェクトのバージョンをソース管理から取得します。
アーカイブされたメトリクス結果をアーカイブされた場所から取得します。
derived
ディレクトリとすべてのファイルをダウンロードし、プロジェクトのルート ディレクトリにコピーまたは解凍します。アーカイブされたエクスポート済みの Simulink Test の結果ファイルをダウンロードし、これらのファイルをコピーまたは解凍します。
MATLAB でプロジェクトを開き、モデル テスト ダッシュボードを開きます。ダッシュボードに CI ビルドから生成された結果が表示されます。
コマンド ラインを使用した代替の CI 統合
別の自動化ツールを使用する場合は、代替としてコマンド ラインを使用して統合をテストできます。-batch
フラグを使用して、コマンド ライン インターフェイスで適切なコマンドを実行することにより、テストを実行し、メトリクスを収集します。
たとえば、次のコマンドを使用した場合、MATLAB はプロジェクトを開き、モデルのテスト結果を初期化し、すべてのテストを実行し、モデル メトリクスを収集してからシャット ダウンします。
matlab -c %LICENSE_PATH% -nosplash -logfile output.log -batch "openProject(pwd);collectModelTestingResults();runTests();collectModelTestingResults(); exit;"