惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

小众软件
小众软件
N
News and Events Feed by Topic
A
About on SuperTechFans
aimingoo的专栏
aimingoo的专栏
The Cloudflare Blog
H
Heimdal Security Blog
Schneier on Security
Schneier on Security
Engineering at Meta
Engineering at Meta
Google Online Security Blog
Google Online Security Blog
宝玉的分享
宝玉的分享
AI
AI
The GitHub Blog
The GitHub Blog
MongoDB | Blog
MongoDB | Blog
www.infosecurity-magazine.com
www.infosecurity-magazine.com
The Last Watchdog
The Last Watchdog
T
Troy Hunt's Blog
S
Security @ Cisco Blogs
H
Hacker News: Front Page
F
Fortinet All Blogs
博客园_首页
S
Secure Thoughts
N
News and Events Feed by Topic
P
Proofpoint News Feed
Microsoft Azure Blog
Microsoft Azure Blog
I
InfoQ
Spread Privacy
Spread Privacy
Hacker News - Newest:
Hacker News - Newest: "LLM"
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
C
Check Point Blog
Hugging Face - Blog
Hugging Face - Blog
Hacker News: Ask HN
Hacker News: Ask HN
C
CXSECURITY Database RSS Feed - CXSecurity.com
酷 壳 – CoolShell
酷 壳 – CoolShell
Stack Overflow Blog
Stack Overflow Blog
L
LINUX DO - 最新话题
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
S
Schneier on Security
Know Your Adversary
Know Your Adversary
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Scott Helme
Scott Helme
P
Privacy & Cybersecurity Law Blog
S
Securelist
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
O
OpenAI News
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
PCI Perspectives
PCI Perspectives
L
LangChain Blog
雷峰网
雷峰网
Security Archives - TechRepublic
Security Archives - TechRepublic
V2EX - 技术
V2EX - 技术

博客园 - laughter

使用Using的注意事项 [转]VMPlayer的Briged网络配置 [转]移动互联网应用技术架构简介-Restful服务 理解WCF中的Contracts [翻译]在ASP.NET Web API中通过OData支持查询和分页 [转]NBehave行为驱动测试关于story和scenarios [转]使用TeamCity对项目进行可持续集成管理(一) [转]软件测试- 3 - Mock 和Stub的区别 [翻译]创建ASP.NET WebApi RESTful 服务(11) [翻译]创建ASP.NET WebApi RESTful 服务(10) [翻译]创建ASP.NET WebApi RESTful 服务(9) [转]模拟HttpContext 实现ASP.NET MVC 的单元测试 [翻译]创建ASP.NET WebApi RESTful 服务(8) [翻译]创建ASP.NET WebApi RESTful 服务(7) [转]软件开发过程(CMMI/RUP/XP/MSF)是与非? [转]比较 Rational Unified Process (RUP) 和 Microsoft Solutions Framework (MSF) [翻译]Behavior-Driven Development (BDD)行为驱动开发(二) [翻译]Behavior-Driven Development (BDD)行为驱动开发(一) 【Visual Studio2010】创建XAML分析插件
[转]SpecFlow使用入门
laughter · 2014-04-15 · via 博客园 - laughter

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