このブログは「Release7.5.0.: Coco Now Covers Python, Ranks Testing Risk with CRAP metric, and Cuts Embedded Setup Overhead (Qt for MCUs)」を翻訳したものです。
今回のリリースでは、チームから常に寄せられる3つの要望、すなわち「テストリソースをどこに投入すべきかについての明確な指針」、「より広範な言語のサポート」、そして「計測設定における手作業の削減」に重点を置いています。変更点は以下の通りです。
カバレッジ率は「どの程度の部分がテストされているか」を示すものです。しかし、「テストされていないコードがどこで最大のリスクをもたらすか」については答えられません。多くのチームは、複雑な関数が十分にテストされていないことを認識していますが、それを定量化したり優先順位をつけたりする客観的な方法を持っていません。新しいCRAP(Change Risk Anti-Patterns)メトリクスは、Cocoの既存のMcCabeサイクロマティック複雑度分析とカバレッジデータを組み合わせ、関数ごとの単一のリスクスコアとして算出することで、この課題に対処します。
この計算は、極めて単純な現実を反映しています。すなわち、複雑でありながらテストカバレッジが低いコードこそが、最も危険な組み合わせであるということです。複雑度が高いものの、テストによるカバレッジが十分にある関数は、低いスコアとなります。同様に複雑でありながらカバレッジが不十分な関数は、大幅に減点されます。スコアが30を超える関数は、CoverageBrowserにおいて「高リスク」としてフラグが立てられ、黄色(要注意)または赤色(重大)で強調表示されます。また、これらの関数を並べ替えることで、最も深刻な問題箇所を即座に特定することができます。
CRAPスコアはCoverageBrowserやHTMLおよびCSV形式のレポートで確認できるため、レビューゲートやスプリント計画、コンプライアンス文書などに活用することができます。
coverage.pyは、Pythonコードのカバレッジを測定するための標準的なツールです。テスト実行中にどの行や分岐が実行されたかを追跡し、レポートを生成します。ほとんどのPythonチームは、通常pytest-covを通じて、すでにこれを使用しています。しかし、このツールが提供しないのは分析機能です。どのテストがどの関数をカバーしているか、どの未テストのコードが最もリスクが高いか、あるいはPythonのカバレッジがマルチ言語のコードベースの他の部分とどのように関連しているかといった情報は得られません。特定の変更に対して実際にどのテストのサブセットが関連しているかを把握する組み込みの方法がないため、チームはデフォルトで、コミットごとにテストスイート全体を実行することになります。
Cocoはこのギャップを埋めます。coverage.pyのJSONエクスポートをCocoの計測データベースに取り込むことで、PythonのカバレッジデータもC/C++と同様に分析できるようになります。大規模なPythonテストスイートを持つチームにとって、Cocoのパッチ分析は最も即効性のある実用的なメリットとなります。Cocoは、どのテストがどの関数をカバレッジしているかを追跡し、コードの変更が導入された際には、どのテストを実行する必要があるかを正確に特定します。これにより、カバレッジの信頼性を損なうことなく、CIの所要時間とインフラコストを直接削減できます。
インストールにはデモプロジェクトが含まれています。Coverage.py バージョン 7.10 以降のご利用をお勧めします。
これまで、MCUターゲットにカバレッジ計測機能を導入するには、多大な手作業が必要でした。具体的には、コンパイラプロファイルを手動で設定したり、デバイスから実行レポートを取得するためのカスタムI/O関数を記述したり、C++とQMLのカバレッジを別々のプロセスで処理し、結果が統合されないといった作業が挙げられます。多くの組み込み開発チームにとって、こうしたオーバーヘッドが継続的なカバレッジ測定を現実的でないものにしていました。今回のリリースにより、こうした課題の大部分が解消されます。
CoverageScannerでは、Qt for MCUsでサポートされているツールチェーンに対して、デフォルトで正しいコンパイラプロファイルが組み込まれるようになりました。新しい--qulオプションを使用すると、以前は必要だったプロジェクトレベルの変更を行うことなく、QML(Qt Quick Ultralite)コードを自動的に計測できます。DeviceLinkとの統合により、ターゲットボードから直接実行レポートを取得できるため、カバレッジデータの収集のためだけに、カスタムI/Oを実装したり、デバッガーを接続したりする必要はありません。
CoverageBrowserには、デバイスの検出、テスト実行中のデバッグ出力の監視、および接続されたデバイスからの実行レポートのワンクリックインポートを行うための、MCU専用Qtパネルが追加されました。C++およびQMLのカバレッジ結果を単一の計測データベースに統合することで、両言語にわたるアプリケーションのカバレッジを包括的に把握することができます。
これらの機能は、Qt for MCUs バージョン 2.12.1 以降に対応しています。
Cocoには、一般的なツールチェーン向けに事前設定されたコンパイラプロファイルが同梱されています。これらのプロファイルの対象外となるコンパイラについては、従来、設定作業は手動で行わなければならず、ツールチェーンの機能に関する深い知識が必要とされていました。これは、ツールチェーンの多様性が高く、ドキュメントも不十分なことが多い組み込み分野において、特に大きな障壁となっていました。新しいcocosetupユーティリティにより、この作業が自動化されます。
cocosetupは、指定されたツールチェーンの利用可能な機能(メモリ割り当て方法、ファイルAPI、パフォーマンスカウンター、およびコンパイララッパーの生成方法に影響を与えるその他の機能)を調査します。ツールチェーンが実際にサポートしている内容に合わせて設定を調整します。これは、mallocのような標準機能が利用できない場合がある組み込み環境において、特に重要です。
このツールは対話モードとコマンドラインモードの両方をサポートしているため、ガイド付きセットアップセッションにも、スクリプト化されたCIパイプラインにも同様に適しています。ラッパーファイルは、別の出力ディレクトリに配置することも、その場で設定することも可能で、元に戻す機能もサポートされています。再帰的なツールチェーン検出機能により、コンパイラのバイナリがツールチェーンのパッケージディレクトリの奥深くにネストされている場合にも対応します。設定後、cocosetupは、生成されたラッパーに対して組み込みの検証テストを実行し、プロジェクトへの組み込みを行う前にセットアップが正しいことを確認します。
これはcocosetupの最初のリリースです。今後のバージョンで機能拡張が行われる予定です。
これらの追加機能は、それぞれ具体的な課題の解決を目指しています。具体的には、テストされていない複雑さがどこでリスクを生み出しているかを把握すること、PythonをC/C++と同じ解析環境に取り込むこと、組み込みカバレッジ解析の手作業による負担を軽減すること、そして専門知識がなくてもツールチェーンの設定を行えるようにすることです。
すでにCocoをご利用の場合は、完全なリリースノートと更新されたドキュメントに、各機能の設定詳細が記載されています。初めてCocoをご検討中の場合は、無料トライアルをご利用いただくと、サポートされているすべての言語およびプラットフォームに対応した完全なツールチェーンをご利用いただけます。