我一直在使用CPPUnit作为单元测试框架,现在我正尝试在自动构建和打包系统中使用它。然而,阻碍我的一个问题是如果在单元测试运行期间发生崩溃,例如空指针解除引用,它会停止自动化的其余部分。
CPPUnit有没有办法从异常中恢复,记录测试失败然后优雅地存在而不是终止单元测试过程?即使是针对空指针解除引用的特定方法也是有用的,因为它占我所遇到的大约90%的问题。
为了特定技术,我在Windows系统上使用makefile。
答案 0 :(得分:3)
您在构建过程中自动执行基于cppunit的单元测试,对吧?
如果您尝试使用CppUnit来执行构建过程,我很想说不要这样做!
你能告诉我们当单元测试崩溃时停止构建过程的是什么吗?你的单元测试是什么,Makefile,你自己的脚本,或continuous integration framework?
要尝试回答您的问题,CppUnit无法从违规或细分错误中恢复。在类Unix系统上,您应该能够捕获SIGSEGV并继续,但 处于哪种状态?
如果您的单元测试中发生了崩溃而产品中没有崩溃,那么我建议您依靠assertion guards来防止取消引用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());
}
};
答案 1 :(得分:2)
很抱歉这样说,但您之前收到的答案是荒谬的。 cppunit在这方面确实缺乏。 cppunit应该实现一个EXIT_ON_FAIL宏,它允许你在windows中捕获访问冲突(使用SetUnhandledExceptionFilter),然后你可以进行任何清理并允许cpp-unit通过EXIT_ON_FAIL报告失败。然后在报告后退出应用程序。
答案 2 :(得分:1)
在C / C ++中,从错误中恢复的最佳方法是在单独的进程中运行每个测试,然后从父进程监视它们。这在UNIX中非常简单 - 在测试开始之前只需fork()。 check支持这一点,你可能会修补CPPUnit以避免这种行为。
答案 3 :(得分:1)
作为对以后仔细阅读此问题的任何人的补充说明,我发现UnitTest++可以在测试中捕获异常,并且只是使用适当的信息而不是导致流程退出而无法通过测试。
答案 4 :(得分:0)
我没有尝试过,但如果在Windows中,我猜使用SEH会有所帮助:
__try
{
// running your case
}
__except
{
}
将其集成到CppUnit框架中,每次收到未知异常时,请将案例标记为失败。