使用C#和RhinoMocks的测试驱动开发的最佳实践

为了帮助我的团队编写可测试的代码,我想出了这个简单的最佳实践列表,使我们的C#代码库更易于测试。 (有些点指的是犀牛Mocks的限制,一个嘲笑框架的C#,但规则也可能应用更广泛。)有谁有任何最佳做法,他们遵循?

要最大化代码的可测试性,请遵循以下规则:

>首先编写测试,然后编写代码。原因:这确保您编写可测试的代码,并且每行代码都为其编写测试。
>使用依赖注入设计类。原因:你不能模仿或测试什么不能看到。
>使用Model-View-Controller或Model-View-Presenter将UI代码与其行为分离。原因:允许在不能测试的部件(UI)最小化的情况下测试业务逻辑。
>不要编写静态方法或类。原因:静态方法很难或不可能隔离,Rhino Mocks无法模拟它们。
>程序关闭接口,而不是类。原因:使用接口阐明对象之间的关系。接口应该定义对象从其环境中需要的服务。此外,接口可以很容易嘲笑使用Rhino Mocks和其他嘲笑框架。
>隔离外部依赖关系。原因:无法测试未解析的外部依赖项。
>标记为虚拟你打算模拟的方法。原因:Rhino Mocks无法模拟非虚拟方法。

绝对是一个好的列表。这里有几个想法:

Write the test first, then the code.

我同意,在高水平。但是,我会更具体:“先写一个测试,然后写足够的代码来通过测试,并重复。否则,我恐怕我的单元测试看起来更像集成或验收测试。

Design classes using dependency injection.

同意。当一个对象创建自己的依赖项时,您无法控制它们。控制/依赖注入反转为您提供控制,允许您使用mocks / stubs / etc隔离被测对象。这是如何孤立地测试对象。

Separate UI code from its behavior using Model-View-Controller or Model-View-Presenter.

同意。注意,即使演示者/控制器可以使用DI / IoC,通过处理stubbed / mocked视图和模型来测试。查看Presenter First TDD更多。

Do not write static methods or classes.

不确定我同意这一个。可以单独测试静态方法/类,而不使用模拟。所以,也许这是你提到的那些犀牛Mock具体规则之一。

Program off interfaces, not classes.

我同意,但原因略有不同。接口为软件开发人员提供了大量的灵活性 – 除了支持各种模拟对象框架。例如,不能在没有接口的情况下正确地支持DI。

Isolate external dependencies.

同意。使用接口隐藏您自己的外观或适配器后面的外部依赖项(如适用)。这将允许您将软件与外部依赖关系隔离,无论是Web服务,队列,数据库还是其他内容。当你的团队不控制依赖性(a.k.a. external)时,这一点尤其重要。

Mark as virtual the methods you intend to mock.

这是犀牛Mocks的限制。在一个喜欢在模拟对象框架上手工编码存根的环境中,这不是必需的。

并且,需要考虑几个新的要点:

使用创意设计模式。这将有助于DI,但它也允许您隔离该代码并独立于其他逻辑进行测试。

使用Bill Wake’s Arrange/Act/Assert technique编写测试。此技术使得非常清楚需要什么配置,实际正在测试什么和期望什么。

不要害怕卷自己的嘲笑/存根。通常,你会发现使用模拟对象框架使你的测试难以想象的阅读。通过滚动自己的,你可以完全控制你的模拟/存根,你将能够保持你的测试可读性。 (参考上一点。)

避免将你的单元测试中的重复重构为抽象基类或者设置/拆卸方法的诱惑。这样做隐藏了配置/清理代码从开发人员尝试grok单元测试。在这种情况下,每个单独测试的清晰度比重构复制更重要。

实施持续集成。在每个“绿色栏”上签入您的代码。构建您的软件,并在每次入住时运行您的全套单元测试。 (当然,这不是编码实践本身;但它是一个令人难以置信的工具,保持您的软件清洁和完全集成。)

http://stackoverflow.com/questions/124210/best-practices-of-test-driven-development-using-c-sharp-and-rhinomocks

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:使用C#和RhinoMocks的测试驱动开发的最佳实践