2

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

CPPUnit 有没有办法从异常中恢复,记录测试失败,然后优雅地存在而不是终止单元测试过程?即使是针对空指针取消引用的特定方法也会很有用,因为它构成了我遇到的大约 90% 的问题。

为了特定于技术,我在 Windows 系统上使用 makefile。

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 应该实现一个 EXIT_ON_FAIL 宏,它允许您捕获 Windows 中的访问冲突(使用 SetUnhandledExceptionFilter),然后您可以进行任何清理并允许 cpp-unit 通过 EXIT_ON_FAIL 报告故障。然后在报告后,退出应用程序。

于 2009-01-26T17:42:54.313 回答
1

在 C/C++ 中,从此类错误中恢复的最佳方法是在单独的进程中运行每个测试,然后从父进程监视它们。这在 UNIX 中非常简单——只需在测试开始前进行 fork() 即可。check支持这一点,并且您可能会修补 CPPUnit 以使其具有此行为而无需大惊小怪。

于 2008-10-15T05:04:35.450 回答
1

作为稍后阅读此问题的任何人的附加说明,我发现UnitTest++可以在测试中捕获异常,并且只是使用适当的信息使测试失败,而不是导致进程退出。

于 2009-02-12T04:59:34.797 回答
0

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

__try
{
// running your case
}

__except
{
}

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

于 2009-12-11T07:35:37.263 回答