Coco Test Engine – コード・カバレッジ解析の新機能

このブログは「Coco Test Engine – The New Era of Code Coverage Analysis」」を翻訳・一部加筆したものです。

Coco 7メジャー・リリースは、コード・カバレッジ分析ツールCocoに待望のテスト・データ生成機能(Cocoテスト・エンジン)をもたらしました。Cocoのリード・デベロッパーであるセバスチャン・フリッカー(Sébastien Fricker)にインタビューし、アップデートの真相に迫るとともに、Cocoテストエンジンがコード・カバレッジの世界をどのように改善するのかを探りました。

テストデータ生成機能は、コード解析プロセスを改善し、コードの品質保証を以下のように容易にします:

  • 実現可能な最高カバレッジレベルへの迅速な到達を支援
  • コードカバレッジ分析における冗長性の整理
  • エッジケースを含むテストデータの自動収集の提供

Coco Test Engine の紹介-概要ビデオ

 

Coco のリード・デベロッパー、セバスチャン・フリッカーへのインタビュー

コード・カバレッジ分析で解決しようとした課題は何ですか?

これまで、ソフトウェア開発者はユニットテストとテストデータを自ら考える必要がありました。これは大変な作業であり、さらに、自身で考えたデータがテストすべき潜在的なエッジケースを完全にカバーしているわけではありません。

例えば、電卓アプリを開発しているとします。そのテストのために、短い式のユニットテストを書きます。そして、テストデータを手動で入力します:1+2、3*4、3/2、3-2などを含めます。

このような単純なケースであっても、以前はテストケースを考え、分析を実行するのに多くの手作業が必要でした。一般的に、テストコードは本番コードよりもはるかに大きくなる可能性があります。小さなソースコードのスニペットに対して、100%のカバレッジを達成するために大きな単体テストのセットを書く必要があることは珍しいことではありませんでした。

そのため、ほとんどの場合、開発者は通常のテストケース(典型的な使用法、正常なワークフロー、正しいデータなど)に労力を集中し、多くのエッジケース(エラーケース、不正な入力、中断されたワークフローなど)を省略してしまいます。私たちの例で言えば、ゼロ除算(1/0)、空式、複数のドットが含まれるような不正な数値(1.2.3)などが該当します。

結局のところ、コードの品質に対する信頼性を高めるためには、テストケースを見つける作業に多くの時間を費やす必要があります。しかし、テストを実施する際にいくつかのケースを見落としてしまったり忘れてしまったりすると、高いカバレッジを達成することができません。機能の品質と開発に費やす時間の間には、時に相反するものが存在することもあります。

テストデータの作成は、どのように問題を克服するのに役立つのか?

テストデータ生成とは、その名の通りテストデータを生成することです。Coco Test Engineは、テストの品質を向上させ、様々なエッジケースやエラーケースをカバーするためのテストデータを自動的に生成します。アルゴリズムを活用することで、通常は網羅されないケースを見つけ出したり、既存のテストスイートを補完したりします。

Cocoのテストデータ生成は、3つの方法でデータ駆動型テストを書く複雑さを軽減します:

  1. テストコードとテストデータを分離することで、多くのテストフレームワークでは、データドリブンテストの概念が提供されていません。そのため、開発者はテストデータごとに個別の関数を記述する必要があります。一部のフレームワークでは、テストデータ生成と単体テストコードを同じファイルに配置しますが、これによりデータがC++の構文に従う必要があり、単体テストコードのサイズが増加することになります。
  2. データエディターを使用すれば、スプレッドシート形式でテストのレビューや編集を簡単に行うことができます。
  3. この一連のツールは、新しいテストケースの発見に役立つだけでなく、コードの変更に伴うテストデータの更新や、テスターによるデータ検証のプロセスも効率化します。

 

“Coco Test Engine は、コードのリファクタリングをより自信を持って行うのに役立ちます。通常のケースにフォーカスし、残りの部分はCocoに任せることができます。”

 

テストデータ生成機能が特に有用な状況を説明します

