2

我在测试函数中使用了多个断言,但是当(例如)第一个断言失败时,其余的断言不再执行。有没有办法用 CppUnit 做出断言(CPPUNIT_ASSERT),在失败后不会离开测试函数?例如非中止断言。

我发现了这个:http ://cppunit.sourceforge.net/cppunit2/doc/但是库中没有实现“CHECK”。

4

2 回答 2

2

关于单元测试有两种思想流派。一是单元测试应该只测试一件事,如果你想测试两件事,你应该有两个测试。优点是完全消除了你上面描述的问题,而缺点是需要额外几秒钟来编写额外的测试。另一个想法是测试可以测试多个东西,失败的测试很少见,并且可以被开发人员识别并修复。优点是复杂的设置只需要进行一次,当然缺点是它在第一次失败时停止测试,隐藏了问题的真实数量和身份。

我的方法是务实。如果您可以摆脱多个断言,并且仍然可以通过一次测试开发和轻松测试多个属性,那就去做——但要为失败做好准备,如果您陷入您所描述的情况,请快速将测试重构为多个测试并不要浪费时间在一项测试中挣扎。测试的总数绝对不是一个因素。适当的测试数量是您彻底评估代码所需的数量。

于 2013-10-27T02:29:32.943 回答
0

使用如下定义的 CPPUNIT_VFY(cond) 而不是使用 CPPUNIT_ASSERT(cond):

#define CPPUNIT_VFY(cond) {\
    try { \
        CPPUNIT_ASSERT(cond); \
    } catch(std::exception& e) { \
        std::cerr << ">>>> EXCEPTION:<" << __LINE__ << ":" << ++xcount << "> " << e.what() << std::endl; \
    } }

您需要在 CppUnit 派生的测试类中声明 xcount 并在 setup() 方法中对其进行初始化。这将打印增加的失败计数。上面的宏将打印所有断言而不在第一次失败时退出,例如

>>>> EXCEPTION:<140:1> assertion failed
- Expression <whatever>  
>>>> EXCEPTION:<163:2> assertion failed
- Expression <whatever>
etc.

请参阅上述 <> 中的上述数字。左侧是断言失败的行号,右侧是失败计数。

于 2019-07-12T22:58:14.387 回答