2

私はユニット テスト フレームワークとして CPPUnit を使用してきましたが、現在は自動化されたビルドおよびパッケージ システムで使用しようとしています。ただし、単体テストの実行中にクラッシュが発生した場合 (null ポインターの逆参照など)、残りの自動化が停止するという問題がありました。

CPPUnit が例外から回復し、テストの失敗を記録してから、単体テスト プロセスを終了するのではなく、正常に存在する方法はありますか? null ポインターの逆参照に固有のアプローチでさえ、私が抱えていた問題の約 90% を占めているため、役に立ちます。

テクノロジーに特化するために、私は Windows システムでメイクファイルを使用しています。

4

5 に答える 5

3

ビルド プロセス中に cppunit ベースの単体テストの実行を自動化していますね。

CppUnit を使用してビルド プロセスを実行しようとしている場合は、そうしないでください!

単体テストがクラッシュしたときにビルド プロセスを停止させている原因を教えてください。Makefile、独自のスクリプト、または継続的インテグレーション フレームワークによって開始された単体テストは何ですか?


あなたの質問に答えるために、CppUnit は違反またはセグメンテーション エラーから回復できません。Unix ライクなシステムでは、SIGSEGV をキャッチして続行できるはずです 、どの状態ですか?

クラッシュが製品ではなく単体テストで発生する場合は、NULL ポインターの逆参照を防ぐためにアサーション ガードに頼ることをお勧めします。

class TestObject : public CPPUNIT_NS::TestCase
{
  CPPUNIT_TEST_SUITE(Test);
  CPPUNIT_TEST(testObjectIsReady);
  CPPUNIT_TEST_SUITE_END();

public:
  void setUp(void) {}
  void tearDown(void) {} 

protected:
  void testObjectIsReady(void)
  { 
     Object *theObject = GetObject();

     CPPUNIT_ASSERT_MESSAGE("check pointer is not null", theObject != NULL);

     //--- now you can play with your object without dereferencing a NULL pointer
     CPPUNIT_ASSERT_MESSAGE("check objet is ready", theObject->isReady());
  }
};
于 2008-10-15T06:40:50.590 に答える
2

申し訳ありませんが、これについて受け取った以前の回答はばかげています。cppunitはこの点で本当に欠けています。cppunitは、Windowsでアクセス違反をトラップできるEXIT_ON_FAILマクロを実装する必要があります(SetUnhandledExceptionFilterを使用)。その後、任意のクリーンアップを実行し、cpp-unitがEXIT_ON_FAILを介して障害を報告できるようにします。次に、報告後、アプリケーションを終了します。

于 2009-01-26T17:42:54.313 に答える
1

後でこの質問を熟読する人への追加のメモとして、UnitTest++はテストで例外をキャッチし、プロセスを終了させるのではなく、適切な情報でテストを失敗させることができることを発見しました。

于 2009-02-12T04:59:34.797 に答える
1

C/C++ では、このようなエラーから回復する最善の方法は、各テストを個別のプロセスで実行し、親プロセスからそれらを監視することです。これは UNIX では非常に簡単です。テストを開始する前に fork() を実行するだけです。checkはこれをサポートしており、CPPUnit にパッチを当てて、大騒ぎせずにこの動作を行うことができます。

于 2008-10-15T05:04:35.450 に答える
0

私は試していませんが、Windows の場合は、SEH を使用すると役立つと思います。

__try
{
// running your case
}

__except
{
}

それを CppUnit フレームワークに統合し、不明な例外を受け取るたびに、ケースを失敗としてマークします。

于 2009-12-11T07:35:37.263 に答える