我用TDD算法练习

1 c# tdd unit-testing

您好,我是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)

我在编写测试时是否就在这里?如果采取的方法是正确的,请告诉我.任何关于这件事的指针都会很棒!!

sar*_*ara 5

这不是你所说的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上有很多关于此的视频,以及书籍和博客.去看看吧!

最后但同样重要的是,当我们的测试通过时,确保"清理"代码也很重要.使代码以最简单的方式传递通常会导致一些丑陋的重复等等.当测试通过时,我们可以重构这一点,同时保持对我们的代码仍然坚持我们所做的断言的信心.重构时不要添加更多功能,因为那时功能不是首先编写测试,这是努力的重点.