非中止断言 CppUnit

Non aborting assertion CppUnit

本文关键字:CppUnit 断言      更新时间:2023-10-16

我在测试函数中使用了多个断言,但是当(例如)第一个断言失败时,其余断言不再执行。有没有办法使用 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.

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