通过NBehave了解BDD(Behavior Driven Development)

简介:

之前写过一篇介绍BDD的文章(优美的测试代码 - 行为驱动开发(BDD)),很多同学都表示很感兴趣,但感觉过于抽象。因此,本文通过使用NBehave框架,通过非常简单而又具体的例子,加深对BDD的认识。

BDD简介

WikiPedia中的说明:

Behavior Driven Development (or BDD) is an Agile software development technique that encourages collaboration between developers, QA and non-technical or business participants in a software project.

BDD通过故事模板和场景,描述产品在用户操作时的具体功能表现,有点类似传统的Use Case。BDD的故事模板和场景,更加贴近用户的行为,BDD的测试案例,更加注重从用户的角度进行测试。

通常,故事模板类似:

As  a [X] 
I  want [Y] 
so  that [Z]

场景模板类似:

Given  some initial context (the givens), 
When  an event  occurs, 
then  ensure some outcomes.


NBehave简介

NBehave是.NET版本的BDD框架,通过NBehave,能够方便的进行行为驱动开发。NBehave负责将场景模板映射到案例代码,内置NUnit,XUnit,MbTest,或者MSTest等单元测试框架,同时负责执行并生成测试报告。因此,通过NBehave,我们只需要:

  1. 编写场景模板
  2. 编写对应的场景类,映射模板中的具体行为和表现。
  3. 通过NBehave-Console.exe执行案例。或者集成到(MSBuild,NAnt中)


简单实例

比如,我们编写如下场景:

Given  I am not logged in
When  I log in as Morgan with a password SecretPassw0rd
Then  I should see a message ,   " Welcome, Morgan! "

我们把上面的内容保存到一个文件中,命名为:user_logs_in_successfully.feature

接下来,编写对应的场景类:


 
 
复制代码
using  NBehave.Narrator.Framework;
using  NBehave.Spec.NUnit;
[ActionSteps]
public   class  UserLogsInSuccessfully
{
  
//  some code to setup _currentPage
   
//  ...
    [Given( " I am not logged in " )]
   
public   void  LogOut()
    {
        _currentPage.click( " logout " );

    }
    [When("I log in as $username with a password $password")]
   
publicvoid LogIn(string username, string password)
    {
        _currentPage.click("login");
    }
    [Then("I should see a message, \"$message\"")]
   
publicvoid CheckMessage(string message)
    {
        _currentPage.ToString().ShouldContain(message);
    }
}

复制代码

上面的代码简单明了,通过Given, When, Then等.NET Attribute,建立了场景类中的方法与场景模板之间的联系。我们还看到,这几个Attribute还支持参数匹配,比如,通过$username匹配到Login函数的username参数,非常的方便使用。实际上参数还支持正则表达式以及数组参数,详细参考文本最后的链接:Steps

接下来,就是执行了,通过:


 
 
>NBehave-Console.exe NameOfDll.dll /sf = user_logs_in_successfully.feature

执行后如果全部通过,会有通过的通过的信息输出,如果案例失败了,会有详细的错误输出。


NBehave文档

通过上面简单的示例,是不是对BDD有了更加直观的了解了呢。如果想了解更多关于NBehave框架的内容,请参考NBehave主页:http://nbehave.codeplex.com/

其中,本文的例子也是NBehave主页中的Documents中来的。

参考链接:

  • Getting started (简单入门,本文的例子也是从这里来的)
  • Steps (场景类中,Given, When, Then等Attribute使用的详细规则)
  • Integrate into build process (介绍如何集成Nbehave到持续构建中,比如,MSBuild,NAnt)
  • scenario files (场景文件(本文中的user_logs_in_successfully.feature)的一些编写规则)


BDD与TDD

我认为,BDD和TDD是相辅相成的。我可以想象这样一个开发过程:

产品人员或QA人员根据产品需求设计好各种场景文件(Scenario files) -> 开发人员编写对应的场景类(Scenario class)-> 执行场景 –> 执行结果失败 –> 编写相应的产品代码(Product code) –> 再次执行场景 –> 重复执行这个过程,直到所有场景通过

这就是我所理解的行为驱动开发,我就不画图了,大家有什么看法呢?

 

 

本文转自CoderZh博客园博客,原文链接:http://www.cnblogs.com/coderzh/archive/2010/02/28/BDD-By-NBehave.html,如需转载请自行联系原作者

相关文章
|
Devops 容器
Why SSDs Matter for Application Development
Solid state disks (SSDs) have become popular in today's servers and consumer devices as a means of improving data I/O and application performance
1214 0
Why SSDs Matter for Application Development
|
机器人 Python 数据格式
Robot Framework's built-in tool:libdoc
Libdoc是Robot框架的内置工具之一,用于生成HTML和XML格式的测试库和资源文件的关键字文档,使用起来我感觉非常的灵活方便。 General Usage 语法使用 python -m robot.
1377 0
|
Kotlin Java
Architecture -- Lifecycle
1). 简介 生命周期感知组件执行操作以响应另一个组件(例如活动和片段)的生命周期状态的更改。 这些组件可帮助您生成更易于组织且通常更轻量级的代码,这些代码更易于维护。
967 0
|
Java Android开发 应用服务中间件