コードの一部を書き直したいとします。このようなリファクタリングはよくあります。しかし、適切な単体テストを実施せずに修正を進めると、その作業が多くの問題を引き起こす可能性があります。 

Cocoはテストデータ生成機能を備えており、ユニットテストやコードに加えた変更の検証を自動化します。これにより、リファクタリングされたコードが想定通りに機能することを保証します。そのため、テストケースの生成は、有効なテストデータを生成し、テストの参照として活用します。

これは基本的に、より信頼性の高いコードのリファクタリングに役立ちます。テストスイートを自動生成し、高いカバレッジを達成するまで待つだけです。その後、コードの修正に集中し、テストが必要なさまざまな「ゴミ」データをテストエンジンのアルゴリズムにカバーさせることができます。

コード・カバレッジ分析の改善によって、どの業界が最大の価値を得ることができるのか?

取り組んでいるアプリケーションやソフトウェアが複雑でなくても、この機能は有用です。例えば、医療機器、航空、自動車などでは、シンプルなコードで重要なシステムが稼働しています。一般的に、高いコードカバレッジ、それゆえのテストデータ生成機能は、安全性を重視する産業やソフトウェアでは不可欠です。

航空業界を例に挙げてみましょう。この業界では非常に高い基準があり、場合によっては時には100%のコードカバレッジが求められます。もしもこれを達成することが不可能な場合、カバーされていない各行のコードを正当化する必要が出てきます。

カバー率が10%から11%まではかなり簡単に達成できますが、カバー率が高くなるにつれて、より高いレベルに到達するのがますます難しくなります。50%から51%までは数分で達成できるかもしれませんが、90%まで達するのに1時間かかることもあります。そして、カバレッジが100%に達すると、テストにかかる時間は指数関数的に増加します。Cocoは、テスターから提供されたデータを使用し、新しいテストケースを自動的に見つけることで、必要なカバレッジレベルまでより迅速に到達できます。

しかし、テストデータを見つけるだけでは不十分です。データの品質も見直す必要があります。たとえば、電卓の例を続けましょう。ユーザーは簡単に "4/2" の割り算の入力データを提供し、その結果は "2" であると予想されます。Cocoは新しいテストを発見することができ、例えば "1/0" という割り算を見つけることができます。しかし、この出力の正しい結果は何でしょうか?「無限大」?「不正な式」?「エラー:ゼロによる除算」? 

出力はユーザーの期待に合致する必要があります。その適合性を判断するのは人間だけです。これが、データの各インスタンスに検証フラグが追加される理由です。このフラグによって、データを検証済みとしてマークすることができます。

 

“コードカバレッジを100%にするには、製品によっては数ヶ月かかることがあります。Cocoは、必要なカバレッジレベルまでより早く到達させ、残りのコードの正当性を示すのに役立ちます。”

 

Cocoテストエンジンは実際にどのように機能するか?

こちらは、簡素化したプロセスのアウトラインです:

  1.  2つのマクロを簡単な単体テストコードを書く:
    1. 新しい入力データを取得するためのFETCH
    2. 出力を期待される結果と比較するためのCHECK
  2. ユニットテストをコンパイルする
  3. データエディターを使ってテストケースを作成し、通常のアプリケーションのようにデバッグする
  4. テスト・ディスカバリーを実行して、新しいケースを見つけ、カバレッジを高める
  5. 生成されたデータをレビューし、出力が期待されたものと一致しているかどうかを確認する

 

Cocoのテストデータ生成には一つ考慮すべき点があります:アルゴリズムにより多くのテストデータを検証する必要があるため、最初のセットアップには少し時間がかかるかもしれません。しかし、時間が経過すれば、それ以上のメリットが得られることを保証できます。

チュートリアル:Coco Test Engine のセットアップ方法

 

試してみよう!

より早く、完全のコードカバレッジ分析を体験したい方. Cocoのフリートライアルはこちら →

より詳細な説明をご覧になりたい方 コードカバレッジツールについて →


Blog Topics:

Comments