2017-09-22 7 views
3

はのは、最小限の作業例を見てみましょうカバレッジレポートから自動生成された例外コードを削除します。
main.cppに:

[g++/clang++] -std=c++11 -g -Og --coverage -Wall -o main main.cpp 

:私は以下のフラグを使用してこのコードをコンパイル

#include <iostream> 
#include <string> 

int main() { 
    std::cout << "hello " + std::to_string(42); 
    return 0; 
} 

clang 4.0.1
gcc 4.8.5。

in another stackoverflow questionのように、コンパイラは実行されない例外コードを生成するので、コードカバレッジは50%にすぎません。

-fno-exceptionsで例外を無効にすることは、私にとってはオプションではないという問題があります。私が単体テストを書いているコードは、例外を使用するので、それらをすべて無効にすることは選択肢ではありません。

レポートを生成するには、gcovr、clang ++の場合はさらにllvm-cov gcovを使用してレポートを生成してください。しかし、私はこれらのツールに縛られていないので、あなたがこの動作を示さない他のツールを持っているなら、それらを提案してください!

基本的には、このコードの単体テストをコンパイル/作成し、例外を有効にして100%分岐/条件付きカバレッジを取得する方法が必要です。方法はありますか?あなたは何のメモリを持っていないときbad_allocがスローされる -

答えて

1

まあ、私は

あなたが入力したコードは、例外がスローされます...あなたの意図は、実際にこのコードの小片をテストしますが、プロジェクト内の概念を使用していないと信じてstd::to_stringで作成される文字列を格納するために残しました。 100%安全であるためには、std::to_stringは、例外を処理できるtry-catchで囲む必要があります。

100%コードカバレッジユニットテストを構築するには、例外が発生するように強制する必要があります。この特定のケースでは、パラメータが定数であるため、ほとんど保証できません。しかし、あなたのプロジェクトでは、おそらく、サイズが可変なデータをいくつか割り当てていることになります。この場合は、メモリを割り当てるメソッドをコード内で分離して別々にテストできます。次に、これらのメソッドに渡します。テスト関数では、キャッチブロックに何を置いたかを評価するために割り当てられる膨大な量が渡されます(適切に処理しているかどうかを確認してください)。

例えば、このコードは例外をスローする必要があり、あなたのテストを構築するとき、あなた自身を鼓舞するために(sourceを)それを使用することができます:

// bad_alloc.cpp 
// compile with: /EHsc 
#include<new> 
#include<iostream> 
using namespace std; 

int main() { 
    char* ptr; 
    try { 
     ptr = new char[(~unsigned int((int)0)/2) - 1]; 
     delete[] ptr; 
    } 
    catch(bad_alloc &ba) { 
     cout << ba.what() << endl; 
    } 
} 

しかし、あなたはすべてのbad_alloc例外を処理する予定がない場合(または100%カバレッジを取得する方法はありません。これは100%カバレッジではないためです...しかし、ほとんどの場合、真の100%カバレッジは不要です。