当要测试的类很复杂时,如何编写单元测试?

War*_*tin 4 c++ tdd unit-testing code-coverage cxxtest

我正在尝试使用TDD使用VS 2010在C++中编写步步高游戏.

我已经设置了CxxTest来编写测试用例.

第一堂课是

class Position
{
public:
...
...
bool IsSingleMoveValid(.....)
...
...
}
Run Code Online (Sandbox Code Playgroud)

我想为函数IsSingleMoveValid()编写一个测试,我猜测试应该证明函数正常工作.不幸的是,有很多情况要测试,即使我测试了几个案例,有些可能会逃脱.

你有什么建议?TDD如何处理这些问题?

Tem*_*Rex 8

一些指导原则:

  1. 测试常规病例.在您的问题中:测试您知道的合法移动是否有效.您可以采用简单的方法并且只有少数测试用例,或者您可以编写一个循环,生成应用程序中可能发生的所有可能的合法移动并对其进行全部测试.
  2. 测试边界情况.这不是真正适用于您的问题,但是为了测试f(x)您知道x必须位于某个范围内的表单的简单数字函数[x_min, x_max),您通常也会进行测试f(x_min-1), f(x_min), f(x_max-1), f(x_max).(如果你有一个内部板表示,周围有溢出边缘,它可能与棋盘游戏相关)
  3. 测试已知的错误.如果您遇到了您无法识别的合法移动IsSingleMoveValid(),请将其添加为测试用例,然后修复您的代码.保留这些测试用例以防止将来的回归是有用的(一些未来的代码添加/修改可能会重新引入此错误,测试将捕获它).

测试覆盖率(按测试覆盖的代码行的百分比)是可以通过工具进行计算,如目标的gcov你要怎么彻底测试你的代码,你应该做你自己的成本效益分析.但是对于像游戏程序中的合法移动检测那样重要的东西,我建议你在这里保持警惕.

其他人已经评论过在较小的子测试中分解测试.对此的命名是这样的隔离函数是通过单元测试进行测试的,而高级代码中这些函数之间的协作则是通过集成测试来测试的.