您好,我是c#中TDD风格编程的新手,我为实现这一目标而苦苦挣扎.如果我以正确的方式做这件事,请你告诉我.我已经学习了很多教程,但没有成功.我得到了它的理论方面但是当它实际上把它放在我总是失败时.
我有这个存储库来练习tdd https://github.com/dev-test-tdd/AlgorithmPractice/.我已经开始从头开始编写所有算法来理解tdd.例如,我有这个简单的方法来检查给定的字符串是否是回文.
这是我的测试
[Test]
public void IsPalindrome3Test()
{
var sourceString = "civic";
var result = Program.IsPalindrome3(sourceString);
Assert.AreEqual(true, result);
}
Run Code Online (Sandbox Code Playgroud)
和功能
public static bool IsPalindrome3(string source)
{
int min = 0;
int max = source.Length - 1;
while(true)
{
if(min > max)
{
return true;
}
char a = source[min];
char b = source[max];
if(char.ToLower(a)!= char.ToLower(b))
{
return false;
}
min++;
max--;
}
}
Run Code Online (Sandbox Code Playgroud)
我在编写测试时是否就在这里?如果采取的方法是正确的,请告诉我.任何关于这件事的指针都会很棒!!
这不是你所说的TDD.这只是一个单元测试.TDD特指在代码之前编写测试的过程.你从一个最简单的案例开始,看到测试失败,让它以最简单的方式传递,然后通过编写更多测试来强加一些新的假设.关键是,随着您的测试变得更加具体并涵盖更多边缘情况,代码变得更加通用.
有很多方法可以做到这一点,人们更喜欢不同级别的粒度.一个版本将是这样的:
// Single character is always a palindrome
Assert.True(IsPalindrome("a"));
Run Code Online (Sandbox Code Playgroud)
这将促使我们编写最简单的代码来进行此传递
bool IsPalindrome(string input)
{
return true;
}
Run Code Online (Sandbox Code Playgroud)
但这段代码并不"正确"(虽然它对我们目前正在测试的所有内容都是正确的).我们需要更多测试!
// Two non-equal characters are not a palindrome
Assert.False(IsPalindrome("ab"));
Run Code Online (Sandbox Code Playgroud)
导致
bool IsPalindrome(string input)
{
return input.Length == 1;
}
Run Code Online (Sandbox Code Playgroud)
等等.逐步完成实现完整算法的整个过程需要太长时间才能得到SO答案,我只想表明它是一个具有短反馈循环的过程,你不断对代码应该如何工作强加更强大的断言,然后你让算法成长.youtube上有很多关于此的视频,以及书籍和博客.去看看吧!
最后但同样重要的是,当我们的测试通过时,确保"清理"代码也很重要.使代码以最简单的方式传递通常会导致一些丑陋的重复等等.当测试通过时,我们可以重构这一点,同时保持对我们的代码仍然坚持我们所做的断言的信心.重构时不要添加更多功能,因为那时功能不是首先编写测试,这是努力的重点.
| 归档时间: |
|
| 查看次数: |
110 次 |
| 最近记录: |