白盒测试中,如果原程序中没有用到ASSERT被测试函数:C/C++ codeMatrix3x3:: Vertex3d GetRowVector(int nRo
白盒测试中,如果原程序中没有用到ASSERT
被测试函数:
C/C++ codeMatrix3x3:: Vertex3d GetRowVector(int nRow) const{ return Vertex3d((*this)[nRow][0],(*this)[nRow][1],(*this)[nRow][2]);}
原程序中没有对参数范围进行限定,比如进行ASSERT(nRow < m_iDimM && nRow > -1);如果输入的nRow大于3或者小于0的时候,程序应该要报错才对的.
这样的话,我在测试用例中该怎么写才可以得到这个错误呢?
谢谢指点,刚学测试..
[解决办法]白盒不熟悉, 粗浅说几句
1.记得C++的assert要求在定义了_DEBUG_符号后才起用
2.如果这个函数的design就应该不大于3或小于0, 而代码中没有体现出来, 就应该是错误的了
3.具体如何捕获, 我觉得Vertex3d类对[]操作符的重载责任应该不会太大. 考虑这种底层类的设计, 如果在如此底层的类中添加过多判断代码, 甚至启用异常机制, 无疑会损失性能和内存. 对这个GetRowVector的调用参数的范围个人感觉程序员的责任或高层类的责任比较大, 或许你应该采用走读的方式来检查这些底层结构, 然后再高层结构上在想办法进行判断或捕获.
[解决办法]ASSERT_THROWS(GetRowVector(-1), ASSERT_ERROR)
确保非法调用会抛ASSERT_ERROR异常。
ASSERT_ERROR是ASSERT()抛的异常.
ASSERT_THROWS()是一般测试框架都有的测试方法.
[解决办法] 2 楼的说法问题很大.
1)在哪里追求性能,在哪里追求无错误?
release版本中追求性能,而在debug版本中则追求无错误或者说防止错误。ASSERT只在debug版本中才执行,所以这段代码没有assert基本可以归结为垃圾代码。这与性能无关。
2)认为加上ASSERT而影响release版本性能只是一种谬论,除非你直接把debug版本发布给客户才有性能的影响。