jpo*_*poh 7 tdd refactoring methodology unit-testing
我试图了解TDD方法并且遇到 - 我认为是 - 鸡和鸡蛋问题:如果修复错误涉及更改方法的签名该怎么办.
请考虑以下方法签名:
string RemoveTokenFromString (string delimited, string token)
Run Code Online (Sandbox Code Playgroud)
顾名思义,此方法将删除token
from的所有实例delimited
并返回结果字符串.
我后来发现这个方法有一个bug(例如,从字符串中删除了错误的位).因此,我编写了一个测试用例,描述了发生错误的场景,并确保测试失败.
修复bug时,我发现该方法需要更多信息才能正常工作 - 这些信息只能作为参数发送(被测方法是静态类的一部分).
那我该怎么办?如果我修复了这个bug,这迫使我改变单元测试 - 这是'正确的'TDD方法吗?
你已陷入TDD中最危险的陷阱:你认为TDD是关于测试的,但事实并非如此.但是,由于TDD中的所有术语都与测试有关,因此很容易陷入该陷阱.这就是BDD被发明的原因:它本质上是TDD,但没有令人困惑的术语.
在TDD中,测试不是真正的测试,它们就是例子.断言并不是真正的断言,它们是期望.而且你不是在处理单位,而是处理行为.BDD只是称他们为.(注意:BDD自最初发明以来已经发展,现在它包含了不属于TDD的东西,但最初的意图只是"很多人做TDD错误,所以用不同的词来帮助他们做正确的事". )
无论如何,如果你认为一个测试不是一个测试,而是一个关于该方法应该如何工作的行为示例,那么很明显,当你对预期行为有了更好的理解时,删除或改变测试不仅仅是允许的TDD,它是唯一正确的选择!始终牢记这一点!
当您发现设备的预期行为发生变化时,对您的测试进行轰炸绝对没有错.
//Up front
[Test]
public void should_remove_correct_token_from_string()
{
var text = "do.it.correctly..";
var expected = "doitcorrectly";
Assert.AreEqual(StaticClass.RemoveTokenFromString(text, "."), expected);
}
//After finding that it doesn't do the right thing
//Delete the old test and *design* a new function that
//Does what you want through a new test
//Remember TDD is about design, not testing!
[Test]
public void should_remove_correct_token_from_string()
{
var text = "do.it.correctly..";
var expected = "doitcorrectly";
Assert.AreEqual(
StaticClass.RemoveTokenFromString(
text,
".",
System.Text.Encoding.UTF8), expected);
}
//This will force you to add a new parameter to your function
//Obviously now, there are edge cases to deal with your new parameter etc.
//So more test are required to further design your new function
Run Code Online (Sandbox Code Playgroud)