.net测试篇之单元测试/集成测试神器Autofixture
autofixture简介
有了单元测试框架加上Moq(后面我们会用单独章节来介绍moq),可以说测试问题基上都能搞定了.然而有了AutoFixture对单元测试来说可以说是如虎添翼,AutoFixture并且它能与moq,rhinomock等框架结合,对单元测试带来的便捷性,可维护性和扩展性更是难以言表,只有用用了才知道.
说了这么多,还没有介绍AutoFixture是干什么的,其实AutoFixture就是一个假数据填充工具.
其实不论是Nunit还是Xunit都有数据填充功能,并且大部分时候都能满足需求.然而通过我们前面的介绍就会知道有以下问题:
- 不论是vlues注解还是TestCase注解都没有类型约束,这就可能会造成运行时错误.
- 基于注解的值都只能是Const值,如果需要复杂类型就需要定义一个类型做为Source为当前操作提供值.
- 与Nunit和Xunit生成的填充数据相比,Autofixture可以生成符合验证规则的数据(基于system.componentmodel.annotations名称空间下的注解约束),这在集成测试里帮助很大,对于有着非常复杂模型验证的接口来说,手工制造出符合模型验证规则的数据往往是非常痛苦的.
- Autofixture可以生成一组符合验证规则的数据,这样在测试的时候增加了样本数据的随机性,大大提升了测试的覆盖面.
Moq测试虽然极大方便了测试,但是也会有一些问题:
对于比较复杂的web项目,往往一个业务逻辑可能要消费十个几个甚至几十个数据接口,如果业务不是很成熟可能需要不断的来调整这些接口,这里的修改同时单元测试方法也需要修改(因为这些接口多数时候是通过构造函数注入的,构造函数参数数量的变动会导致调用者也需要做相应调整)
虽然Moq也能够模拟类对象,但是限制非常多,我们不可能为了测试把所有的方法和属性都加上abstract或者virtual.
而autofixture则可以很好的解决这些问题.这样极大增加代码的可维护性和扩展性.
AutoFixture并不是对moq的替代,它只能填充对象,而不能模拟对象,但是它可以与moq框架结合实现更强大的功能.
autofixture安装
autofixture安装非常简单,我们在Nuget里搜索autofixture,第一个就是它点击安装即可.
关于autofixture与moq结合需要的包在后面讲到的时候再安装,这里先略过.
AutoFixture 自动为Nunit填充数据
要使AutoFixture与Nunit结合,首先我们需要安装特定的包.
在Nuget里输入AutoFixture.Nunit3,会出现以下选项
由于我们使用的是Nunit3,因此我们选择第一个安装.
AutoFixture还可以与Xunit结合.在Nuget里搜索AutoFixture.xunit2便可以搜索到AutoFixture与Xunit结合的框架.与Xunit结果的用法与Nunit差不多,只是需要注意Xunit数据测试方法需要Theory注解.
我们新建一个名为FixtureTest
并引入AutoFixture.NUnit3;
名称空间
代码如下
[TestFixture]
public class FixtureTest
{
[Test]
[AutoData]
public void FixValueTest(int a, int b)
{
var result = Add(a , b);
Assert.AreEqual(a + b, result);
}
int Add(int x, int y)
{
return x + y;
}
}
这里与平时的单元测试相比,多了一个AutoData注解,有了AutoData注解,AutoFixture便可以给当前测试提供值了.
我们断点调试一下看看a和b的值
我们可以看到a和b都被赋予了随机的值.
我们把测试代码改为如下
[Test]
[AutoData]
public void FixValueTest(Person p1, Person p2)
{
var result = Add(p1.Age , p2.Age);
Assert.AreEqual(p1.Age + p2.Age, result);
}
我们再断点调试一下看看是否有值
复杂对象它也能填充!这样就免去了为了使用复杂对象需要额外写很多source繁琐.
我们把代码改成如下
[Test]
[AutoData]
public void FixValueTest(IEnumerable<Person> people)
{
var ages = people.Sum(a => a.Age);
}
我们看看此时会有什么结果
通过监视容器可以看到,AutoFixture生成了一个包含三个元素的对象.
这简直是太方便了,autofixture自动填充值不但减少了运行时可能的类型错误,还有极大的扩展性,如果我们在测试方法上添加其它参数,它仍然能够自动填充.而使用Nunit自身带的TestCase如果参数减少,里面指定的值也要减少,否则会抛出运行时异常.
通过以上我们可以看到,AutoFixture可以生成各种类型的对象,它可以创建集合对象对我们测试来说尤其有用,免去了手动创建的麻烦.但是我们同时也看到,基于注解的方法生成集合时只生成了三个,实际上要模拟数据库是的数据测试一些行为我们可能需要更多的元素.这里就需要对AutoFixture本身进行配置.这是基于注解的方法无法完成的.
.net测试篇之单元测试/集成测试神器Autofixture的更多相关文章
- [liu yanling]软件开发的过程按阶段划分有:单元测试 集成测试 系统测试 验收测试
从软件开发的过程按阶段划分有:单元测试 集成测试 系统测试 验收测试测试过程按 4 个步骤进行,概念内容如下:单元测试:单元测试是对软件基本组成单元(如函数.类的方法等)进行的测试.集成测试:集成测试 ...
- Maven测试篇
maven的生命周期: 讲解Maven测试篇之前将首先介绍一下Maven生命周期的相关概念,如果你熟知这部分概念可以略过此小节内容. 大多数时候,我们在构建一个项目时,不外乎是对其进行清理.编译.测 ...
- jest & puppeteer & 单元测试 & 集成测试
jest & puppeteer 单元测试 & 集成测试 单元测试,就是测试一个函数或某个代码片段,通过模拟输入确保输出符合预期 集成测试,测的是一个功能模块,比如用户注册功能,集成测 ...
- .net持续集成单元测试篇之单元测试简介以及在visual studio中配置Nunit使用环境
系列目录 单元测试及测试驱动开发简介 什么是单元测试 单元测试是一段自动化的代码,这段代码调用被测试的工作单元,之后对这个单元的单个最终结果的某些假设进行检验.单元测试几乎都是用单元测试框架编写的.单 ...
- Tessy — 嵌入式软件单元测试/ 集成测试工具
Tessy 源自戴姆勒- 奔驰公司的软件技术实验室,由德国Hitex 公司负责全球销售及技术支持服务,是一款专门针对嵌入式软件进行单元/ 集成测试的工具.它可以对C/C++ 代码进行单元.集成测试,可 ...
- ffmpeg第7篇:数据流选择神器-map指令
自动选择规则 ffmpeg在处理视频时,如果只提供了输入和输出参数,ffmpeg会自动地去选择相应的视频流和音频流来合成文件 自动选择的方式根据如下规则: 视频流:选分辨率最高的,比如有两个视频,一个 ...
- JAVA 利用MyEclipse结合TestNG测试框架进行单元测试
利用MyEclipse结合TestNG测试框架进行单元测试 by:授客 QQ:1033553122 测试环境 jdk1.8.0_121 myeclipse-10.0-offline-install ...
- Java自动化测试框架-11 - TestNG之annotation与并发测试篇 (详细教程)
1.简介 TestNG中用到的annotation的快速预览及其属性. 2.TestNG基本注解(注释) 注解 描述 @BeforeSuite 注解的方法只运行一次,在当前suite所有测试执行之前执 ...
- .net测试篇之测试神器Autofixture Generator使用与自定义builder
有了上一节自定义配置,很多问题都能解决了,但是如果仅仅是为了解决一个简单问题那么创建一个类显得有点繁重.其实AutoFixture在创建Fixture对象时有很多方便的Fluent配置,我们这里介绍一 ...
随机推荐
- 微信小程序开发--组件(4)
一.picker-view / picker-view-column <view> <view>{{year}}年{{month}}月{{day}}日</view> ...
- Excel催化剂开源第48波-Excel与PowerBIDeskTop互通互联之第二篇
前一篇的分享中,主要谈到Excel透视表连接PowerBIDeskTop的技术,在访问SSAS模型时,不止可以使用透视表的方式访问,更可以发数据模型发起DAX或MDX查询,返回一个结果表数据,较透视表 ...
- python小技巧 将二元列表转为一元列表
list=[num for row in nums for num in row]
- org.mybatis.spring.MyBatisSystemException异常及处理
org.mybatis.spring.MyBatisSystemException异常处理 测试场景 在测试springboot中使用MyBatis/通用Mapper的自定义方法时出现此异常. 异常如 ...
- 阿里云服务器连接以及centos 搭建 web java环境(linux java部署 tomcat部署)
版权声明:本文为博主原创文章,未经博主允许不得转载. 最近弄了个试用阿里云服务器倒腾了半天终于部署好,分享一下. 1.登入阿里云打开你申请的是云服务器的实例: 点击重置密码---重置密码后重启服务器才 ...
- 前端基于vue,后台采用springboot+shiro的方式搭建的一个移动端商品展示平台
基于vue实现的移动端商品展示页,可以web-view的方式嵌入到小程序中,布局简约.大气,减少初学者或开发者不必要的工作量.后台维护采用的springboot+shiro的方式,为广大爱好者提供展示 ...
- vue.js带复选框表单的增删改查
近段时间由于公司项目要求,前端开始使用VUE框架进行开发,最近刚开始学习,做了一个表单的增删改查,和大家分享一下. 页面模型代码设计如下 <template> <div id=&qu ...
- 深入理解Java中的锁(三)
ReadWriteLock接口 读写锁维护一对关联锁,一个只用于读操作,一个只用于写操作.读锁可以由多个线程同时持有,又称共享锁.写锁同一时间只能由一个线程持有,又称互斥锁.同一时间,两把锁不能被不同 ...
- jsp数据交互(一).3
引入的文件如果是jsp则应定义为***.jspf文件,如果其他文件可定义为***.inc文件,即include file. jsp:include是既可以静态包含又可以动态包含,用jsp:includ ...
- JavaScript-基本语法和数据类型
前奏:在HTML中使用JavaScript 1_推荐src引用外部JavaScript文件,方便管理与维护,标签位置在页面最下面,使浏览器更优先加载页面内容. 2_HTML页面需要有标准 ...