SpecFlow是一个BDD工具,在这里对BDD不多赘述,你可以阅读一下微软2010年十二月的一篇文章,此外如果你想要更多了解SpecFlow,可以参考我的另一篇翻译(当然,也可以直接进入官网)

一、不直接通过网页的测试。

什么叫不直接通过网页的测试?

我们知道,一般对页面测试,通常对各种按钮点击是少不了的,就像这个一样:

你至少要点一个Register吧。

那么我们暂时就不要这样做(项目太大的话,打开网页也是一件耗时间的事情)所以这里我们不从页面上来测,用一种类似测路由的方式来做。

1.首先,新建一个MVC3项目。使用默认配置

2.下载三个工具:SpecFlow,NUnit,SpecFlow的VS扩展插件

其中前两个可以使用nuget下载,而VS tool的扩展(比如:TechTalk.SpecFlow.Vs2010Integration)在这里

http://visualstudiogallery.msdn.microsoft.com/9915524d-7fb0-43c3-bb3c-a8a14fbd40ee

3.安装完上述的工具后,右键项目,添加Feature文件。

4.打开他,完成我们的第一个场景

Scenario1:当浏览注册页面时

典型的BDD语法风格,如果每一个用例都可以写的如此清楚,那么对于业务的开展会十分有利。

这里说明:关于BDD可以没有Give(Establish),但When(Because)是必需的

5.右键Scenario,生成Step。

它会自动生成一个Pending的测试,是忽略的,所以接下来:

6.完成测试

对页面测试,所以要引用MVC的类库。

说明一下:这里引用了FluentAssert,所以你看见的测试语法是这样的(因为好用)。实际上还是NUnit的测试。

7.运行

SpecFlow的运行没有绿点给你点,不过不要紧,右键一下,Run SpecFlow就可以了。

看我们BDD风格的测试内容:

从这里你可以看见,不通过页面测试可以在一定程度上的减少我们打开整个项目的时间,除此之外,你还需要对你的项目有非常的了解,以至于你不用打开页面就知道这个页面该做什么,以及怎么做,另外还要了解MVC的部分机制,是一件比较消耗脑力的事情。

附:SpecFlow有一个不太好的地方,它需要和NUnit集成,因此选择这个工具,你和你的团队需要权衡一下。

二、使用参数

ok,上次测了一个页面返回的情况(甚至连返回的是哪一个页面都没测,光测了一个类型,当然不可靠),现在测这个页面是不是我们要的那一个。

当然,在这里需要利用一些数据来判断这个返回的页面是不是我们要的那个,所以需要加一些东西在AccountController的Register方法里面。

比如接下来这个简单的。

1.首先在controller的方法中,写入一个"数据"

[csharp] view plaincopy

  1. public ActionResult Register()  
  2. {  
  3. ViewData["Title"] = "Register";  
  4. return View();  
  5. }

2.测试的时候直接测到它,但是注意,此时我们的Scenario稍微改了一下

我们添加了一个And,在属于cucumber一类的BDD语言风格中,And同表上一个,也就是这个And表示Then。我们又给这个场景添加了一个结果,然后把这个结果用参数的方式传入测试代码中。

测试:

[csharp] view plaincopy

  1. [Binding]  
  2. public class 浏览注册页面  
  3. {  
  4. private ActionResult result;  
  5. private AccountController controller;  
  6. [When(@"用户进入注册页面")]  
  7. public void When用户进入注册页面()  
  8. {  
  9. result = controller.Register();  
  10. }  
  11. [Then(@"注册页面会显示")]  
  12. public void Then注册页面会显示()  
  13. {  
  14. result.Should().BeOfType<ViewResult>();  
  15. }  
  16. //使用正则表达式来匹配参数
  17. [Then(@"页面的Title是""(.*)""")]  
  18. public void Then页面的Title是(string p0)  
  19. {  
  20. ((ViewResult) result).ViewData["Title"].Should().Be(p0);  
  21. }  
  22. }

可以发现冒号 “” 是用来选择参数的。

利用这个非常简单的(也是很笨的方法),我们测到了想要的结果。

来源:http://blog.csdn.net/yujunwu2525/article/details/8456307

