使用TDD启动新项目


10

我正在研究TDD,我读到它还可以帮助您定义应用程序的设计,对吗?

因此,我决定开始创建一个新项目,以帮助我更好地理解它。

我想创建一个简单的用户注册系统,询问其名称,电子邮件地址,国家(从列表中选择一个)和电话号码。

所以问题是...

我在VS 2010中创建了一个新的解决方案,添加了一个新的Test项目,但我只是不知道编写什么测试!

由于它将帮助我定义设计,因此我可以在此处编写哪些测试?

谢谢你的帮助!

c#  .net  tdd 

1
它会以首先要考虑的模式,将要编写的类等方式为您提供帮助。-首先定义一个类并编写方法的测试用例,然后开始实现这些方法根据他们的测试用例..
Halfdan

Answers:


6

在编写单元测试时,您正在测试应用程序的行为,因此要问的重要问题是您的应用程序做什么?这是一个开始:

[TestFixture]
public class RegistrationTests
{
    [Test]
    public void Should_save_new_user_info()
    {
    }

    [Test]
    public void Should_throw_validation_exception_when_email_already_exists()
    {
    }

    [Test]
    public void Should_format_phone_number_when_country_code_is_us()
    {
    }
}

好了,所有这些测试都已经通过了,接下来该怎么办?:)
Scott Whitlock

2

只是创建一个测试项目并编写一些测试方法是一种TDD,但是根据我的经验,除非您使用的库中存在已知的API并且方法调用直接对应于用户期望的内容,否则它并没有多大帮助。您需要提出正确的测试列表,对于非平凡的应用程序,这确实很难做到。

我建议尝试SpecFlow-它使定义的测试与实现保持良好的分离,并且功能文件的结构迫使您考虑实际要进行的测试。

定义功能时,您只需编写如下内容

When a user is saved
Then the user should exist

由于您目前不在代码文件中,因此您不打算考虑实现细节,例如调用哪种方法来创建用户或什至实现它的类。您可以使用标签选择不同的实现,因此,在此级别上,“保存用户”是否意味着调用CreateUser或打开浏览器并提交表单都没有关系。

定义功能后,将生成所有测试,并且将在您实现步骤定义和要测试的实际应用程序代码时开始通过。

对于简单的应用程序,您可以仅创建功能文件,但是对于任何更复杂的应用程序,事先编写更完整的规范很有用。为此,我使用了iPad思维导图应用程序,但是您可以使用最喜欢的任何工具。

首先列出一系列高级功能,例如“用户注册”。它们往往太宽泛而无法直接编写测试,因此将它们划分为可以明确定义的子功能,并且通常映射到特定的用户操作,例如“保存用户”或“查看现有用户”。

这些子功能中的每一个都需要一个场景列表,这些场景一起可以完全定义该功能是否正常运行,例如“可以保存有效用户”和“不能使用重复的用户名保存用户”之类的内容。

建立此列表时,通常会很清楚需要调整结构的位置-如果您无法针对某项功能进行任何场景测试,或者最终无法完成一项功能,那么该功能可能定义为错误的级别,需要拆分或更改。


2

我发现将我的第一个实验备份到TDD并阅读和切割代码是很好的。有关该主题的Wikipedia文章非常好,它将为您带来各种其他资源。尤其要寻找肯特·贝克(Kent Beck)的东西-TDD之父。

可能会帮助您快速发展的另一件事是做一些katas-简单,几乎没有头脑的培训练习。Roy Osherove有一些不错的选择。

除此之外,请牢记TDD的关键思想-一次编写一个测试,直到所有之前的测试都通过后再继续进行。只写足够的代码来满足当前的测试,避免写更多的诱惑。在进行过程中,不停地停下来,考虑是否可以清理代码或测试。始终以红色(失败测试),绿色(通过测试),重构周期进行开发。

为了让您起步,也许从您的姓名要求开始。您需要什么?

您可能需要上一堂课。为此编写一个测试(有些人跳过此步骤,但刚开始练习时要这样做)并编写课程。

接下来,您的课程将需要存储一个名称。编写测试证明您的班级确实可以。然后再次编写代码以使测试通过。

然后,也许您还有其他业务规则。也许您希望您的名字至少包含几个字符。编写测试,查看失败,编写代码。

等等...



0

您可能需要设置一个测试,尝试将多个不同的值添加到电子邮件字段中,其中一些有效,而其他则无效。在所有测试都给出期望值之前,不要停止开发。类似的东西。


0

正如您描述的系统,在应用程序级别只有一项测试:

[测试] public void Save_and_retrieve_user(字符串名称,字符串电子邮件,...){//保存//检索//验证}

在完善需求时,添加更多测试。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.