zoukankan      html  css  js  c++  java
  • .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条件过严,我们可以适当放宽一些,则能适应的场景更广.

  • 相关阅读:
    11 数值的整数次方
    10 二进制中1的个数
    6 重建二叉树
    5 从尾到头打印链表
    计算机网络面试题
    Http和Https的区别
    UVALive 7749 Convex Contour (计算几何)
    Gym 101190H Hard Refactoring (模拟坑题)
    UVa 11324 The Largest Clique (强连通分量+DP)
    HDU 6006 Engineer Assignment (状压DP)
  • 原文地址:https://www.cnblogs.com/tylerzhou/p/11392248.html
Copyright © 2011-2022 走看看