编写单元测试的好方法

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (15)

假设你有一个处理数学计算的类。

class Vector3
{
public:  // Yes, public.
  float x,y,z ;
  // ... ctors ...
} ;

Vector3 operator+( const Vector3& a, const Vector3 &b )
{
  return Vector3( a.x + b.y /* oops!! hence the need for unit testing.. */,
                  a.y + b.y,
                  a.z + b.z ) ;
}

我可以想出两种方法来对向量类进行单元测试:

1)用手解决一些问题,然后将数字硬编码到单元测试中,只有在等于手和硬编码结果的情况下才能通过。

bool UnitTest_ClassVector3_operatorPlus()
{
  Vector3 a( 2, 3, 4 ) ;
  Vector3 b( 5, 6, 7 ) ;

  Vector3 result = a + b ;

  // "expected" is computed outside of computer, and
  // hard coded here.  For more complicated operations like
  // arbitrary axis rotation this takes a bit of paperwork,
  // but only the final result will ever be entered here.
  Vector3 expected( 7, 9, 11 ) ;

  if( result.isNear( expected ) )
    return PASS ;
  else
    return FAIL ;
}

2)在单元测试中仔细重写计算代码。

bool UnitTest_ClassVector3_operatorPlus()
{
  Vector3 a( 2, 3, 4 ) ;
  Vector3 b( 5, 6, 7 ) ;

  Vector3 result = a + b ;

  // "expected" is computed HERE.  This
  // means all you've done is coded the
  // same thing twice, hopefully not having
  // repeated the same mistake again
  Vector3 expected( 2 + 5, 6 + 3, 4 + 7 ) ;

  if( result.isNear( expected ) )
    return PASS ;
  else
    return FAIL ;
}
提问于
用户回答回答于

方法1是普遍接受的进行单元测试的方法。通过重写代码,可以将错误代码重写到测试中。很多时候,每个测试方法只需要一个真正的测试用例,所以并不太费时。

用户回答回答于

它总是取决于用例。我总是会选择那个版本,这使得测试的想法更加明显。因此,我也不会使用isNear方法。我会检查一下

expected.x == 7;
expected.y == 9;
expected.z == 11;

使用一个好的xUnit库,将得到一个干净的错误消息,其中的预期组件是错误的。在您的示例中,必须搜索错误的真正来源。

扫码关注云+社区