.net测试篇之测试神器Autofixture基本配置一
实际工作中我们需要的数据逻辑万千,千变万化,而AutoFixture默认是按照一定算法随机生成一些假数据,虽然这在多数时候是ok的,但是可能不能满足我们的所有业务场景,有些时候我们需要进行一些配置,以期达到指定目标.
AutoFixture简单使用
前面我介首先介绍的是AutoFixture如何与Nunit结合提供测试数据,这里我们介绍一下它自身,即脱离Nunit时它是如何工作起来的.
这里主要用到的就是Fixture对象的Create泛型方法
看以下代码
[Test]
public void FixValueTest()
{
var fix = new Fixture();
var str = fix.Create<string>();
}
通过以上代码,我们就可能创建一个string类型的对象,其它对象也是如法炮制.
下面我们来解决上一节中遗漏的一个问题,就是如何在创建集合的时候显式的指定个数.
其实也很简单,那就是在创建Fixture对象的时候指定一个RepeatCount,这样就可以生成指定数量的集合啦.
代码改为如下
[Test]
public void FixValueTest()
{
var fix = new Fixture {RepeatCount = 10};
var str = fix.Create<IEnumerable<string>>();
}
就可以生成一个包含10个String元素的集合.
很多时候我们并不是简单的创建一个字符串或者数字,而是创建一个对象,很多时候我们要是对这些对象进行验证的,如果随机生成一些可能无法通过验证,我们下面介绍如何按照一定的规则生成一个对象.
比如说我们要生成一个Person对象,服务器对Person的Name是要约束的,不能包含特定符号和阿拉伯数字,而AutoFixture自动生成的则是Guid转成的字符字符串,并且长度也不符合姓名规则.
下面我们看一下如何生成一个例规的姓名.
[Test]
public void FixValueTest()
{
var s = GetString(5);
var fix = new Fixture();
fix.Customizations.Add(new StringGenerator(() => s));
var person= fix.Create<Person>();
}
string GetString(int count)
{
List<int> ints = new List<int>();
Random rand = new Random();
for (int i = 0; i < count; i++)
{
int value = rand.Next(97 ,122);
ints.Add(value);
}
var charArr = ints.Select(Convert.ToChar).ToArray();
var str = string.Concat(charArr);
return str;
}
这里我们自定义了一个算法,生成一个字符串,然后在fix配置里的自定义配置里面添加一个StringGenerator自定义配置类(这个类是框架带的),它接收一个委托.这样我们就可以得到期待的字符串了.
我们把测试代码改为如下
[Test]
public void FixValueTest()
{
var fix = new Fixture();
fix.Customizations.Add(new StringSpecimenBuilder());
var person= fix.Create<Person>();
}
这里的StringSpecimenBuilder是我们自定义的,它实现了ISpecimenBuilder接口,我们看下代码
public class StringSpecimenBuilder:ISpecimenBuilder
{
private readonly int _strLenCount;
public StringSpecimenBuilder(int strLenCount=5)
{
_strLenCount = strLenCount;
}
public object Create(object request, ISpecimenContext context)
{
var property = request as PropertyInfo;
if (property != null &&
property.Name == "Name" &&
property.PropertyType == typeof(string))
return GetString(_strLenCount);
return new NoSpecimen();
}
string GetString(int count)
{
List<int> ints = new List<int>();
Random rand = new Random();
for (int i = 0; i < count; i++)
{
int value = rand.Next(97, 122);
ints.Add(value);
}
var charArr = ints.Select(Convert.ToChar).ToArray();
var str = string.Concat(charArr);
return str;
}
}
其中的GetString我们刚才用到过,这里把它移到这里来.
我们来分析下这段代码,构造函数里我们接收一个int类型变量,用于自定义生成字符串的长度.
下面的Create方法为从接口里实现来的方法.
它的第一个参数request为要创建的对象,对于我们的Person类来说,它要创建这个类和类里的所有属性,每一个属性都是一个request对象.下面的代码我们判断请求对象是否是属性,如果是并且属性名是Name并且属性类型为string,那么我们就返回算法得到的值,否则返回NoSpecimen,返回NoSpecimen表示不使用自定义的算法.
通过以上配置生成的name就能符合我们的需求了.
[info]在集成测试过程中我们还可以对省市县等数据建立起列表,然后动态自定义填充.
以上我们判断属性名是否是Name条件过严,我们可以适当放宽一些,则能适应的场景更广.
.net测试篇之测试神器Autofixture基本配置一的更多相关文章
- .net测试篇之测试神器Autofixture Generator使用与自定义builder
有了上一节自定义配置,很多问题都能解决了,但是如果仅仅是为了解决一个简单问题那么创建一个类显得有点繁重.其实AutoFixture在创建Fixture对象时有很多方便的Fluent配置,我们这里介绍一 ...
- .net测试篇之测试神器Autofixture在几个复杂场景下的使用示例以及与Moq结合
系列目录 为String指定一个值. 在第三节里我们讲了如何使用自定义配置加上一个自定义算法生成一个自定义字符串,然而有些时候我们仅仅是需要某个字段是有意义的,这个时候随便生成的字符串也满足不了我们的 ...
- Maven测试篇
maven的生命周期: 讲解Maven测试篇之前将首先介绍一下Maven生命周期的相关概念,如果你熟知这部分概念可以略过此小节内容. 大多数时候,我们在构建一个项目时,不外乎是对其进行清理.编译.测 ...
- Java自动化测试框架-11 - TestNG之annotation与并发测试篇 (详细教程)
1.简介 TestNG中用到的annotation的快速预览及其属性. 2.TestNG基本注解(注释) 注解 描述 @BeforeSuite 注解的方法只运行一次,在当前suite所有测试执行之前执 ...
- 十一、Abp vNext 基础篇丨测试
前言 祝大家国庆快乐,本来想国庆之前更新完的,结果没写完,今天把剩下的代码补了一下总算ok了. 本章节也是我们后端日常开发中最重要的一步就是测试,我们经常听到的单元测试.集成测试.UI测试.系统测试, ...
- .net测试篇之Moq框架简单使用
系列目录 Moq库简介及安装 Moq简介 Moq是.net平台下的一个非常流行的模拟库,只要有一个接口它就可以动态生成一个对象,底层使用的是Castle的动态代理功能. 它的流行赖于依赖注入模式的兴起 ...
- 项目Alpha冲刺(团队)-测试篇
格式描述 课程名称:软件工程1916|W(福州大学) 作业要求:项目Alpha冲刺(团队)-代码规范.冲刺任务与计划 团队名称:为了交项目干杯 测试用例:测试用例文档.zip 作业目标:描述项目的测试 ...
- <转>iOS应用程序内使用IAP/StoreKit付费、沙盒(SandBox)测试、创建测试账号流程!
原文地址:http://blog.csdn.net/xiaominghimi/article/details/6937097 //——2012-12-11日更新 获取"产品付费数量等于0 ...
- app测试与web测试的区别
1.从功能测试的来讲的话,在流程和功能测试上是没有区别的.系统测试和一些细节可能会不一样. 那么我们就要先来了解,web和app的区别. web项目,一般都是b/s架构,基于浏览器的,而app则是c/ ...
随机推荐
- I/O:FileLock
FileLock: /* 文件锁定要么是独占的,要么是共享的.共享锁定可阻止其他并发运行的程序获取重叠的 独占锁定,但是允许该程序获取重叠的共享锁定.独占锁定则阻止其他程序获取任一类型的重叠锁 定.一 ...
- 渐进式web应用开发---ajax本地数据存储(四)
在前几篇文章中,我们使用service worker一步步优化了我们的页面,现在我们学习使用我们之前的indexedDB, 来缓存我们的ajax请求,第一次访问页面的时候,我们请求ajax,当我们继续 ...
- 个人永久性免费-Excel催化剂功能第66波-数据快速录入,预定义引用数据逐字提示
在前面好几波的功能中,为数据录入的规范性做了很大的改进,数据录入乃是数据应用之根,没有完整.干净的数据源,再往下游的所有数据应用场景都是空话.在目前IT化进程推进了20多年的现状,是否还仍有必要在Ex ...
- c语言进阶10-算法
一. 数据结构和算法关系 为什么要学数据结构和算法? 通常,计算机解决问题的步骤如下: 在数学模型中,计算机处理的对象之间通常存在着一种最简单的线性关系,这类数学模型就是线性的数据结构.著名计算机科 ...
- WSASocket()创建套接字不成功解决方法
这几天我在写一个模仿windows自带的ping程序,可是套接字总是创建不成功,在网上找了一些资料最后总算把问题解决了,现在总结一下. 解决方法:以管理员运行VS就行了我的是vs2013,vs2010 ...
- 《VR入门系列教程》之18---Oculus代码剖析
代码剖析 原文作者:Tony Parisi 那么,Unity究竟是如何支持Oculus VR运行的?首先,我们来看看Unity场景是如何构建的.在Unity集成开发包中有一个相机预设体,这个预 ...
- CentOS7 升级 Python2.x 到 Python3.x
CentOS 7 中默认安装了 Python,版本比较低(2.7.5),为了使用新版 3.x,需要对旧版本进行升级.由于很多基本的命令.软件包都依赖旧版本,比如:yum.所以,在更新 Python 时 ...
- python检测变量名
python检测变量名 变量在编程中的用途非常广,在python中,变量的名称只能以字母或者下划线“_”开头,变量名只能由字母.数字.下划线组成. 编写python,使得其实现以下功能: 1.输入一个 ...
- linux初学者-磁盘配额篇
linux初学者-磁盘配额篇 在使用磁盘时,只要有权限,不管什么用户都可以在其中写入数据,但是如果是多人在一个磁盘中写入数据,就会出现争议,如果一个用户将磁盘空间用完,那么其他人无法再使用.如下图所示 ...
- HPU暑期集训积分赛1
A. Nth power of n 单点时限: 1.0 sec 内存限制: 512 MB 求 nn 的个位数. 输入格式 多组输入,处理到文件结束.每组数据输入一个 n.(1≤n≤109) 输出格式 ...