mock_mockito - CSDN
mock 订阅
mock,英文单词,动词、形容词、名词、副词,作动词时意为“嘲笑,(通过模仿)嘲弄;不尊重,蔑视;使显得可笑”,作形容词时意为“虚假的,不诚实的;模拟的,仿制的”,作名词时意为“非正式)英国模拟考试;笑柄;嘲笑;模仿,仿造(品),美、德)莫克(人名)”,作副词时意为“虚假地,不诚实地”。 展开全文
mock,英文单词,动词、形容词、名词、副词,作动词时意为“嘲笑,(通过模仿)嘲弄;不尊重,蔑视;使显得可笑”,作形容词时意为“虚假的,不诚实的;模拟的,仿制的”,作名词时意为“非正式)英国模拟考试;笑柄;嘲笑;模仿,仿造(品),美、德)莫克(人名)”,作副词时意为“虚假地,不诚实地”。
信息
外文名
mock
词    性
动词、形容词、名词、副词
mock单词发音
英[mɒk]美[mɑːk] [1] 
收起全文
精华内容
参与话题
  • 接口测试-Mock测试方法

    万次阅读 多人点赞 2019-06-18 23:47:07
    一、关于Mock测试 1、什么是Mock测试? Mock 测试就是在测试过程中,对于某些不容易构造(如 HttpServletRequest 必须在Servlet 容器中才能构造出来)或者不容易获取的比较复杂的对象(如 JDBC 中的ResultSet 对象...

    一、关于Mock测试

    1、什么是Mock测试?

    Mock 测试就是在测试过程中,对于某些不容易构造(如 HttpServletRequest 必须在Servlet 容器中才能构造出来)或者不容易获取的比较复杂的对象(如 JDBC 中的ResultSet 对象),用一个虚拟的对象(Mock 对象)来创建以便测试的测试方法。

     

    2、为什么要进行Mock测试?

    Mock是为了解决不同的单元之间由于耦合而难于开发、测试的问题。所以,Mock既能出现在单元测试中,也会出现在集成测试、系统测试过程中。Mock 最大的功能是帮你把单元测试的耦合分解开,如果你的代码对另一个类或者接口有依赖,它能够帮你模拟这些依赖,并帮你验证所调用的依赖的行为。比如一段代码有这样的依赖:

    当我们需要测试A类的时候,如果没有 Mock,则我们需要把整个依赖树都构建出来,而使用 Mock 的话就可以将结构分解开,像下面这样:

     

    3、Mock对象适用场景

    (1)需要将当前被测单元和其依赖模块独立开来,构造一个独立的测试环境,不关注被测单元的依赖对象,只关注被测单元的功能逻辑。

      -----比如被测代码中需要依赖第三方接口返回值进行逻辑处理,可能因为网络或者其他环境因素,调用第三方经常会中断或者失败,无法对被测单元进行测试,这个时候就可以使用mock技术来将被测单元和依赖模块独立开来,使得测试可以进行下去。

    (2)被测单元依赖的模块尚未开发完成,而被测单元需要依赖模块的返回值进行后续处理。

    1)前后端项目中,后端接口开发完成之前,接口联调;

    2)依赖的上游项目的接口尚未开发完成,需要接口联调测试;

      -----比如service层的代码中,包含对Dao层的调用,但是,DAO层代码尚未实现

    (3)被测单元依赖的对象较难模拟或者构造比较复杂。

      -----比如,支付宝支付的异常条件有很多,但是模拟这种异常条件很复杂或者无法模拟,比如,查询聚划算的订单结果,无法在测试环境进行模拟。

     

    4、Mock测试的优势

    (1) 团队可以并行工作

    有了Mock,前后端人员只需要定义好接口文档就可以开始并行工作,互不影响,只在最后的联调阶段往来密切;后端与后端之间如果有接口耦合,也同样能被Mock解决;测试过程中如果遇到依赖接口没有准备好,同样可以借助Mock;不会出现一个团队等待另一个团队的情况。这样的话,开发自测阶段就可以及早开展,从而发现缺陷的时机也提前了,有利于整个产品质量以及进度的保证。

     

    (2)开启TDD模式,即测试驱动开发

    单元测试是TDD实现的基石,而TDD经常会碰到协同模块尚未开发完成的情况,但是有了mock,这些一切都不是问题。当接口定义好后,测试人员就可以创建一个Mock,把接口添加到自动化测试环境,提前创建测试。

     

    (3)可以模拟那些无法访问的资源

    比如说,你需要调用一个“墙”外的资源来方便自己调试,就可以自己Mock一个。

     

    (4)隔离系统

    假如我们需要调用一个post请求,为了获得某个响应,来看当前系统是否能正确处理返回的“响应”,但是这个post请求会造成数据库中数据的污染,那么就可以充分利用Mock,构造一个虚拟的post请求,我们给他指定返回就好了。

     

    (5)可以用来演示

    假如我们需要创建一个演示程序,并且做了简单的UI,那么在完全没有开发后端服务的情况下,也可以进行演示。说到演示了,假如你已经做好了一个系统,并且需要给客户进行演示,但是里面有些真实数据并不想让用户看到,那么同样,你可以用Mock接口把这些敏感信息接口全部替换。

     

    (6)测试覆盖度

    假如有一个接口,有100个不同类型的返回,我们需要测试它在不同返回下,系统是否能够正常响应,但是有些返回在正常情况下基本不会发生,比如,我们需要测试在当接口发生500错误的时候,app是否崩溃,别告诉我你一定要给服务端代码做些手脚让他返回500 。而使用mock,这一切就都好办了,想要什么返回就模拟什么返回,不用再担心我的测试覆盖度了!

     

    5、Mock测试存在的问题

    使用Mock测试有时可以提高团队的开发效率,但当B、C都开发完成代码后,这时应该把E2E测试代码从使用Mock测试改为调用真实的模块,以避免出现模块之间集成部分漏测的问题。这里说mock存在的问题,主要是让开发和测试不要过分的依赖/相信mock接口。

     

    使用mock时,切记的几点:

    1)测试人员不应该被覆盖率高的E2E自动化测试所迷惑,覆盖率高不代表没有问题。尤其在接手新项目中,需要查看E2E测试中有没有使用Mock测试,进一步去判断这些地方使用Mock测试是否合理,这些Mock测试是否应该换成真实模块间的调用和集成。

    2)当把mock接口换成实际接口后,测试/开发也必须把之前的测试重新做一遍。

    ps: 当你使用mock接口来提高效率,请注意:你的工作量其实是比 直接只用实际接口 多了 一倍的。如果测试时,偷懒,替换成实际接口后,只是简单测试,那么 当实际接口和mock预期接口有差异时,故障便和你相遇了。

    建议: mock接口只能主流程联调/ 异常返回测试,不要过分依赖mock接口进行测试。

    3)测试完毕,上线前,请一定确保 为了mock而做的相关代码/配置文件的修改,已经完全恢复了。

    建议:上线checklist中条条列出,并上线前review

    ---------------------

    原文:https://blog.csdn.net/huazhongkejidaxuezpp/article/details/67018676

     

    二、Mock测试方式

    1. Mock Server-Moco

    这是一个jar包,只要执行该jar包,指定配置文件,就可开启一个http服务器提供服务,并且修改配置文件后也无需重启服务,支持动态加载。我使用的是moco-runner-0.10.2-standalone.jar,运行方式如下:

    ```java -jar moco-runner-0.10.2-standalone.jar start -p 8080 -c XXX.json```

    XXX.json就是我们的mock配置文件,比如:

    [     {         "description": "api 1",         "request" :{             "method" : "get",         "uri" : "/foo"         },         "response": {             "json": {"foo":"bar"}         }     } ]

     

    以上就可以实现当我们访问127.0.0.0:8080/foo时,返回一个json为{"foo":"bar"}。

    具体其他使用方法请参照官方文档:https://github.com/dreamhead/moco/blob/master/moco-doc/apis.md

     

    2. fiddler

    fiddler大家都很熟了,在windows环境可以随便自定义返回内容,但一个很大的缺点是,它不跨平台,而我们平时的很多场景下,是需要在Linux下进行mock的。

    还有一些其他mock工具,大多都是通过编写js代码或者python、java等代码来达到mock目的,此处就不再介绍了。

     

    在选择mock工具时,可参考以下几个方面:

    一是数据要好管理,别让我管理一堆文件;

    二是mock接口最好可以设置成和真实接口完全一致,这样就只需要切换hosts就可以切换mock接口和真实接口,不需要修改代码;

    三是跨平台,mock接口在windows和Linux下都需要可用。至于跨域、动态加载什么的,这是必须条件。

     

    三、Mock测试示例

    1、使用Fiddler进行Mock测试

    ------这种调试方式适用于rest接口调试,web界面调试等。

    测试工程师在做测试时,也需要服务器返回一些特殊的数据来做测试,使用 Fiddler AutoResponder功能来伪造测试数据(创建虚拟对象),能大大减少测试工程师的工作量。

    1.1 Fiddler AutoResponder工作原理

    使用Fiddler可以替换自动返回的一个【伪造】的HTTP响应,这与使用断点修改HTTP响应类似,只不过AutoResponder是自动的,操作更加方便。即,浏览器发出的HTTP请求并没有到达服务器,而是被Fiddler直接返回了一个【伪造】的HTTP响应。

     

    1.2 使用Fiddler进行Mock测试

    (1)接口抓包-----找到要mock的接口

    以掘金首页为例,找到下面的接口 https://gold-tag-ms.juejin.im/v1/categories

    (2)复制接口数据到本地

    在接口上进行右键点击,选择save -> …and Open as Local File -> 默认会保存至桌面,示例中的数据,保存到了桌面的test.json

    (3)修改数据

    修改保存到本地的json文件,示例中仅修改了页面的标签数据。

    (4)替换json文件

    在web session 面板中找到对应的请求,然后将其拖到AutoResponder面板中,在RuleEditor中单击“Find a file...”,选择本地json文件的路径。

    (5)激活规则

    选中“Enable rules”,激活规则。选中“Unmatched requests passthrough",放行不匹配的HTTP请求。

    (6)save,刷新页面

    单击“Save”按钮。只需修改本地保存的json文件,然后刷新浏览器(或直接访问接口),就可以看到效果了。

    *PS:部分内容根据网上资源整理,此博客仅作个人学习使用。

     

     

    展开全文
  • 如何使用mock

    万次阅读 2018-05-09 16:48:19
    mock大法好mock是一个模拟数据生成器,旨在帮助前端独立于后端进行开发,帮助编写单元测试。mock有如下功能根据数据模板生成模板数据模拟ajax请求,生成请求数据基于html模板生成模拟数据下载安装npm install mockjs...

    mock大法好

    mock是一个模拟数据生成器,旨在帮助前端独立于后端进行开发,帮助编写单元测试。mock有如下功能

    • 根据数据模板生成模板数据

    • 模拟ajax请求,生成请求数据

    • 基于html模板生成模拟数据

    下载安装

    npm install mockjs
    
    //使用mock
    var Mock = require('mockjs');
    var mcok = Mock.mock({
        ...
    })

    mock的语法

    mock的语法规范包含两层规范

    • 数据模板 (DTD)

    • 数据占位符 (DPD)

    数据模板DTD

    末班规则:‘name|rule’:value

    • name:属性名

    • rule:属性规则

    • value:属性值

    属性名和规则之间用|隔开,规则是可以选的。 
    一共七个rule

    1. ‘name|mix-max’:value

    2. 'name|count':value

    3. 'name|mix-max.dmix-dmax':value

    4. 'name|min-max.dcount':value

    5. 'name|count.dmin-dmax':value

    6. 'name|count.dcount':value

    7. 'name|+step':value

    生成规则需要根据属性值的类型才能确定 
    属性值可以含有@占位符 
    属性值还可以指定最终值的初始值和类型

    属性值是String

    var data = Mock.mock({
        'name1|1-3':'a',       //重复生成1到3个a
        'name2|2':'b'            //生成bb
    })

    属性值是Number

    var data = Mock.mock({
        'name1|+1':4,         //生成4,如果循环每次加1
        ‘name2|1-7':2,        //生成一个数字,1到7之间
        'name3|1-4.5-8':1     
        //生成一个小数,整数部分1到4,小数部分5到8位
    })

    注意第三个是小数点之后的数位范围,另外其实属性值是Number的时候,value没什么用。

    属性值是Boolean

    var data = Mock.mock({
        'name|1':true,          //生成一个布尔值,各一半
        'name1|1-3':true        //1/4true3/4false
    })

    属性值是Object

    var obj = {
        a:1,
        b:2,
        c:3,
        d:4
    }
    var data = Mock.mock({
        'name|1-3':obj,      //随机从obj中寻找1到3个属性,新对象
        'name|2':obj         //随机从onj中找到两个属性,新对象
    })

    属性值是Array

    var arr = [1,2,3];
    var data = Mock.mock({
        'name1|1':arr,          //从数组里随机取出1个值
        'name2|2':arr,          //数组重复count次,这里count为2
        'name3|1-3':arr,        //数组重复13次
    })

    属性值是Function

    var fun = function(x){
        return x+10;
    }
    var data = Mock.mock({
        'name':fun(10)         //返回函数的返回值20
    })

    属性值为RegExp

    根据正则表达式反向生成对应的字符串,用于生成自定义格式的字符串

    var data = Mock.mock({
        ‘name1':/[a-z][A-Z]/,
        'name2':/\d{1,3}/
    })

    会根据各自的正则表达式进行适配,并且随机返回

    数据占位符DPD

    关于占位符,占位符只是在属性值是字符串的时候,在字符串里占个位置,并不会出现在最终的属性值中。 
    占位符的格式为:

    @占位符

    关于占位符需要知道以下几点

    1. 用@标识符标识后面的字符串是占位符

    2. 占位符的值是从Mock.Random方法中引用的

    3. 可以通过Mock.Random.extend()来扩展自定义占位符

    4. 占位符可以引用数据模板中的属性

    5. 占位符优先引用数据模板中的属性

    6. 占位符支持相对路径和决定路径

    var data = Mock.mock({
        name:{
            name1:'@FIRST',
            name2:'@LAST'
        }    
    })

    语法大概是这样,random会重点分析的。

    Mock.mock()

    这是mock的核心方法,用于生成模拟数据,前边的例子中我们都已经见识过了。 
    Mock.mock(rurl?,rtype?,template|function(opt))

    • rurl:ajax请求的地址

    • rtype:ajax请求的类型,如’GET','POST'

    • template:数据模板,就是之前那些个例子

    • function:生成相应数据的函数

    具体的应用情况在下边:

    1. Mock.mock(template)

    2. Mock.mock(rurl,template),模拟ajax,匹配接收到url的ajax请求,把template对应的数据返回返回

    3. Mock.mock(rurl,function(opt)),模拟ajax,会把函数执行的结果作为ajax回调返回

    4. Mock.mock(rurl,rtype,template) 同上,只是对ajax的类型有要求

    5. Mock.mock(rurl,rtype,function) 同上

    Mock.setup(setting)

    配置拦截ajax请求的行为,支持的配置项有timeout。

    Mock.setup({
        timeout:200
    })
    Mock.setup({
        timeout:'200-500
    })

    这个现在仅用于配置ajax请求,以后可能会扩展

    Mock.valid(template,data)

    这个函数用来判断,数据模板和数据是否一样,

    Mock.toJSONShema(template)

    var template = Mock.mock({
        'name|1-3':5
    })
    var tjs = Mock.toJSONSchema(tempalte);

    把template风格的模板转成JSON Schema。具体的结果,自己看吧,不贴了。


    接下来是最后一个方法

    Mock.Random

    这是一个工具类,用于生成各种类型的数据。 
    Mock.Random的方法在模板数据中被称为占位符,之前说过的

    用法示例:

    var Random = Mock.Random;
    var em1 = Mock.email();
    var em2 = Mock.mock('@email');
    var em3 = Mock.mock({
        email:'@email'
    })

    Mock.Random提供的完成方法

    TypeMethod
    Basicboolean natural integer float character string date datename now
    Datedate datetime time now
    Imageimage dataImage
    Colorcolor hex rgb rgba hsl
    Textparagraph sentence word title cparagraph csentence cword ctitle
    Namefirst last name cfirst clast cname
    Weburl domain email ip tld
    Addressarea region city county zip
    Helpercapitalize upper lower pick shuffle
    Miscellaneousguid id

    Basic

    Random.boolean(min?max?current?)

    随机生成布尔值

    var bool1 = Random.boolean();      //true false各一半
    var bool2 = Random.boolean(1,2false)    //1/3的可能性是false 2/3true

    Random.natural(min?,max?)

    随机生成一个自然数,什么叫自然数,就是大于等于0的

    var natural1 = Random.natural();       //默认值最大为 9007199254740992
    var natural2 = Random.natural(4);         //随机出来的最小值是4
    var natural3 = Random.natural(6,9);

    Random.Integer(min?,max?)

    生成一个随机的整数,可以是负数。

    var integer1 = Random.integer();
    var integer2 = Random.integer(-10);        //随机最小值是-10
    var integer3 = Random.integer(-10,20);

    Random.float(min?,max?,dmin?,dmax?)

    随机生成一个小数浮点数,四个参数分别为,整数部分最小值最大值,小数部分最小值最大值。

    var float1 = Random.float();
    var float2 = Random.float(3,8);
    var float3 = Random.float(1,3,5,7)

    Random.character(pool?)

    随机生成一个字符,pool的值可以是:

    • upper: 26个大写字母

    • lower: 26个小写字母

    • number: 0到9十个数字

    • sympol: "!@#$%^&*()[]"

    var character1 = Random.character();
    var character2 = Random.character('lower');
    var character3 = Random.character('upper');
    var character4 = Random.character('symbol');

    Random.string(pool?,min?,max?)

    随机生成一个字符串,pool的值同上边四个。

    var str1 = Random.string();                //长度3到7位
    var str2 = Random.string(5);               //长度5位
    var str3 = Random.string('lower',7);       //长度7位,小写
    var str4 = Random.string(4,6);             //长度4到
    var str5 = Random.string('新的字符串会从这里选择45位',4,6);   //从第一个参数里选择4到5位

    Random.range(start?,stop,step?)

    返回一个整型数组

    • start,可选,数组起始值,闭区间

    • stop,必选,数据结束值,开区间

    • step,可选,数据每一项间隔值

    var range1 = Random.range(10);     //[0,1,2,3,4,5,6,7,8,9]
    var range2 = Random.range(14,20);  //[14,15,16,17,18,19]
    var range3 = Random.range(3,13,2); //[3,5,7,9,11]

    Date

    Random.date(format?)

    返回一个随机日期的字符串 
    format的格式是‘yyyy-MM-dd’,可以随机组合

    var date1 = Random.date();
    var date2 = Random.date('yyyy-MM-dd');
    var date3 = Random.date('y-M-d');
    var date4 = Random.date('yy-MM-dd');

    Random.time(format?)

    返回时间字符串
    format的格式是‘HH-mm-ss’

    var time1 = Random.time();
    var time2 = Random.time('HH-mm-ss');
    var time3 = Random.time('J-m-s');

    Random.datetime(format?)

    上边两个的结合版

    var dt1 = Random.datetime();
    var dt2 = Random.datetime('yyyy-MM-dd HH-mm-ss');

    Random.now(unit?,format?)

    返回当前时间的字符串

    Image

    一般情况下,使用dataImage更好,因为更简单,但是如果要生成高度自定义的图片,则最好用image。另外,dataImage生成的是base64编码

    Random.image(size?,background?,foreground?,format?text?)

    • size 图片宽高,格式是'宽x高'

    • background:图片的背景色,默认值#000000

    • foreground:图片的文字前景色,默认#FFFFFF

    • format:图片的格式,默认'.png'

    • text:图片上的默认文字,默认值为参数size

    其中size的取值范围是

    [
    '300x250', '250x250', '240x400', '336x280', 
    '180x150', '720x300', '468x60', '234x60', 
    '88x31', '120x90', '120x60', '120x240', 
    '125x125', '728x90', '160x600', '120x600', 
    '300x600'
    ]
    

    图片的格式可以选择.png .gif .jpg

    var image1 = Random.image();
    var image2 = Random.image('128x90');
    var image3 = Random.image('120x660','#ccc');    //前景色#ccc
    var image4 = Random.image('226x280','#eee','第三个参数是文字不是前景色');
    var image5 = Random.image('66x31','#ddd','#123456','四个参数的时候第三个参数是前景色');
    var image6 = Random.image('240x400','#333','#1483dc','.gif','全部参数的情况下'); 

    Random.dataImage(size?,text?)

    返回一段base64编码,两个参数同上。

    var di1 = Random.dataImage();
    var di2 = Random.datImage('300x600');
    var di3 = Random.dataImage('180x150','hahahaha');

    Color

    Random.color()

    有好几个相关的方法

    var color = Random.color(); 格式'#rrggbb'
    var hex = Random.hex();   //好像和color没什么不同
    var rgb = Random.rgb();   //生成格式如rgb(133,233,244)
    var rgba = Random.rgba(); //生成个事如rgba(111,222,233,0.5)
    var hsl = Random.hsl();   //生成格式(345,82,71)

    Text

    Random.paragraph(in?,max?,len?)

    随机生成一段文本,

    var para1 = Random.paragraph();    //随机生成一短文本,范围3到7
    var para2 = Random.paragraph(10);  //随机生成长度是10的文本
    var para3 = Random.paragraph(9,12); //随机生成9到11位长度的文本

    Random.sentence(min?,max?,len?)

    随机生成一个句子,第一个单词的首字母大写

    var sen1 = Random.sentence();        //默认长度12到18
    var sen2 = Random.sentence(10);      //随机生成一个单词个数为10的句子
    var sen3 = Random.sentence(5,10);    //随机生成一个5到9单词个数的句子

    Random.word(min?,max?,len?)

    随机生成一个单词

    var word1 = Random.word();          //默认长度3到10
    var word2 = Random.word(7);         //随机生成长度是7的单词
    var word3 = Random.word(2,12);      //随机生成2到11位长度的单词

    Random.title(min?,max?,len?)

    随机生成一段标题,每个单词的首字母大写

    var title1 = Random.title();        //title中的单词个数
    var title2 = Random.title(6);       //title六个单词
    var title3 = Random.title(7,12);    //title7到11个单词

    另外还有四个方法,四个方法前边加一个

    c,Random.cparagraph, 返回中文文本

    Random.csentence, 返回中文句子

    Random.cword, 返回中文文字

    Random.ctitle. 返回中文标题

    Name

    var first = Random.first()         随机生成常见英文名
    var last = Random.last()           随机生成常见英文姓
    var name = Random.name()           随机生成常见英文姓名
    var cfirst = Random.cfirst()       随机生成常见中文姓
    var clast = Random.clast()         随机生成常见中文名
    var cname = Random.cname()         随机生成一个常见中文姓名

    Web

    Random.url(protocol?,host?)

    随机生成一个url 
    protocol可选参数,表示网络协议,如http。 
    host表示域名和端口号

    var url1 = Random.url();
    var url2 = Random.url('http');
    var url3 = Random.url('http','58.com');

    Random.protocol()

    随机生成一个域名

    var protocol = Random.protocol()

    protocol可以选的值,'http'、'ftp'、'gopher'、'mailto'、'mid'、'cid'、'news'、'nntp'、'prospero'、'telnet'、'rlogin'、'tn3270'、'wais'。

    Random.domin()

    随机生成一个域名

    Random.tld()

    随机生成一个顶级域名

    var domain = Random.domain()
    var tld = Random.tld()

    Random.email(domain?)

    随机生成一个email地址,domain表示域名

    var email1 = Random.email();
    var email2 = Random.email('58.com')     //生成xxxx@58.com

    Random.ip()

    随机生成一个ip地址

    var ip = Random.ip()

    Address

    Random.region()

    随机生成一个中国的大区,如华北,西南

    var region = Random.region();

    Random.province()

    随机生成一个中国省直辖市自治区特别行政区

    var province = Random.province()

    Random.city(prefix?)

    随机生成一个中国城市,prefix布尔值,表示是否标注所在省

    var city1 = Random.city();
    var city2 = Random.city(ture);

    Random.country(prefix?)

    随机生成一个中国县,prefix布尔值,表示是否显示所属的省市

    var county1 = Random.county();
    var county2 = Random.county(ture);

    Random.zip()

    随机生成一个六位数邮政编码

    var zip = Random.zip();

    Helper

    Random.capitlize(word)

    把第一个字母转成大写

    var capitalize = Random.capitalize('hello')

    Random.upper(str)

    转成大写

    var upper = Random.upper('zhang');

    Random.lower(str)

    转成小写

    var lower = Random.lower('JINGWEI');

    Random.pick(arr)

    从数组中随机选取一个元素

    var arr = [1,4,5,6,7,8];
    var pick = Random.pick(arr);

    Random.shuffle(arr);

    打乱数组的顺序并返回

    var arr  = [1,2,3,4,6];
    var shuffle = Random.shuffle(arr);

    Miscellaneous

    Random.guid()

    随机生成一个GUID

    Random.id()

    随机生成一个18位身份证id

    var guid = Random.guid();
    var id = Random.id();
    展开全文
  • Mock介绍

    万次阅读 2018-09-19 13:48:35
    mock的定义(what): mock是在测试过程中,对于一些不容易构造/获取的对象,创建一个mock对象来模拟对象的行为 为什么要使用mock(why): 在做单元测试过程中,经常会有以下的场景: class A 依赖 ...
    • mock的定义(what):

      mock是在测试过程中,对于一些不容易构造/获取的对象,创建一个mock对象来模拟对象的行为

    • 为什么要使用mock(why):
      在做单元测试过程中,经常会有以下的场景:

    class A 依赖 class B
    
    class B 依赖 class C和class D
    
    class C 依赖 ...
    
    class D 依赖 ...
    
    1.被测对象依赖的对象构造复杂
    
    我们想对class A进行单元测试,需要构造大量的class B、C、D等依赖对象,他们的构造过程复杂(体现在构造步骤多、耗时较长),这时我们可以利用mock去构造虚拟的class B、C、D对象用于class A的测试,因为我们只是想测试class A的行为是否符合预期,我们并不需要测试依赖对象。
    
    2.被测单元依赖的模块尚未开发完成,而被测对象需要依赖模块的返回值进行测试:
    
    ----- 比如service层的代码中,包含对dao层的调用,但dao层代码尚未开发
    ----- 比如web的前端依赖后端接口获取数据进行联调测试,但后端接口并未开发完成
    
    • 哪些时机和场合需要使用mock(when&where)
    1.单元测试/接口测试中测试对象依赖其他对象,这些对象的构造复杂、耗时或者根本无法构造(未交付)
    2.我们只测试对象内部逻辑的质量,不关心依赖对象的逻辑正确性和稳定性
    
    • 是否应该在测试中使用mock,投入产出比如何(how much)

    我们可以基于以下2个原则去做mock,这样的mock的投入产出比是最高的

    1.不需要对所有的依赖对象/服务进行mock,只对那些构造步骤复杂、构造耗时较长、不稳定的依赖对象/服务进行mock。
    2.如果做分层测试(比如分层自动化),高层的测试设计可以基于以下假设:低层的测试已保证低层对象的质量,高层对低层的依赖可以mock,无需关心所依赖的低层对象的质量。
    
    • Local Mock和Remote Mock
      Local Mock和Remote Mock的区别在于依赖对象的行为调用是本地/远程调用

    1.Mock本地依赖对象
    如果依赖对象的调用是本地调用,就属于Local Mock。EasyMock/Mockito都可以实现对本地依赖对象的Mock。

    2.Remote Mock
    如果被测对象依赖对象的是一些远程服务(HTTP/RPC服务),就属于Remote Mock,Remote Mock一般实现对指定的服务/接口客户端(消费者)进行Mock。可以通过Mock Server等方式去实现。

    被测对象和依赖对象/服务的关系

     

    Local&Remote Mock

    • LocalMock相当于使用Mock对象替换依赖对象。
    • RemoteMock相当于使用MockServer替换真实的HTTP/RPC Server。

    Mock工具

    1.EasyMock

    EasyMock简介和代码示例

    2.Mockito

    Mockito简介和代码示例

    3.PowerMock
    PowerMock



    作者:测试你个头
    链接:https://www.jianshu.com/p/3944c0b82f30

    展开全文
  • mock

    万次阅读 2018-12-23 21:28:16
    个人的理解是mock是用来模拟数据的。 Mock测试的目的两个:(1)验证方法调用;(2)指定某个方法的返回值,或者是执行特定的动作 下载安装 npm install mockjs //使用mock var Mock = require('mockjs'); ...

    个人的理解是mock是用来模拟数据的。

    Mock测试的目的两个:(1)验证方法调用;(2)指定某个方法的返回值,或者是执行特定的动作

    下载安装

    npm install mockjs
    
    //使用mock
    var Mock = require('mockjs');
    var mcok = Mock.mock({
        ...
    })

    mock的语法

    mock的语法规范包含两层规范

    • 数据模板 (DTD)

    • 数据占位符 (DPD)

    数据模板DTD

    末班规则:‘name|rule’:value

    • name:属性名

    • rule:属性规则

    • value:属性值

    属性名和规则之间用|隔开,规则是可以选的。 
    一共七个rule

    1. ‘name|mix-max’:value

    2. 'name|count':value

    3. 'name|mix-max.dmix-dmax':value

    4. 'name|min-max.dcount':value

    5. 'name|count.dmin-dmax':value

    6. 'name|count.dcount':value

    7. 'name|+step':value

    生成规则需要根据属性值的类型才能确定 
    属性值可以含有@占位符 
    属性值还可以指定最终值的初始值和类型

    属性值是String

    var data = Mock.mock({
        'name1|1-3':'a',       //重复生成1到3个a
        'name2|2':'b'            //生成bb
    })

    属性值是Number

    var data = Mock.mock({
        'name1|+1':4,         //生成4,如果循环每次加1
        ‘name2|1-7':2,        //生成一个数字,1到7之间
        'name3|1-4.5-8':1     
        //生成一个小数,整数部分1到4,小数部分5到8位
    })

    注意第三个是小数点之后的数位范围,另外其实属性值是Number的时候,value没什么用。

    属性值是Boolean

    var data = Mock.mock({
        'name|1':true,          //生成一个布尔值,各一半
        'name1|1-3':true        //1/4是true,3/4是false
    })

    属性值是Object

    var obj = {
        a:1,
        b:2,
        c:3,
        d:4
    }
    var data = Mock.mock({
        'name|1-3':obj,      //随机从obj中寻找1到3个属性,新对象
        'name|2':obj         //随机从onj中找到两个属性,新对象
    })

    属性值是Array

    var arr = [1,2,3];
    var data = Mock.mock({
        'name1|1':arr,          //从数组里随机取出1个值
        'name2|2':arr,          //数组重复count次,这里count为2
        'name3|1-3':arr,        //数组重复1到3次
    })

    属性值是Function

    var fun = function(x){
        return x+10;
    }
    var data = Mock.mock({
        'name':fun(10)         //返回函数的返回值20
    })

    属性值为RegExp

    根据正则表达式反向生成对应的字符串,用于生成自定义格式的字符串

    var data = Mock.mock({
        ‘name1':/[a-z][A-Z]/,
        'name2':/\d{1,3}/
    })

    会根据各自的正则表达式进行适配,并且随机返回

    数据占位符DPD

    关于占位符,占位符只是在属性值是字符串的时候,在字符串里占个位置,并不会出现在最终的属性值中。 
    占位符的格式为:

    @占位符

    关于占位符需要知道以下几点

    1. 用@标识符标识后面的字符串是占位符

    2. 占位符的值是从Mock.Random方法中引用的

    3. 可以通过Mock.Random.extend()来扩展自定义占位符

    4. 占位符可以引用数据模板中的属性

    5. 占位符优先引用数据模板中的属性

    6. 占位符支持相对路径和决定路径

    var data = Mock.mock({
        name:{
            name1:'@FIRST',
            name2:'@LAST'
        }    
    })

    语法大概是这样,random会重点分析的。

    Mock.mock()

    这是mock的核心方法,用于生成模拟数据,前边的例子中我们都已经见识过了。 
    Mock.mock(rurl?,rtype?,template|function(opt))

    • rurl:ajax请求的地址

    • rtype:ajax请求的类型,如’GET','POST'

    • template:数据模板,就是之前那些个例子

    • function:生成相应数据的函数

    具体的应用情况在下边:

    1. Mock.mock(template)

    2. Mock.mock(rurl,template),模拟ajax,匹配接收到url的ajax请求,把template对应的数据返回返回

    3. Mock.mock(rurl,function(opt)),模拟ajax,会把函数执行的结果作为ajax回调返回

    4. Mock.mock(rurl,rtype,template) 同上,只是对ajax的类型有要求

    5. Mock.mock(rurl,rtype,function) 同上

    Mock.setup(setting)

    配置拦截ajax请求的行为,支持的配置项有timeout。

    Mock.setup({
        timeout:200
    })
    Mock.setup({
        timeout:'200-500
    })

    这个现在仅用于配置ajax请求,以后可能会扩展

    Mock.valid(template,data)

    这个函数用来判断,数据模板和数据是否一样,

    Mock.toJSONShema(template)

    var template = Mock.mock({
        'name|1-3':5
    })
    var tjs = Mock.toJSONSchema(tempalte);

    把template风格的模板转成JSON Schema。具体的结果,自己看吧,不贴了。


    接下来是最后一个方法

    Mock.Random

    这是一个工具类,用于生成各种类型的数据。 
    Mock.Random的方法在模板数据中被称为占位符,之前说过的

    用法示例:

    var Random = Mock.Random;
    var em1 = Mock.email();
    var em2 = Mock.mock('@email');
    var em3 = Mock.mock({
        email:'@email'
    })

    Mock.Random提供的完成方法

    Type Method
    Basic boolean natural integer float character string date datename now
    Date date datetime time now
    Image image dataImage
    Color color hex rgb rgba hsl
    Text paragraph sentence word title cparagraph csentence cword ctitle
    Name first last name cfirst clast cname
    Web url domain email ip tld
    Address area region city county zip
    Helper capitalize upper lower pick shuffle
    Miscellaneous guid id

    Basic

    Random.boolean(min?max?current?)

    随机生成布尔值

    var bool1 = Random.boolean();      //true false各一半
    var bool2 = Random.boolean(1,2,false)    //1/3的可能性是false 2/3是true

    Random.natural(min?,max?)

    随机生成一个自然数,什么叫自然数,就是大于等于0的

    var natural1 = Random.natural();       //默认值最大为 9007199254740992
    var natural2 = Random.natural(4);         //随机出来的最小值是4
    var natural3 = Random.natural(6,9);

    Random.Integer(min?,max?)

    生成一个随机的整数,可以是负数。

    var integer1 = Random.integer();
    var integer2 = Random.integer(-10);        //随机最小值是-10
    var integer3 = Random.integer(-10,20);

    Random.float(min?,max?,dmin?,dmax?)

    随机生成一个小数浮点数,四个参数分别为,整数部分最小值最大值,小数部分最小值最大值。

    var float1 = Random.float();
    var float2 = Random.float(3,8);
    var float3 = Random.float(1,3,5,7)

    Random.character(pool?)

    随机生成一个字符,pool的值可以是:

    • upper: 26个大写字母

    • lower: 26个小写字母

    • number: 0到9十个数字

    • sympol: "!@#$%^&*()[]"

    var character1 = Random.character();
    var character2 = Random.character('lower');
    var character3 = Random.character('upper');
    var character4 = Random.character('symbol');

    Random.string(pool?,min?,max?)

    随机生成一个字符串,pool的值同上边四个。

    var str1 = Random.string();                //长度3到7位
    var str2 = Random.string(5);               //长度5位
    var str3 = Random.string('lower',7);       //长度7位,小写
    var str4 = Random.string(4,6);             //长度4到
    var str5 = Random.string('新的字符串会从这里选择4到5位',4,6);   //从第一个参数里选择4到5位

    Random.range(start?,stop,step?)

    返回一个整型数组

    • start,可选,数组起始值,闭区间

    • stop,必选,数据结束值,开区间

    • step,可选,数据每一项间隔值

    var range1 = Random.range(10);     //[0,1,2,3,4,5,6,7,8,9]
    var range2 = Random.range(14,20);  //[14,15,16,17,18,19]
    var range3 = Random.range(3,13,2); //[3,5,7,9,11]

    Date

    Random.date(format?)

    返回一个随机日期的字符串 
    format的格式是‘yyyy-MM-dd’,可以随机组合

    var date1 = Random.date();
    var date2 = Random.date('yyyy-MM-dd');
    var date3 = Random.date('y-M-d');
    var date4 = Random.date('yy-MM-dd');

    Random.time(format?)

    返回时间字符串
    format的格式是‘HH-mm-ss’

    var time1 = Random.time();
    var time2 = Random.time('HH-mm-ss');
    var time3 = Random.time('J-m-s');

    Random.datetime(format?)

    上边两个的结合版

    var dt1 = Random.datetime();
    var dt2 = Random.datetime('yyyy-MM-dd HH-mm-ss');

    Random.now(unit?,format?)

    返回当前时间的字符串

    Image

    一般情况下,使用dataImage更好,因为更简单,但是如果要生成高度自定义的图片,则最好用image。另外,dataImage生成的是base64编码

    Random.image(size?,background?,foreground?,format?text?)

    • size 图片宽高,格式是'宽x高'

    • background:图片的背景色,默认值#000000

    • foreground:图片的文字前景色,默认#FFFFFF

    • format:图片的格式,默认'.png'

    • text:图片上的默认文字,默认值为参数size

    其中size的取值范围是

    [
    '300x250', '250x250', '240x400', '336x280', 
    '180x150', '720x300', '468x60', '234x60', 
    '88x31', '120x90', '120x60', '120x240', 
    '125x125', '728x90', '160x600', '120x600', 
    '300x600'
    ]
    

    图片的格式可以选择.png .gif .jpg

    var image1 = Random.image();
    var image2 = Random.image('128x90');
    var image3 = Random.image('120x660','#ccc');    //前景色#ccc
    var image4 = Random.image('226x280','#eee','第三个参数是文字不是前景色');
    var image5 = Random.image('66x31','#ddd','#123456','四个参数的时候第三个参数是前景色');
    var image6 = Random.image('240x400','#333','#1483dc','.gif','全部参数的情况下'); 

    Random.dataImage(size?,text?)

    返回一段base64编码,两个参数同上。

    var di1 = Random.dataImage();
    var di2 = Random.datImage('300x600');
    var di3 = Random.dataImage('180x150','hahahaha');

    Color

    Random.color()

    有好几个相关的方法

    var color = Random.color(); 格式'#rrggbb'
    var hex = Random.hex();   //好像和color没什么不同
    var rgb = Random.rgb();   //生成格式如rgb(133,233,244)
    var rgba = Random.rgba(); //生成个事如rgba(111,222,233,0.5)
    var hsl = Random.hsl();   //生成格式(345,82,71)

    Text

    Random.paragraph(in?,max?,len?)

    随机生成一段文本,

    var para1 = Random.paragraph();    //随机生成一短文本,范围3到7
    var para2 = Random.paragraph(10);  //随机生成长度是10的文本
    var para3 = Random.paragraph(9,12); //随机生成9到11位长度的文本

    Random.sentence(min?,max?,len?)

    随机生成一个句子,第一个单词的首字母大写

    var sen1 = Random.sentence();        //默认长度12到18
    var sen2 = Random.sentence(10);      //随机生成一个单词个数为10的句子
    var sen3 = Random.sentence(5,10);    //随机生成一个5到9单词个数的句子

    Random.word(min?,max?,len?)

    随机生成一个单词

    var word1 = Random.word();          //默认长度3到10
    var word2 = Random.word(7);         //随机生成长度是7的单词
    var word3 = Random.word(2,12);      //随机生成2到11位长度的单词

    Random.title(min?,max?,len?)

    随机生成一段标题,每个单词的首字母大写

    var title1 = Random.title();        //title中的单词个数
    var title2 = Random.title(6);       //title六个单词
    var title3 = Random.title(7,12);    //title7到11个单词

    另外还有四个方法,四个方法前边加一个

    c,Random.cparagraph, 返回中文文本

    Random.csentence, 返回中文句子

    Random.cword, 返回中文文字

    Random.ctitle. 返回中文标题

    Name

    var first = Random.first()         随机生成常见英文名
    var last = Random.last()           随机生成常见英文姓
    var name = Random.name()           随机生成常见英文姓名
    var cfirst = Random.cfirst()       随机生成常见中文姓
    var clast = Random.clast()         随机生成常见中文名
    var cname = Random.cname()         随机生成一个常见中文姓名

    Web

    Random.url(protocol?,host?)

    随机生成一个url 
    protocol可选参数,表示网络协议,如http。 
    host表示域名和端口号

    var url1 = Random.url();
    var url2 = Random.url('http');
    var url3 = Random.url('http','58.com');

    Random.protocol()

    随机生成一个域名

    var protocol = Random.protocol()

    protocol可以选的值,'http'、'ftp'、'gopher'、'mailto'、'mid'、'cid'、'news'、'nntp'、'prospero'、'telnet'、'rlogin'、'tn3270'、'wais'。

    Random.domin()

    随机生成一个域名

    Random.tld()

    随机生成一个顶级域名

    var domain = Random.domain()
    var tld = Random.tld()

    Random.email(domain?)

    随机生成一个email地址,domain表示域名

    var email1 = Random.email();
    var email2 = Random.email('58.com')     //生成xxxx@58.com

    Random.ip()

    随机生成一个ip地址

    var ip = Random.ip()

    Address

    Random.region()

    随机生成一个中国的大区,如华北,西南

    var region = Random.region();

    Random.province()

    随机生成一个中国省直辖市自治区特别行政区

    var province = Random.province()

    Random.city(prefix?)

    随机生成一个中国城市,prefix布尔值,表示是否标注所在省

    var city1 = Random.city();
    var city2 = Random.city(ture);

    Random.country(prefix?)

    随机生成一个中国县,prefix布尔值,表示是否显示所属的省市

    var county1 = Random.county();
    var county2 = Random.county(ture);

    Random.zip()

    随机生成一个六位数邮政编码

    var zip = Random.zip();

    Helper

    Random.capitlize(word)

    把第一个字母转成大写

    var capitalize = Random.capitalize('hello')

    Random.upper(str)

    转成大写

    var upper = Random.upper('zhang');

    Random.lower(str)

    转成小写

    var lower = Random.lower('JINGWEI');

    Random.pick(arr)

    从数组中随机选取一个元素

    var arr = [1,4,5,6,7,8];
    var pick = Random.pick(arr);

    Random.shuffle(arr);

    打乱数组的顺序并返回

    var arr  = [1,2,3,4,6];
    var shuffle = Random.shuffle(arr);

    Miscellaneous

    Random.guid()

    随机生成一个GUID

    Random.id()

    随机生成一个18位身份证id

    var guid = Random.guid();
    var id = Random.id();
    展开全文
  • Mock测试-优缺点分析

    万次阅读 2019-01-15 17:26:43
    1、什么是Mock ? 2、为什么要做Mock ?  3、Mock的优缺点分析 4、具体如何使用mock 1、什么是Mock ? 用一句通俗的语言来说: mock测试就是在测试过程中,对于某些不容易构造或者不容易获取的对象,用一个虚拟...
  • Mock方法介绍

    千次阅读 2018-06-14 17:31:01
    1 现有的单元测试框架单元测试是保证程序正确性的一种有效的测试手段,对于不同的开发语言,通常都能找到相应的单元框架。借助于这些单测框架的帮助,能够使得我们编写单元测试用例的过程变得便捷而优雅。...
  • mock数据学习

    千次阅读 2018-09-01 19:00:07
    @[mock.js|easy mock|rap2|api|前后台分离|模拟数据] 背景     在实际的项目研发过程中,我们经常会遇到如下的尴尬场景: 前端开发依赖于后端接口数据,...
  • 有效使用Mock编写java单元测试

    万次阅读 多人点赞 2014-02-18 16:18:26
    Java单元测试对于开发人员质量保证至关重要,尤其当面对一团乱码的遗留代码时,没有高覆盖率的单元测试做保障,没人敢轻易对代码...令人欣慰的是开源社区各种优秀的Mock框架让单元测试不再复杂,本文简单介绍EasyMoc
  • Postman mockserver详细教程

    万次阅读 2018-06-04 20:24:48
    1.发送一个request发送请求之后在History标签下保存了请求的数据,但是没有保存response 数据2.将request保存到一个Collection中点击Save 按钮,将请求数据保存到Collection中弹出对话框,编辑请求名称和接口描述,...
  • 项目用的 react+dva,由于后端接口还没有好,所以需要用mock创数据,拦载 ajax ,返回 mock 里面的数据。那么问题来了,怎么用 mock 呢?看了官方文档,我表示没有看明白。问团儿,这个问题,团儿解答:在你现在的...
  • 1.最近在写一个uni-app商城项目,在于微信交互获取授权登录的时候需要获取code然后回传给...Easy Mock 官网地址:https://www.easy-mock.com/ 注册后登录 点击/exmple 点击创建接口,将数据格式粘贴进去,填写u...
  • 使用Mockito中@Mock快速创建mock对象

    千次阅读 2014-06-25 00:19:06
    1. 快速创建Mock对象: 我们创建mockdui'xiang
  • 之前一直对这两个注解的区别不是很明白。 搜到过一篇博客园的文章举例说明了代码行为的区别。...@InjectMocks: 创建一个实例,其余用@Mock(或@Spy)注解创建的mock将被注入到用该实例中。 注意:必须使用@
  • Yapi 高级mock简单使用

    万次阅读 2018-11-01 17:27:56
    MOCK 测试,在测试过程中,对于某些不容易模拟的场景或者是不容易获取的测试数据,使用MOCK 来方便测试。 此处使用Yapi 的高级MOCK ,高级mock有2中方式,期望和脚本。 先使用第一种方式,期望。在已经写好的一...
  • Mock.JS拦截HTTP请求的问题

    万次阅读 2018-03-05 12:08:07
    Mock.JS拦截HTTP请求的问题 ...实现在无后端的情况下,...Mock的基础使用也是比较简单:Mock.JS官网 但,在引入MockJS时, import Mock from 'mockjs' 会拦截所有前端发出的HTTP请求,无论是否使用Mock.mock开启Moc...
  • Java中使用Mock测试

    千次阅读 2018-08-13 20:17:39
    1、Mock的概念:  Mock一词是指“模拟,虚拟”的意思,所谓的Mock测试就是指在测试过程中,模拟出那些不容易获取或者不容易构造出来的对象,比如HttpServletRequest对象需要在Servlet容器中构造出来。 2、Java中...
  • 【接口测试】接口mock之基础知识

    万次阅读 2017-06-27 22:59:31
    Mock:In object-oriented programming, mockobjects are simulated objects that mimic the behavior of real objects incontrolled ways. A computer programmer typically creates a mock object to testthe be...
  • Mockito mock类部分方法

    千次阅读 2016-09-09 19:13:23
    Mockito mock类部分方法参考这个http://stackoverflow.com/questions/14970516/use-mockito-to-mock-some-methods-but-not-others/35504565#35504565
  • 单元测试--MOCK静态方法

    千次阅读 2017-10-09 14:30:19
    @RunWith(PowerMockRunner.class) @PrepareForTest(PropertiesLoaderUtils.class) public class SupplierVCCServiceTest { private SupplierVCCAuthAndCaptureService vccAuthAndCaptureService = createMock
  • 使用JUnit写UT时mock私有方法和属性

    千次阅读 2018-07-27 14:22:23
    一、mock私有方法 1、mock某个类的私有方法 2、mock某个对象的私有方法   二、mock私有属性 1、mock某个对象的私有属性
1 2 3 4 5 ... 20
收藏数 69,867
精华内容 27,946
关键字:

mock