我正在研究TDD,我读到它还可以帮助您定义应用程序的设计,对吗?
因此,我决定开始创建一个新项目,以帮助我更好地理解它。
我想创建一个简单的用户注册系统,询问其名称,电子邮件地址,国家(从列表中选择一个)和电话号码。
所以问题是...
我在VS 2010中创建了一个新的解决方案,添加了一个新的Test项目,但我只是不知道编写什么测试!
由于它将帮助我定义设计,因此我可以在此处编写哪些测试?
谢谢你的帮助!
我正在研究TDD,我读到它还可以帮助您定义应用程序的设计,对吗?
因此,我决定开始创建一个新项目,以帮助我更好地理解它。
我想创建一个简单的用户注册系统,询问其名称,电子邮件地址,国家(从列表中选择一个)和电话号码。
所以问题是...
我在VS 2010中创建了一个新的解决方案,添加了一个新的Test项目,但我只是不知道编写什么测试!
由于它将帮助我定义设计,因此我可以在此处编写哪些测试?
谢谢你的帮助!
Answers:
在编写单元测试时,您正在测试应用程序的行为,因此要问的重要问题是您的应用程序做什么?这是一个开始:
[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()
{
}
}
只是创建一个测试项目并编写一些测试方法是一种TDD,但是根据我的经验,除非您使用的库中存在已知的API并且方法调用直接对应于用户期望的内容,否则它并没有多大帮助。您需要提出正确的测试列表,对于非平凡的应用程序,这确实很难做到。
我建议尝试SpecFlow-它使定义的测试与实现保持良好的分离,并且功能文件的结构迫使您考虑实际要进行的测试。
定义功能时,您只需编写如下内容
When a user is saved
Then the user should exist
由于您目前不在代码文件中,因此您不打算考虑实现细节,例如调用哪种方法来创建用户或什至实现它的类。您可以使用标签选择不同的实现,因此,在此级别上,“保存用户”是否意味着调用CreateUser或打开浏览器并提交表单都没有关系。
定义功能后,将生成所有测试,并且将在您实现步骤定义和要测试的实际应用程序代码时开始通过。
对于简单的应用程序,您可以仅创建功能文件,但是对于任何更复杂的应用程序,事先编写更完整的规范很有用。为此,我使用了iPad思维导图应用程序,但是您可以使用最喜欢的任何工具。
首先列出一系列高级功能,例如“用户注册”。它们往往太宽泛而无法直接编写测试,因此将它们划分为可以明确定义的子功能,并且通常映射到特定的用户操作,例如“保存用户”或“查看现有用户”。
这些子功能中的每一个都需要一个场景列表,这些场景一起可以完全定义该功能是否正常运行,例如“可以保存有效用户”和“不能使用重复的用户名保存用户”之类的内容。
建立此列表时,通常会很清楚需要调整结构的位置-如果您无法针对某项功能进行任何场景测试,或者最终无法完成一项功能,那么该功能可能定义为错误的级别,需要拆分或更改。
我发现将我的第一个实验备份到TDD并阅读和切割代码是很好的。有关该主题的Wikipedia文章非常好,它将为您带来各种其他资源。尤其要寻找肯特·贝克(Kent Beck)的东西-TDD之父。
可能会帮助您快速发展的另一件事是做一些katas-简单,几乎没有头脑的培训练习。Roy Osherove有一些不错的选择。
除此之外,请牢记TDD的关键思想-一次编写一个测试,直到所有之前的测试都通过后再继续进行。只写足够的代码来满足当前的测试,避免写更多的诱惑。在进行过程中,不停地停下来,考虑是否可以清理代码或测试。始终以红色(失败测试),绿色(通过测试),重构周期进行开发。
为了让您起步,也许从您的姓名要求开始。您需要什么?
您可能需要上一堂课。为此编写一个测试(有些人跳过此步骤,但刚开始练习时要这样做)并编写课程。
接下来,您的课程将需要存储一个名称。编写测试证明您的班级确实可以。然后再次编写代码以使测试通过。
然后,也许您还有其他业务规则。也许您希望您的名字至少包含几个字符。编写测试,查看失败,编写代码。
等等...
我认为不可能用一个简短的答案给您TDD的想法。您需要“看到”某人练习它,以得到它的感觉。我找到的关于该主题的最佳资源是http://pragprog.com/titles/achbd/the-rspec-book。在您告诉我之前,Ruby不是您的语言:请阅读Bob叔叔的前言!;-)