我在测试函数中使用了多个断言,但是当(例如)第一个断言失败时,其余的断言不再执行。有没有办法用 CppUnit 做出断言(CPPUNIT_ASSERT),在失败后不会离开测试函数?例如非中止断言。
我发现了这个:http ://cppunit.sourceforge.net/cppunit2/doc/但是库中没有实现“CHECK”。
关于单元测试有两种思想流派。一是单元测试应该只测试一件事,如果你想测试两件事,你应该有两个测试。优点是完全消除了你上面描述的问题,而缺点是需要额外几秒钟来编写额外的测试。另一个想法是测试可以测试多个东西,失败的测试很少见,并且可以被开发人员识别并修复。优点是复杂的设置只需要进行一次,当然缺点是它在第一次失败时停止测试,隐藏了问题的真实数量和身份。
我的方法是务实。如果您可以摆脱多个断言,并且仍然可以通过一次测试开发和轻松测试多个属性,那就去做——但要为失败做好准备,如果您陷入您所描述的情况,请快速将测试重构为多个测试并不要浪费时间在一项测试中挣扎。测试的总数绝对不是一个因素。适当的测试数量是您彻底评估代码所需的数量。
使用如下定义的 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.
请参阅上述 <> 中的上述数字。左侧是断言失败的行号,右侧是失败计数。