如何将“完整堆栈”功能分解为验收,集成和单元测试?

时间:2012-12-31 09:43:37

标签: unit-testing tdd bdd watin mspec

我是行为驱动开发的新手,我正在努力学习它。我正在使用MSpec&使用ASP.Net MVC 4进行验收测试和MSpec进行单元测试。我有一个简单的用户注册方案。

  

当用户输入用户名,密码,电子邮件等并点击注册按钮时   它应验证电子邮件地址
  它应检查用户名是否已存在   它应该注册用户
  它应该发送欢迎电子邮件
  它应该重定向到主页

我想测试的东西无法使用Watin测试,例如发送电子邮件,检查用户是否存在等等。这些将是控制器测试的一部分。这是否意味着我的验收测试只会是当用户注册时他应该被重定向到主页?如何将整个过程分解为测试?

如果这些检查是在各种测试和不同级别实施的,那么如何获得MSpec提供的已实现所有功能的摘要报告?关于人们如何打破这些任务,然后他们如何获得集体报告等,我感到有点困惑。

2 个答案:

答案 0 :(得分:3)

首先从验收测试开始以推动您的开发(外部)。 您需要编写以下方案:

用户尝试使用无效的电子邮件注册

这很容易

用户尝试使用现有的登录名

进行注册

对于这个,您需要能够将应用程序插入内存存储库(我建议使用 IoC容器来轻松配置您的应用程序)。这样,您首先使用您的应用程序注册“Bob”用户,看看当您尝试再次使用该登录进行注册时会发生什么。所以基本上解决方案是使用存储库模式,并且具有内存实现而不是真正的数据库实现。 我假设您的数据库不包含任何业务逻辑,否则使用真实数据库会更安全,这样您就可以在数据库中执行业务规则。这在遗留系统中很常见。 内存存储库的优点是您的测试运行速度更快,您不需要编写复杂的拆卸代码。使用真正的数据库,您需要确保在每次测试之间清理数据库以确保测试独立性,并且使用数据库运行测试要慢得多。

用户成功注册

对于这个,你需要检查重定向,这很容易。对于电子邮件部分agian,您需要使用适配器模式将应用程序插入存根。您可以像内存队列中的一样实现存根,这样您就可以断言应用程序是否正确发送了电子邮件。

关于单元测试

如果您打算自行编写电子邮件语法验证,我建议您自行单独测试该部分。

奥古斯托提到,Growing Object-Oriented Software, Guided by Tests是学习ATDD和TDD的好书。

总体战略是始终从高级验收测试开始,以推动您的开发。模拟您无法在内存中运行的外部服务或您无法在本地安装或不易测试的服务。有意义时使用TDD进行单元测试。

答案 1 :(得分:2)

您的单元测试将包含以下内容:

  • 如果未给出用户名,请测试注册用户的代码是否会引发异常。
  • 测试验证密码的代码是否有效。

基本上采用小单位代码并对其进行测试。

对于验收测试,您将其提升到新的水平并集成这些功能以确保它们正常工作。因此,您可以进行验收测试,以检查整个注册功能:

Given I am a new user
When I complete the register user form
Then I will be redirected to the home page

Given I am a new user
When I complete the register user form
And I have not entered a valid password
Then I will be shown an error message

或该地区的某些事情。

就个人而言,我不是编写测试用户界面的测试的忠实粉丝,因为UI可以经常更改(意味着你必须修复被这些更改破坏的测试);加上我觉得我通过编写单元测试然后进行验收测试来重复工作。

然而,ATDD可以使您受益,因为您可以与他们沟通您如何测试应用程序。向他们展示BDD测试(写入文本)而不是public void ValidatePassword_PasswordNotValid_ExpectFalse更容易。

这是您需要尝试ATDD以了解您是否会从中受益的情况之一。