使c ++代码易于测试的模式

时间:2009-11-05 14:39:41

标签: c++ testing dependency-injection testability

您是否应该设计代码以简化测试?如果是这样,如何设计 c ++ 代码,以便于测试。

  • 如何在c ++中应用依赖注入?
  • 我应该使用纯接口类作为基础来实现类,以简化伪测试对象的创建?
    • 这会迫使我制作很多虚拟方法。这会影响表现吗?
  • 在c ++中设计可测试性时我还应该考虑什么?

4 个答案:

答案 0 :(得分:9)

  

我是否应该使用纯接口类作为基础来实现类,以简化伪测试对象的创建?

     
      
  • 这会迫使我制作很多虚拟方法。这会影响表现吗?
  •   

我经常使用的解决方法是对类进行模板化,而不是将其隐藏在接口后面。然后我可以在测试时传递测试/模拟对象作为模板参数,否则传递真实对象。这样就避免了虚拟功能的性能损失。

修改
好的,一个简单的例子:

使用OOP和接口,您可以编写如下函数:

void Foo(IBar& someBar) { ... }

此函数采用实现IBar接口的参数,并对其执行某些操作。如果要传递虚拟模拟实现,只需编写一个继承自IBar的模拟对象,并将其传递给Foo。简单明了。

但你可以用模板实现同样的目的:

template <typename BarType>
void Foo(BarType& someBar) { ... }

......就是这样。 Foo的主体几乎没有变化。只要传递给函数的类型公开我们需要的所有成员,它就可以工作,而不必正式从接口类继承,并且没有虚函数和运行时多态性的开销。

答案 1 :(得分:4)

不要从一开始就设计太多,然后编写一个测试,然后让它通过,但不能超过它。保持您的职能非常。看看你做了什么,重构它。如果您要撰写评论,最好将有问题的代码放到一个有良好名称的单独函数中。

不要花太多时间考虑模式,这是很多科学和结果很少,只需先编写测试并保持代码简单,然后,令人惊讶的是你不需要为它编写测试,你已经做到了。你的代码也可以。

答案 2 :(得分:3)

最高cohesion和最低coupling

通过测试,这将使您的生活更轻松。

答案 3 :(得分:0)

我认为首要关注的是...

  1. 实现功能
  2. Code Extensiblity
  3. Code Resuablity
  4. 代码可维护性