Unit testing 使用cpput从异常中恢复

Unit testing 使用cpput从异常中恢复,unit-testing,exception,testing,cppunit,Unit Testing,Exception,Testing,Cppunit,我一直在使用CPPUnit作为单元测试框架,现在正试图将其用于自动构建和打包系统。然而,阻碍我的一个问题是,如果在单元测试运行期间发生崩溃,例如空指针解引用,它将停止其余的自动化 CPPFUnit是否有办法从异常中恢复,记录测试失败,然后优雅地存在,而不是终止单元测试过程?即使是一种特定于空指针解引用的方法也会很有用,因为它占我遇到的问题的90%左右 具体到技术,我在Windows系统上使用makefiles。在C/C++中,从类似错误中恢复的最佳方法是在单独的进程中运行每个测试,然后从父进程中

我一直在使用CPPUnit作为单元测试框架,现在正试图将其用于自动构建和打包系统。然而,阻碍我的一个问题是,如果在单元测试运行期间发生崩溃,例如空指针解引用,它将停止其余的自动化

CPPFUnit是否有办法从异常中恢复,记录测试失败,然后优雅地存在,而不是终止单元测试过程?即使是一种特定于空指针解引用的方法也会很有用,因为它占我遇到的问题的90%左右


具体到技术,我在Windows系统上使用makefiles。

在C/C++中,从类似错误中恢复的最佳方法是在单独的进程中运行每个测试,然后从父进程中监视它们。这在UNIX中非常容易——只需在测试开始之前使用fork()。支持这一点,并且您可以在不太麻烦的情况下修补CPPUnit以使其具有这种行为。

您正在构建过程中自动执行基于CPPUnit的单元测试,对吗

如果您试图使用CppUnit来执行构建过程,我很想说不要这样做

你能告诉我们当单元测试崩溃时,是什么在停止构建过程吗?你的单元测试是由什么开始的,一个生成文件,一个你自己的脚本,还是一个测试


要尝试回答您的问题,CPPFUnit无法从冲突或分段错误中恢复。在类Unix系统上,您应该能够捕获SIGSEGV并继续,但是处于哪个状态

如果您的崩溃发生在单元测试中,而不是产品中,那么我建议您依靠以下方法来防止取消引用空指针:

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());
  }
};

很抱歉这么说,但是你之前收到的关于这个问题的答案是荒谬的。
政协在这方面确实缺乏经验。cppunit应实现EXIT_ON_FAIL宏,该宏允许您在windows中捕获访问冲突(使用SetUnhandledExceptionFilter),然后您可以执行任何清理,并允许cpp单元通过EXIT_ON_FAIL报告故障。然后在报告之后,退出应用程序

作为对以后阅读此问题的任何人的补充说明,我发现可以捕获测试中的异常,并使用适当的信息使测试失败,而不会导致进程退出。

我没有尝试过,但如果在Windows中,我想使用SEH会有所帮助:

__try
{
// running your case
}

__except
{
}

将其集成到CppUnit框架中,每次收到未知异常时,都将该情况标记为失败。

不幸的是,如果您正在运行一个非常大的测试套件,这将是禁止的,因为可能会引入大量开销。每一次测试都会花费更多的时间来执行;分叉非常便宜,因为只需要复制修改过的内存页。除非您正在运行成千上万的测试,否则fork()的开销不太可能被注意到。