.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配置,我们这里介绍一 ...
随机推荐
- Linux下安装docker与kubernetes(k8s)
环境 安装是使用Vmware虚拟机下进行,操作系统是CentOS7 64位.规划是使用三台虚拟机搭建k8s的集群,网络使用NAT模式.三台的ip分别为: k8s-master:192.168.91.1 ...
- vector是序列式容器而set是关联式容器。set包含0个或多个不重复不排序的元素。
1.vector是序列式容器而set是关联式容器.set包含0个或多个不重复不排序的元素.也就是说set能够保证它里面所有的元素都是不重复的.另外对set容器进行插入时可以指定插入位置或者不指定插入位 ...
- js的事件冒泡机制
js的事件冒泡机制呢,就是一个DOM树,一级一级向上冒的过程,最终是到document这个根节点这里.js的事件冒泡机制,就像是一个水泡在水底下,冒泡到水面的过程. 摘自醉清玄
- 【MySQL】(一)MySQL 体系结构和存储引擎
1.1.定义数据库和实例 数据库:物理操作系统文件或其他形式文件类型的集合.在MySQL数据库中,数据库文件可以是frm.MYD.MYI.ibd结尾的文件. 实例:MySQL数据库由后台线程以及一个共 ...
- MYSQL主从复制、主主复制、双主多从配置
一.如何配置MYSQL的主从复制? 1. 两台数据库服务器,IP分别为 192.168.216.128 和 192.168.216.129,在服务器上装MYSQL(我的配置版本为5.5.56) 2. ...
- 第2个C# Winform实例,寻找三角形的位置
这里,在第一个例子的基础上,稍微做修改,达到最终定位三角形位置的目的. 先在网络上找一张包含有三角形的图片,我们这里使用一张有三个三角形和一些标记的图片来处理. 原图: 先贴结果图片:左侧,中间,右侧 ...
- Go语言圣经习题练习_1.4. GIF动画
练习 1.5: 修改前面的Lissajous程序里的调色板,由黑色改为绿色.我们可以用color.RGBA{0xRR, 0xGG, 0xBB, 0xff}来得到#RRGGBB这个色值,三个十六进制的字 ...
- 温故而知新,重温 Java 7 的那些“新”特性
2009 年 4 月 20 日,Java 的亲生父亲 Sun 被养父 Oracle 以 74 亿美元收购,这在当时可是一件天大的事.有不少同学都担心 Java 的前途,我当时傻不啦叽地也很担心:自己刚 ...
- java的System.currentTimeMillis()和System.nanoTime
纳秒 ns(nanosecond):纳秒, 时间单位.一秒的10亿分之一,即等于10的负9次方秒.常用作 内存读写速度的单位,其前面数字越小则表示速度越快. 1纳秒=1000 皮秒 1纳秒 = ...
- 提升10倍生产力:IDEA远程一键部署SpringBoot到Docker
作者:陶章好 juejin.im/post/5d026212f265da1b8608828b 推荐阅读(点击即可跳转阅读) 1. SpringBoot内容聚合 2. 面试题内容聚合 3. 设计模式内容 ...