我一直在考虑在我 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/