.net - 如何设计可测试性代码

标签 .net unit-testing testing tdd

我一直在考虑在我 future 创建的任何项目中使用 TDD 并实现适当的测试(才刚刚开始了解它让你的生活变得多么美好)。因此,在过去的几天里,我一直在 SO 上四处游荡,试图了解如何设计可测试性的应用程序,但我似乎仍在为某些想法而苦苦挣扎。

我读过很多书,你应该针对接口(interface)而不是编程。我遇到的主要问题是,您应该创建多少个接口(interface)?您是否应该为所有要测试的东西准备一个?还是我读错了?

另一件事是使用大量的依赖注入(inject),所以你可以模拟你正在注入(inject)的部分而不是使用真实的东西。它是否正确?还是我也离开这里了?

最佳答案

我认为你的想法是正确的,但我认为你正在把它变成比实际更大的交易。如果你开始做 TDD,你的第一 react 可能是“就是这样吗?”。然后,您应该希望说“啊哈”!

最主要的是您获得 nUnit,学习教程,然后确保在编写实现之前为您所做的一切编写测试。您可能会跳过为属性访问器编写测试,但是任何需要任何计算的东西,您都应该先编写测试。

因此,假设您正在测试计算器的 Add(int 1, int 2),您首先想到的是“我怎样才能破解它”。我认为可能出错的地方是:负数、零和溢出。诀窍是想象将要创建 Add() 方法的人可能犯的每一个错误,然后针对它编写测试。所以,我可能会写:

Assert.AreEqual(5, calc.Add(2, 3), "Adding positives not as expected");
Assert.AreEqual(-5, calc.Add(-2, -3), "Adding negatives not as expected");
Assert.AreEqual(-2, calc.Add(-3, 2), "Adding one positive and one negative not as expected");

// your framework might provide a cleaner way of doing this:
try {
  int result = calc.Add(Int32.Max, 5);
  Assert.Fail("Expected overflow error. Received: " + result);
} catch(Exception e) {
  // This should be a more specific error that I'm not looking up
}

因此,如您所见,我尝试做的是找出 Add() 方法可能无法工作的原因,然后针对它进行测试。我还寻找了有趣的极端情况并明确定义了我期望的行为。然后现在我可以自由地开始编写 Add() 方法。

现在,虽然这不是那么好,但您知道当您开始创建复杂的数学函数时,您的 Add() 方法将是坚如磐石的,这些数学函数将 Sin() 方法与 Sqrt() 方法以及 Add () 方法。

无论好坏,这就是测试驱动开发。现在不要太在意接口(interface)或依赖注入(inject)。如果您需要,可以稍后再提供。

关于.net - 如何设计可测试性代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/316486/

相关文章:

c# - x64 上的文件时间

c# - 如何模拟接受类型参数并返回另一个接口(interface)的接口(interface)

unit-testing - 团队 build : Cannot find generated private accessor

c# - .NET 中的多目标

c# - 如何使用 gstreamer-sharp 捕获视频帧

c# - 是否有将模型转换为 View 模型的快捷方式?

c++ - 条件中的 Switch 语句和 & 号

php - symfony2 phpunit : how to drop and copy database before running tests?

unit-testing - 在 Jenkins 中是否有测试脚本/可执行文件的标准方法?

java - Ruby 是否兼容严格的页面对象模式?