Unit testing 通过设计考虑简化测试,同时利用依赖注入

Unit testing 通过设计考虑简化测试,同时利用依赖注入,unit-testing,dependency-injection,mocking,Unit Testing,Dependency Injection,Mocking,我们进入了一个绿色领域项目,对我们产品的逻辑和业务层进行返工,这需要几个月的时间。通过使用MEF(依赖项注入),我们实现了高水平的代码覆盖率,我相信我们有一个非常可靠的产品。由于我们一直在研究一些更复杂的逻辑,我发现单元测试越来越困难 我们正在利用CompositionContainer查询这些复杂算法所需的类型。我的单元测试有时很难遵循,因为必须进行冗长的模拟对象设置过程,以允许对某些情况进行验证。我的单元测试通常比我试图测试的代码花费更长的时间来编写 我意识到这不仅是依赖注入的问题,也是整个

我们进入了一个绿色领域项目,对我们产品的逻辑和业务层进行返工,这需要几个月的时间。通过使用MEF(依赖项注入),我们实现了高水平的代码覆盖率,我相信我们有一个非常可靠的产品。由于我们一直在研究一些更复杂的逻辑,我发现单元测试越来越困难

我们正在利用CompositionContainer查询这些复杂算法所需的类型。我的单元测试有时很难遵循,因为必须进行冗长的模拟对象设置过程,以允许对某些情况进行验证。我的单元测试通常比我试图测试的代码花费更长的时间来编写


我意识到这不仅是依赖注入的问题,也是整个设计的问题。我的测试过于复杂,是因为糟糕的方法设计还是缺少组合?我已经尝试过基本分类测试,创建常用的模拟对象,并确保尽可能多地利用容器来缓解这个问题,但我的测试总是非常复杂,并且很难调试。您看到了哪些技巧可以使这些测试简洁、易读、有效?

我的主观观点:

  • MEF看起来是一个非常好的插件框架;它不是设计成一个成熟的DI框架。如果您不需要活动的可交换组件,请进行调查。这是微软的选择
  • 确保你不是在做这件事。尽可能使用接口的构造函数注入。看看这个,然后。您关于“尽可能多地使用容器”的声明令人担忧,因为很少有类需要知道有关容器的任何内容
  • 获得一个非常好的模拟/隔离框架,并学习如何很好地使用它。我爱。尽可能在被测系统上进行状态验证,而不是在模拟系统上进行行为验证
  • 阅读。阅读其他关于单元测试的书籍和文章。实践继续学习
  • 阅读并确保你的课程遵循原则(尤其是原则)。冗长的模拟设置是一种代码气味;你的课可能做得太多了。高代码覆盖率很好,但更好的指标可能是
  • 不要担心单元测试的编写时间比生产代码的编写时间要长。不过,要像对待生产代码一样对待测试,只要能够保持可读性和可维护性,就要消除重复

    • 我的主观观点:

      • MEF看起来是一个非常好的插件框架;它不是设计成一个成熟的DI框架。如果您不需要活动的可交换组件,请进行调查。这是微软的选择
      • 确保你不是在做这件事。尽可能使用接口的构造函数注入。看看这个,然后。您关于“尽可能多地使用容器”的声明令人担忧,因为很少有类需要知道有关容器的任何内容
      • 获得一个非常好的模拟/隔离框架,并学习如何很好地使用它。我爱。尽可能在被测系统上进行状态验证,而不是在模拟系统上进行行为验证
      • 阅读。阅读其他关于单元测试的书籍和文章。实践继续学习
      • 阅读并确保你的课程遵循原则(尤其是原则)。冗长的模拟设置是一种代码气味;你的课可能做得太多了。高代码覆盖率很好,但更好的指标可能是
      • 不要担心单元测试的编写时间比生产代码的编写时间要长。不过,要像对待生产代码一样对待测试,只要能够保持可读性和可维护性,就要消除重复

      以下是一些关于DI和良好设计实践(在编写可测试代码方面)的好链接,您可能需要查看(谷歌技术讲座):


      我发现他们提供了很多关于可测试设计的好技巧,非常有帮助。

      这里有一些关于DI和良好设计实践(在编写可测试代码方面)的好链接,您可能想查看一下(谷歌技术讲座):


      我发现他们提供了很多关于可测试设计的好技巧,非常有帮助。

      你提出了很多好的观点。在阅读了关于ServiceLocator反模式的文章后,我强烈地感觉到这正是我们正在做的事情,我们正在经历的一些问题部分应归咎于此。我创建了这么多类只是为了让代码“感觉”更干净。我想我们可能已经对MEF开了枪,反过来,也可能会被它卡住。我将不得不考虑我们如何能够重新设计对它的如此大的依赖。Moq是我选择的模拟框架,我非常喜欢它。我觉得在不久的将来会有一次大的重构…@Adam-谢谢!至少您有支持重构的测试!:)我一遍又一遍地读这篇文章,听起来很霸道;我为此道歉。听起来你走对了,不用担心。我不认为这是高压手段。干杯+100对于服务定位器反模式,它完全可以为您带来许多优点。在阅读了关于ServiceLocator反模式的文章后,我强烈地感觉到这正是我们正在做的事情,我们正在经历的一些问题部分应归咎于此。我创建了这么多类只是为了让代码“感觉”更干净。我想我们可能已经对MEF开了枪,反过来,也可能会被它卡住。我将不得不考虑我们如何能够重新设计对它的如此大的依赖。Moq是我选择的模拟框架,我非常喜欢它。我觉得在不久的将来会有一次大的重构…@Adam-谢谢!至少您有支持重构的测试!:)我一遍又一遍地读这篇文章,听起来很霸道;我为此道歉。听起来你是对的