2009-07-13 13 views
6

ユニットテストでコンパイルエラーをどのようにしてテストするのですか?コンパイラエラーのユニットテスト

は、コードを考えてみましょう:

class ErrorTest 
{ 
    OtherClass& read_write() { 
     return other; 
    } 

    const OtherClass& read_only() const { 
     return other; 
    } 

    private: 
     OtherClass other; 
}; 

にはどうすればREAD_ONLY()の割り当てをテストすることができますか?それは本当に重要だとしっかりと適切にコンパイルエラーを生成するためにチェックする必要があります?私は、主な質問は今、あなたはこの時点であなたのコードやコンパイラのことをテストしている

ErrorTest test; 
OtherClass other = test.read_only(); 
test.read_write() = other.modify(); 
test.read_only() = other.modify(); /* This should error */ 
+0

良い質問です。私は前に同じことを思った。しかし、本当に良い答えを見つけたことはありません。もちろん、ファイルをコンパイルしようとするスクリプトを書いて、エラーコードなどを確認することはできますが、それほどエレガントなソリューションはありません – jalf

答えて

1

推測しますか

コンパイラをテストすることは必ずしも悪いことではありません...私はコンパイラのアップグレードで以前はエラーをマスクしていましたので、あなたが期待しているものと同じ安全チェックを確実に得ることができればうれしいでしょう。

しかし、多くの訓練をしなければなりません。あなたの単体テストは、コンパイラを生成し、その出力をキャプチャし、正しい行の正しいエラー文に対して解析する必要があります。それは自明ではなく、間違いなく価値があります。

ディレクトリが不完全なコードを残しておき、スクリプトが各ファイルを1つずつコンパイルするようにする方が簡単です。そこに失敗するべき正確な条件をオンにする '#ifdef MAKEFAIL'フラグがあります。そのフラグを設定しないとコンパイラが0を返すようにし、そうしないと0以外を返すようにしてください。これは、コンパイラが失敗したときに非ゼロを返すと仮定します...私はMSVCがその規則に従っているかどうかわかりません。

3つ目のオプションは、移植性に対処するために、autoconfです。それはセットアップするのが苦痛かもしれませんが、その目的の一部はコンパイルする前に正常な開発環境を確保することでした。このようなテストを追加すると、コンパイラを見つけて試してみることができます。

+6

彼はコードがconstで正しいことをテストしています。だから私は彼がまだ彼のコードをテストしていると思う、それはちょうど彼がコンパイル時に明白なそのプロパティをテストしているということだけである。 –

+0

私は彼がコンパイラが警告を生成していることを確認しようとしているので、警告は表示されません。ユニットテストでコンパイルが不満だと言っても少し冗長に思えるかもしれませんが、素敵な単体テスト出力パーサがあれば理にかなっています。 –

+1

彼は、コンパイラが警告ではなくエラーを生成するようにしています。これが意味を成すC++のケースはたくさんあります。 Constの正しさは一例ですが、テンプレートを使用してプレイしている場合は、頻繁に発生します。 – jalf

1

これは、* nixマシンのソースからビルドを "./configure"したときに起こる自動検出のようです。 autoconfスクリプトはほとんどプログラムを構築せず、それらをコンパイルしてコンパイラが利用できるものとサポートしているものを判断しようとします。

これを再利用することは現実的ではありませんが、同じモデルが必要な場合があります。各テストには、独自のファイルまたはファイルセットと、別のプロジェクトファイル/ make target/etcがあります。次に、テストスクリプトは各テストケースを作成し、grepまたはテストケースと共に格納されたベースライン出力に出力する。

0

コンパイラとプラットフォームの有効なテストは、動作のランタイムバリエーションになります。私はしばしばこれを行い、プロダクションコード内に存在する小さなビヘイビアを再現し、ビヘイビアが期待どおりであることを確認します。

あなたが本当に望むのは、開発者が記述するコードがこのような規則に従っていることを確認する静的解析ツールです。それは確かに有効なビルドツールです。ただし、ここで指定しているものを見つけるために静的解析ツールを検索するのは難しいかもしれません。私はC/C++セクションのWikipedia記事List of tools for static code analysisから始めたいと思います。

あなたが書いたコードは「エラー」ではないことに注意してください。これは非常に優れたコンベンションですが、コンパイラはあなたにその慣習を強制しません。どちらも静的解析ツールではありません。したがって、許可されるものと許可されないものを構成することができるものを見つける必要があります。

+0

悲しいことに、cppcheckはこのタイプのエラーでは機能しません: "$ cppcheck main.cppチェック中main.cpp:...エラーが見つかりません" – LiraNuna

+0

cppcheckを設定する方法はありますか?それはそれのようには見えません。それはあなたの大会を強制するために必要なことです。 –