[转]SpecFlow使用入门的更多相关文章

  1. SpecFlow使用入门之C# BDD

    SpecFlow使用入门 http://www.specflow.org/ SpecFlow是一个BDD工具,在这里对BDD不多赘述,你可以阅读一下微软2010年十二月的一篇文章,此外如果你想要更多了 ...

  2. SpecFlow - Cucumber for .NET

    SpecFlow使用入门 SpecFlow是一个BDD工具,在这里对BDD不多赘述,你可以阅读一下微软2010年十二月的一篇文章,此外如果你想要更多了解SpecFlow,可以参考我的另一篇翻译(当然, ...

  3. SpecFlow教程--快速入门

    原文http://www.specflow.org/getting-started/ 一.安装 为了能正确安装SpecFlow所需要的东西,你必须安装集成IDE的插件以及设置你的项目使用SpecFlo ...

  4. SpecFlow

    SpecFlow http://blog.csdn.net/yujunwu2525/article/details/7839859 将业务需求与.NET代码结合起来 SpecFlow旨在弥合领域专家与 ...

  5. Angular2入门系列教程7-HTTP(一)-使用Angular2自带的http进行网络请求

    上一篇:Angular2入门系列教程6-路由(二)-使用多层级路由并在在路由中传递复杂参数 感觉这篇不是很好写,因为涉及到网络请求,如果采用真实的网络请求,这个例子大家拿到手估计还要自己写一个web ...

  6. ABP入门系列(1)——学习Abp框架之实操演练

    作为.Net工地搬砖长工一名,一直致力于挖坑(Bug)填坑(Debug),但技术却不见长进.也曾热情于新技术的学习,憧憬过成为技术大拿.从前端到后端,从bootstrap到javascript,从py ...

  7. Oracle分析函数入门

    一.Oracle分析函数入门 分析函数是什么?分析函数是Oracle专门用于解决复杂报表统计需求的功能强大的函数,它可以在数据中进行分组然后计算基于组的某种统计值,并且每一组的每一行都可以返回一个统计 ...

  8. Angular2入门系列教程6-路由(二)-使用多层级路由并在在路由中传递复杂参数

    上一篇:Angular2入门系列教程5-路由(一)-使用简单的路由并在在路由中传递参数 之前介绍了简单的路由以及传参,这篇文章我们将要学习复杂一些的路由以及传递其他附加参数.一个好的路由系统可以使我们 ...

  9. Angular2入门系列教程5-路由(一)-使用简单的路由并在在路由中传递参数

    上一篇:Angular2入门系列教程-服务 上一篇文章我们将Angular2的数据服务分离出来,学习了Angular2的依赖注入,这篇文章我们将要学习Angualr2的路由 为了编写样式方便,我们这篇 ...

随机推荐

  1. ionic 签名、打包

    ionic cordova platform add androidionic cordova build android [debug版本,无需签名] ionic cordova build and ...

  2. js math 对数和指数处理 expm1 log1p

    1.Math.expm1() Math.expm1(x)返回 ex - 1,即Math.exp(x) - 1. Math.expm1(-1) // -0.6321205588285577 Math.e ...

  3. NET:Checkboxlist,Dropdownlist 加入ToolTip说明

    ToolTip属性: ToolTip 类 (System.Windows.Controls)‎ 表示创建弹出项的控件.该弹出项可显示界面中元素的相关信息.命名空间: System.Windows.Co ...

  4. ZK框架笔记4、通用组件、页面、桌面

    组件(component)是一种用户接口(UI)对象,如一个标签.按钮.树.         页面(page)是一个组件的集合.         桌面(desktop)是一个包含相同URL请求的页面. ...

  5. Java中abstract class 和 interface 的解释和他们的异同点(转)

    (一)概述    在Java语言中, abstract class 和interface 是支持抽象类定义的两种机制.正是由于这两种机制的存 在,才赋予了Java强大的 面向对象能力.abstract ...

  6. 【微信小程序】转载:微信小程序之购物车功能

    前言 以往的购物车,基本都是通过大量的 DOM 操作来实现.微信小程序其实跟 vue.js 的用法非常像,接下来就看看小程序可以怎样实现购物车功能. 需求 先来弄清楚购物车的需求. 单选.全选和取消, ...

  7. jQuery Accordion 插件用于创建折叠菜单

    jQuery Accordion 插件用于创建折叠菜单.它通常与嵌套的列表.定义列表或嵌套的 div 一起使用.选项用于指定结构.激活的元素和定制的动画. 后期完善

  8. iperf使用

    1. sourceforge搜索iperf下载 2. ./configure make make install 3. server:iperf -s -p 12345 -i 1 -M: client ...

  9. PyCharm设置python新建文件指定编码为utf-8

    PyCharm新建文件时可以在模板中添加编码字符集为utf-8,新建文件可自动添加了

  10. spine findBone

    spBone* bone=skeletonAnimationNode->findBone("boneName"); CCPoint boneWorldPos=ccp(bone ...