http://www.specflow.org/
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的方法中,写入一个"数据"
- public ActionResult Register()
- {
- ViewData["Title"] = "Register";
- return View();
- }
2.测试的时候直接测到它,但是注意,此时我们的Scenario稍微改了一下
我们添加了一个And,在属于cucumber一类的BDD语言风格中,And同表上一个,也就是这个And表示Then。我们又给这个场景添加了一个结果,然后把这个结果用参数的方式传入测试代码中。
测试:
- [Binding]
- public class 浏览注册页面
- {
- private ActionResult result;
- private AccountController controller;
- [When(@"用户进入注册页面")]
- public void When用户进入注册页面()
- {
- result = controller.Register();
- }
- [Then(@"注册页面会显示")]
- public void Then注册页面会显示()
- {
- result.Should().BeOfType<ViewResult>();
- }
- //使用正则表达式来匹配参数
- [Then(@"页面的Title是""(.*)""")]
- public void Then页面的Title是(string p0)
- {
- ((ViewResult) result).ViewData["Title"].Should().Be(p0);
- }
- }
可以发现冒号 “” 是用来选择参数的。
利用这个非常简单的(也是很笨的方法),我们测到了想要的结果。
一、可持续集成管理
持续集成,CI:即Continuous integration。
可持续集成的概念是基于团队(小组)协作开发而提出来的,为了提高团队开发效率与降低集成风险(早发现,早解决。晚发现,解决更麻烦<1>),各种可持续集成的管理平台应运而生,这里介绍其中一种小而实用的平台管理工具——TeamCity。
注<1>:关于其优点在这里举一个例子:
团队协作开发必不可少的需要一个版本控制工具,如svn;对于每一个版本,我们都是需要提交在服务器上的,而每次因为各自人员的工作不一致,会有一定可能造成隐式的冲突问题,最简单的例子就是:“明明在我的机子上可以编译通过啊!为什么在你机子上(update)就不行了?!”
这正是因为缺少了一个可以用来检查服务器版本的工具(当然如果会,也有专人检查),尤其到了后期,每一次提交(集成)的信息量都是非常大的,一旦服务器版本出了问题,那么对整个团队的影响是非常明显的,至少团队的开发效率降低了下来,并需要调试错误。
于是“早发现,早解决”确实是一个有效降低大风险的工作。
二、什么是TeamCity
TeamCity是一款功能强大的持续集成(Continue Integration)工具,包括服务器端和客户端,目前支持Java,.Net项目开发。 TeamCity提供一系列特性可以让团队快速实现持续继承:IDE工具集成、各种消息通知、各种报表、项目的管理、分布式的编译等等,所有的这些,都是 让你的团队快速享有持续继承带来的效率提升、高质量的软件保障。
三、TeamCity工具入门
SpecFlow使用入门之C# BDD的更多相关文章
-
[转]SpecFlow使用入门
SpecFlow是一个BDD工具,在这里对BDD不多赘述,你可以阅读一下微软2010年十二月的一篇文章,此外如果你想要更多了解SpecFlow,可以参考我的另一篇翻译(当然,也可以直接进入官网) 一. ...
-
SpecFlow - Cucumber for .NET
SpecFlow使用入门 SpecFlow是一个BDD工具,在这里对BDD不多赘述,你可以阅读一下微软2010年十二月的一篇文章,此外如果你想要更多了解SpecFlow,可以参考我的另一篇翻译(当然, ...
-
BDD
Binding business requirements to .NET code http://www.specflow.org/ 行为驱动开发 BDD:Behavior Driven Devel ...
-
一系列令人敬畏的.NET核心库,工具,框架和软件
内容 一般 框架,库和工具 API 应用框架 应用模板 身份验证和授权 Blockchain 博特 构建自动化 捆绑和缩小 高速缓存 CMS 代码分析和指标 压缩 编译器,管道工和语言 加密 数据库 ...
-
BDD敏捷开发入门与实战
BDD敏捷开发入门与实战 1.BDD的来由 2003年,Dan North首先提出了BDD的概念,并在随后开发出了JBehave框架.在Dan North博客上介绍BDD的文章中,说到了BDD的想法是 ...
-
BDD实战篇 - .NET Core里跑Specflow - 可以跑集成测试和单元测试
这是<如何用ABP框架快速完成项目 >系列中和DevOps系列文章其中一篇文章. BDD很赞!比TDD先进很多,能够大大提高编码效率. 上一篇文章说了如何在.NET Core里安装 ...
-
BDD实战篇 - 在.NET Core下安装Specflow
这是<如何用ABP框架快速完成项目 >系列中的一篇文章. BDD很赞!比TDD先进很多,能够大大提高编码效率. 让我们动手起来吧!先在.NET Core下安装Specflow! 官网教程在 ...
-
SpecFlow教程--快速入门
原文http://www.specflow.org/getting-started/ 一.安装 为了能正确安装SpecFlow所需要的东西,你必须安装集成IDE的插件以及设置你的项目使用SpecFlo ...
-
BDD 与DSL 入门
正文: Behavior Driven Development,行为驱动开发是一种敏捷软件开发的技术,它鼓励软件项目中的开发者.QA和非技术人员或商业参与者之间的协作.在了解Behavior Driv ...
随机推荐
-
【BZOJ-2669】局部极小值 状压DP + 容斥原理
2669: [cqoi2012]局部极小值 Time Limit: 3 Sec Memory Limit: 128 MBSubmit: 561 Solved: 293[Submit][Status ...
-
Java对文件及文件夹的操作
public class FileOperater { // 验证字符串是否为正确路径名的正则表达式 private static String matches = "[A-Za-z]:\\ ...
-
python15-day1课堂随机
print("Hello world") #变量定义:一个在内存储存数据的容器#意义:为什么有变量,因为它保存程序执行的中间结果或状态以供后面的低吗进行调用 day1 = 200+ ...
-
Duff策略
Tom Duff首先在C语言中提出了展开循环的构想,所以这种模式被称之为Duff策略.Duff策略背后的思想是每一次循环完成标准循环的1-8次.首先通过数组值得总数除以8来取定循环次数.Duff发现对 ...
-
关于xxx.h file not found 的问题
在引用第三方库的时候,经常会遇到xxx.h file not found的问题. 首先,我们要知道在引用第三方的时候,我们使用的第三方的库的类型. .a静态库 使用方式:#import "x ...
-
原生端与服务器通过sessionid实现session共享以及登录验证
注:原生端与服务器建立连接时产生的sessionid会变,跟上一次的不一样,为了保证sessionid一样,所以第一次服务器需要把sessionid返回给原生端,下一次与服务端会话时,原生端需要把这个 ...
-
JVM内存管理的一些思考
目录 一. 内存是怎么分配的 二. 方法区 三. java对象的生命周期 四. Class对象是在方法区还是堆中 五.java对象的大小 六. 类加载的初始化阶段 七.Class.forName和Cl ...
-
JustOj 1036: 习题6.11 迭代法求平方根
题目描述 用迭代法求 .求平方根的迭代公式为: X[n+1]=1/2(X[n]+a/X[n]) 要求前后两次求出的得差的绝对值少于0.00001. 输出保留3位小数 输入 X 输出 X的平方根 样例输 ...
-
自动化部署必备技能—搭建YUM仓库
导言: YUM主要用于自动安装.升级rpm软件包,它能自动查找并解决rpm包之间的依赖关系.要成功的使用YUM工具安装更新软件或系统,就需要有一个包含各种rpm软件包的repository(软件仓库) ...
-
面试题26:合并k个排好序的单链表
Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity. c ...