
前后端经常会存在接口对接,为减少相互间的强依赖,双方能并行开发。接口的模拟测试就显得尤为关键。一些对外的接口,外部环境往往不可控,在开发、测试阶段为了减少其影响,通过接口模拟测试能减少很多不必要的麻烦。
本文将介绍一款轻量级的java mock server工具,解决以上的常见问题。
moco是一个java实现,轻量级的,开源的接口模拟测试工具,可以通过jar独立部署。简单json配置,即可实现接口的请求响应接口模拟。
官方地址:
下载官方Standalone Moco Runner文件到本地。
下载完成对应目录下可以moco-runner-0120-standalonejar文件
对应目录下新增foojson文件以下内容。
以上定义了全局接口的返回信息。
以下命令运行moco server
访问>
前后端分离以后,很多时候,可能前端与后端是在并行开发的或者走在后端同事前面。所以,在还没有接口的情况下,前端同事就需要使用到数据自己模拟的一些数据。
一、使用webpack的devServer来mock接口数据
访问 >
前情提要
作为测试工程师,在日常工作中遇到和三方对接的项目,三方开发进度不理想,导致无法进行联调测试,基于此,开始学习与了解mock服务
吸收
经过资料查询,实 *** 验证之后,汇总成如下自我理解:
1正常自己公司的项目里面,会有一个config文件,里面会配置相关第三方调用接口的地址:ip:port//,具体的URL中的path会统一在接口文档中给出,描述三方提供的接口信息,包括(接口说明、接口路径(path)、请求参数、返回数据格式等),具体项目中调用哪些三方接口,则在项目程序里再去规定。
2mock的意义,简单来说在于模拟第三方接口的返回,用于我们项目的前端调试,或者接口与接口之间的调用调试。
3基于此,我们可以使用postman工具的mock server功能,来模拟第三方接口,既然模拟了第三方的所有接口,那么我们在得到mock server的地址(IP2:port2)后,需要在自己项目的config文件中,把配置的第三方调用接口的地址(ip:port),修改成mock server的地址(IP2:port2)。这样程序在运行后,本来调用第三方的地址,才能够走到我们的mock server中,模拟我们配置好的接口返回的数据。
( 注 :1在测试完成后,项目上线之前,需要检查配置文件的地址,是否修改为正确的三方地址。2出于测试完整性,临时使用mock地址后,三方接口完成开发后,需要修改回正确的三方地址,进行联调测试)
4postman的mock server 使用步骤:
a注册postman账号
b可新建一个space来单独管理mock
d在环境变量里添加相应的变量,主要包括mock server 的服务地址(即:IP2:port2),以及属于自己账号下的api keys(获取方式需要登录postman官网)
e给mock server里添加相应的接口,并增加相应的EXAMPLE
fmock添加对应的接口后,因mock server是联网的,故不受内外网环境的限制,在任何网络环境下,都可配置你自己的mock server地址,进行测试。
Android是如何实现应用程序之间数据共享的?一个应用程序可以将自己的数据完全暴露出去,外界更本看不到,也不用看到这个应用程序暴露的数据是如何存储的,或者是使用数据库还是使用文件,还是通过网上获得,这些一切都不重要,重要的是外界可以通过这一套标准及统一的接口和这个程序里的数据打交道,例如:添加(insert)、删除(delete)、查询(query)、修改(update),当然需要一定的权限才可以。如何将应用程序的数据暴露出去?Android提供了ContentProvider,一个程序可以通过实现一个Contentprovider的抽象接口将自己的数据完全暴露出去,而且Contentproviders是以类似数据库中表的方式将数据暴露。Contentproviders存储和检索数据,通过它可以让所有的应用程序访问到,这也是应用程序之间唯一共享数据的方法。要想使应用程序的数据公开化,可通过2种方法:创建一个属于你自己的Contentprovider或者将你的数据添加到一个已经存在的Contentprovider中,前提是有相同数据类型并且有写入Contentprovider的权限。如何通过一套标准及统一的接口获取其他应用程序暴露的数据?Android提供了ContentResolver,外界的程序可以通过ContentResolver接口访问ContentProvider提供的数据。当前篇主要说明,如何获取其它应用程序共享的数据,比如获取Android手机电话薄中的信息。什么是URI?在学习如何获取ContentResolver前,有个名词是必须了解的:URI。URI是网络资源的定义,在Android中赋予其更广阔的含义,先看个例子,如下:将其分为A,B,C,D4个部分:A:标准前缀,用来说明一个ContentProvider控制这些数据,无法改变的;B:URI的标识,它定义了是哪个ContentProvider提供这些数据。对于第三方应用程序,为了保证URI标识的唯一性,它必须是一个完整的、小写的类名。这个标识在元素的authorities属性中说明:C:路径,ContentProvider使用这些路径来确定当前需要生什么类型的数据,URI中可能不包括路径,也可能包括多个;D:如果URI中包含,表示需要获取的记录的ID;如果没有ID,就表示返回全部;由于URI通常比较长,而且有时候容易出错,切难以理解。所以,在Android当中定义了一些辅助类,并且定义了一些常量来代替这些长字符串,例如:PeopleCONTENT_URIContentResolver介绍说明看完这些介绍,大家一定就明白了,ContentResolver是通过URI来查询ContentProvider中提供的数据。除了URI以外,还必须知道需要获取的数据段的名称,以及此数据段的数据类型。如果你需要获取一个特定的记录,你就必须知道当前记录的ID,也就是URI中D部分。前面也提到了Contentproviders是以类似数据库中表的方式将数据暴露出去,那么ContentResolver也将采用类似数据库的 *** 作来从Contentproviders中获取数据。现在简要介绍ContentResolver的主要接口,如下:返回值函数声明finalUriinsert(Uriurl,ContentValuesvalues)InsertsarowintoatableatthegivenURLfinalintdelete(Uriurl,Stringwhere,String[]selectionArgs)Deletesrow(s)specifiedbyacontentURIfinalCursorquery(Uriuri,String[]projection,Stringselection,String[]selectionArgs,StringsortOrder)QuerythegivenURI,returningaCursorovertheresultsetfinalintupdate(Uriuri,ContentValuesvalues,Stringwhere,String[]selectionArgs)Updaterow(s)inacontentURI看到这里,是否感觉与数据库的 *** 作基本一样的?就是这样的,详细解析请参考AndroidSQLite解析篇中的说明,不在此详细说明。最后一个问题:如何获取ContentResolver?调用getContentResolver(),例如:ContentResolvercr=getContentResolver();制作ContentResolver实例以上就完全介绍了如何获取、使用ContentResolver,启动Eclipes,制作一个完整的实例如下:打开showcontentjava,修改如下:packagemoandroidshowcontact;importandroidappListActivity;importandroiddatabaseCursor;importandroidosBundle;importandroidproviderContactsPhones;importandroidwidgetListAdapter;importandroidwidgetSimpleCursorAdapter;publicclassshowcontactextendsListActivity{protectedvoidonCreate(BundlesavedInstanceState){superonCreate(savedInstanceState);//ContentResolver通过URI来查询ContentProvider中提供的数据Cursorc=getContentResolver()query(PhonesCONTENT_URI,null,null,null,null);startManagingCursor(c);ListAdapteradapter=newSimpleCursorAdapter(this,androidRlayoutsimple_list_item_2,c,newString[]{PhonesNAME,PhonesNUMBER},newint[]{androidRidtext1,androidRidtext2});setListAdapter(adapter);}}然后在AndroidManifestXML中元素前增加如下许可:最后运行程序,在模拟器启动后,单击Menu返回到Home界面,打开Contacts选择Contacts标签页,添加2个联系人信息。返回到Home,选择moandroidshowcontact运行,刚添加的2个联系人信息将显示在界面上
出了什么问题? 单元测试的目标是一次只验证一个方法 小步的前进 细粒度的测试 但是假如某个方法依赖于其他一些难以 *** 控的东东 比如说网络连接 数据库连接 或者是Servlet容器 那么我们该怎么办呢? 要是你的测试依赖于系统的其他部分 甚至是系统的多个其他部分呢?在这种情况下 倘若不小心 你最终可能会发现自己几乎初始化了系统的每个组件 而这只是为了给一个测试创造足够的运行环境让它们可以运行起来 忙乎了大半天 看上去我们好像有点违背了测试的初衷了 这样不仅仅消耗时间 还给测试过程引入了大量的耦合因素 比如说 可能有人兴致冲冲地改变了一个接口或者数据库的一张表 突然 你那卑微的单元测试的神秘的挂掉了 在这种情况发生几次之后 即使是最有耐心的开发者也会泄气 甚至最终放弃所有的测试 那样的话后果就不能想像了 再让我们看一个更加具体的情况 在实际的面向对象软件设计中 我们经常会碰到这样的情况 我们在对现实对象进行构建之后 对象之间是通过一系列的接口来实现 这在面向对象设计里是最自然不过的事情了 但是随着软件测试需求的发展 这会产生一些小问题 举个例子 用户A现在拿到一个用户B提供的接口 他根据这个接口实现了自己的需求 但是用户A编译自己的代码后 想简单模拟测试一下 怎么办呢?这点也是很现实的一个问题 我们是否可以针对这个接口来简单实现一个代理类 来测试模拟 期望代码生成自己的结果呢? 幸运的是 有一种测试模式可以帮助我们 mock对象 Mock对象也就是真实对象在调试期的替代品
现在需要Mock对象吗? 关于什么时候需要Mock对象 Tim Mackinnon给我们了一些建议 真实对象具有不可确定的行为(产生不可预测的结果 如股票的行情) 真实对象很难被创建(比如具体的web容器) 真实对象的某些行为很难触发(比如网络错误) 真实情况令程序的运行速度很慢 真实对象有用户界面 测试需要询问真实对象它是如何被调用的(比如测试可能需要验证某个回调函数是否被调用了) 真实对象实际上并不存在(当需要和其他开发小组 或者新的硬件系统打交道的时候 这是一个普遍的问题) 如何实现Mock对象? 使用mock对象进行测试的时候 我们总共需要 个步骤 分别是 使用一个接口来描述这个对象 为产品代码实现这个接口 以测试为目的 在mock对象中实现这个接口 在此我们又一次看到了针对接口编程的重要性了 因为被测试的代码只会通过接口来引用对象 所以它完全可以不知道它引用的究竟是真实的对象还是mock对象 下面看一个实际的例子 一个闹钟根据时间来进行提醒服务 如果过了下午 点钟就播放音频文件提醒大家下班了 如果我们要利用真实的对象来测试的话就只能苦苦等到下午五点 然后把耳朵放在音箱旁 我们可不想这么笨 我们应该利用mock对象来进行测试 这样我们就可以模拟控制时间了 而不用苦苦等待时钟转到下午 点钟了 下面是代码
public interface Environmental { private boolean playedWav = false; public long getTime(); public void playWavFile(String fileName); public boolean wavWasPlayed(); public void resetWav(); }
真实的实现代码
public class SystemEnvironment implements Environmental { public long getTime() { return System currentTimeMillis(); } public void playWavFile(String fileName) { playedWav = true; } public boolean wavWasPlayed() { return playedWav; } public void resetWav() { playedWav = false; } }
下面是mock对象
public class MockSystemEnvironment implements Environmental { private long currentTime; public long getTime() { return currentTime; } public void setTime(long currentTime) { this currentTime = currentTime; } public void playWavFile(String fileName) { playedWav = true; } public boolean wavWasPlayed() { return playedWav; } public void resetWav() { playedWav = false; } }
下面是一个调用getTime的具体类
import java util Calendar; public class Checker { private Environmental env; public Checker(Environmental env) { this env = env; } public void reminder() { Calendar cal = Calendar getInstance(); cal setTimeInMills(env getTime()); int hour = cal get(Calendar HOUR_OF_DAY); if(hour >= ) { env playWavFile( quit_whistle wav ); } } }
使用env getTime()的被测代码并不知道测试环境和真实环境之间的区别 因为它们都实现了相同的接口 现在 你可以借助mock对象 通过把时间设置为已知值 并检查行为是否如预期那样来编写测试
import java util Calendar; import junit framework TestCase; public class TestChecker extends TestCase { public void testQuittingTime() { MockSystemEnvironment env = new MockSystemEnvironment(); Calendar cal = Calendar getInstance(); cal set(Calendar YEAR ); cal set(Calendar MONTH ); cal set(Calendar DAY_OF_MONTH ); cal set(Calendar HOUR_OF_DAY );
cal set(Calendar MINUTE ); long t = cal getTimeInMillis(); env setTime(t ); Checker checker = new Checker(env); checker reminder(); assertFalse(env wavWasPlayed()); t += ( ); env setTime(t ); checker reminder(); assertTrue(env wavWasPlayed()); env resetWav(); t += ; env setTime(t ); checker reminder(); assertTrue(env wavWasPlayed()); } }
这就是mock对象的全部 伪装出真实世界的某些行为 使你可以集中精力测试好自己的代码
好像有一些麻烦 如果每次都像上面那样自己写具体的mock对象 问题虽然解决了 但是好像有一些麻烦 不要着急 已经有一些第三方现成的mock对象供我们使用了 使用Mock Object进行测试 主要是用来模拟那些在应用中不容易构造(如>
NC是阴性对照,也就是说序列打乱的无意义对照。
MOCK就是空白对照,所谓的空白对照有两种:一种是什么也不处理,一种是只加转染试剂,不加转染的质粒或者siRNA。如果是siRNA-NC,那就是打乱是序列的siRNA,相当于siRNA的对照。
阴性对照(negative control)和阳性对照(positive control)是针对“预期结果”而说的。凡是肯定出现预期结果的组,为阳性对照组。凡是肯定不会出现预期结果的组,为阴性对照组。
空白对照(blank control)是针对“处理因素”而说的。凡是不加处理因素的组,为空白对照组。所谓不加处理因素,可以是用生理盐水等溶剂代替所要加的溶液,也可以是给实验动物开刀但是不摘除某个器官,等等。
模拟接口数据。
json交易模拟器使用方法主要是模拟接口数据,具体步骤如下。
1、在项目下新一个文件夹,我新建的文件名叫mock。
2、mock文件下建一个xxxjson文件用来存放模拟数据。
3、cd到mock文件下使用npminit-y命令生成packagejson。
4、安装json-server,cdmock下使用npmijson-server-D下载。
5、修改启动命令,在mockpackagejson中修改。
6、启动,cdmock下npmrunserver启动。
JSON它是一种数据格式,不是一种编程语言。虽然具有相同的语法形式,但JSON并不从属于JavaScript。
以上就是关于接口模拟测试利器,moco server工具的介绍全部的内容,包括:接口模拟测试利器,moco server工具的介绍、Mock.js使用、前端使用自定义接口内容等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)