面试系列篇之接口篇 (顺带讲清moco)
前言
话说,小王上次为了追求小花,前去小花公司面试自动化,给面试官留下了不错的印象,在等二面这段时间内,小王是日思夜想的梦见小花,每天都在翘首以盼的接到二面电话,等啊等,终于盼来了面试官的二面电话,小王飞起的装扮了一番,前去看他梦中姑娘小花。
一、情史中级篇
这天小王盛装打扮,来到小花公司,终于在前台见到他那日思夜想的情人小花,两人腼腆的寒暄后,小花便带着小王前去面试厅等候,正当小王准备与小花说说心里话时,这时好巧不巧的面试官走了进来,双方二人再次展开激博:
面试官:说说json和字典dict的区别把?
小王: 好嘞,大佬!
(1)json的key只能是字符串,而 dict可以是任何可hash对象;
(2)json的key可以是有序、重复的;dict的key不可以重复。
(3)json任意key存在默认值,dict默认没有默认值;
(4)json访问方式有多种,in,of,[];dict的value仅可以下标访问。
(5)json的字符串强制双引号,dict字符串可以单引号、双引号;
(6)json的类型是字符串,字典的类型是字典。
归根到底json本质上还是字符串,是一种按key:value这种键值对的格式来的字符串
面试官:做自动化的时候,对于所使用到的测试数据你是如何安排的。
小王:嗯。。。待我总结一下。
1.对于用到的用户名密码,不同环境的URL,这种管全局的参数,一般会单独抽出来,写的配置文件里比如conftest,yml等。
2.对于一些一次性消耗的数据,比如注册的手机号啥的,因为每次循环都不一样,这时我一般用随机函数生成,如时间戳,math函数等
3.对于可以反复使用的数据,比如商品信息,这时我是放到数据库的,通过Python读取数据库获取
4.对于接口所需的参数,我一般是用数据驱动方式,比如用excel/csv来管理这些参数数据
面试官: 你刚提到的数据驱动,和参数化,那你来说说什么事数据驱动和参数化吧。
小王:(内心一万个草泥马)额。。。这。好,那我来阐述下。数据驱动为自动化测试框架的一种设计思想,而参数化是实现数据驱动的一种手段,我们利用参数化来完成数据驱动,从而将数据与脚本分离,增加了框架的可维护性和脚本的复用性。数据驱动就是将参数化中的数据来源变成从外部读取,参数有一个存放数据的地方,在用例执行的时候去获取这个数据;这个数据存储的地方可以是我们定义的数组、元祖,字典,也可以是从外部文件中(excel、csv、xml、yaml等。而参数化就是把数据通过参数的形式传递给定义的方法,而不会直接在方法中写“死”,即形参的概念。
面试官: 你在做接口测试的时候如何处理下个接口所需的参数刚好是上个接口所响应的数据的。
小王: 首先去第一个接口把这个参数提取出来,存在变量中,然后通过变量的形式传递给下个接口作为参数。
面试官: 在做很多接口的时候,有些接口是做了验证的,你是如何处理的。
小王: 这个一般会在登录系列接口中遇到,这时我会先去调用这个登录接口,拿到cookie值,作为一个全局变量,后面所有的请求方法中,都去拿这个cookie值就得以验证。
面试官:比如一个比较大的项目,有的开发还没开发好接口,这时你一般如何处理这接口。
小王: 这时我一般会自己去搭建一个moco服务,来模拟接口返回数据。
面试官: 哦,那你可以说说具体说说它的好处,和如何搭建的过程吗?
小王: 当然可以,下面我来具体说说。
- 对于什么是moco及其好处
在软件测试过程中,对于一些不容易构造、获取的对象,用一个虚拟的对象来替代它,以达到相同的效
果,这个虚拟的对象就是Mock。在前后端分离项目中,当后端工程师还没有完成接口开发的时候,前端开发工程师利用Mock技术,自己用mock技术先调用一个虚拟的接口,模拟接口返回的数据,来完成前端页面的开发。其实,接口测试和前端开发有一个共同点,就是都需要用到后端工程师提供的接口。所以,当我们做接口测试的时候,如果后端某些接口还不成熟、所依赖的接口不稳定或者所依赖的接口为第三方接口、构造依赖的接口数据太复杂等问题时,我们可以用mock的方式先虚拟这些接口返回来代替。提高工作效率。 - 如何搭建moco?
(1)首先我们下载mock,我们可以直接去github上获取moco的jar包,地址:https://github.com/dreamhead/moco 这里展示了关于moco的介绍和源码,我们可以点击箭头
处直接下载它的jar包。
(2)然后配置json文件,我们需要先编辑一个json文件,用来模拟不同的请求,返回不同的响应。
新建一个文件,格式改为json,然后打开这个文件进行编辑。如图:
[{
"description":"demo",
"request":{ "uri":"/demo1" },
"response":{ "text":"Hello,demo1" }
}]
其中
description是注释(描述),由于json无法写注释,所以提供了用这个key
uri就是我们这个接口的统一资源标识符,可以根据模拟的接口自行定义
response里的内容即为返回的值
这是一个非常简单的mock。
3. 启动mock。
因为moco项目是采用java开发的,所以启动moco前,需要安装jdk。如果以前安装过的,请忽略!!!
JDK安装文档:http://vip.ytesting.com/q.do?a&id=10005
首先:把我们下载下来的moco的jar包和刚刚编辑好的json文件放到同一个文件夹路径下,然后在该路径下打开cmd命令行,在该路径下,输入cmd:
输入命令:java -jar moco-runner-1.1.0-standalone.jar http -p 9090 -c test.json
其中
jar包的名称可根据自己下载的jar包版本来写
http代表这个模拟的是http请求
-p 9090定义是端口号
-c test.json 是我们编辑的那个json文件名。
此时我们mock的服务以及启动成功了,相当于在我们本地的9090端口上启动的,所以我们可以通过浏览
器访问一下localhost:9090/demo 来看看返回的结果,注意,这里/demo就是我们在json文件中定义的uri。
小王:这就是简单的大概过程,至于更为具体的json文件,如带参,post等配置json,下面有机会咱俩在促膝长谈!
面试官: 谁跟你促膝长谈,赶快说,对于不同的请求,如何构建配置文件!
小王: 好吧,那我就一吐为快,让开,我要开始装X了。
配置不同的json文件
**模拟一个没有参数get请求配置:**
[
{
"description":"模拟一个没有参数get请求",
"request":{
"uri":"/getdemo",
"method":"get"
},
"response":{
"text":"这是一个没有参数的get请求"
}
},
**模拟一个带参数get请求配置:**
{
"description":"这是一个带参数get请求",
"request":{
"uri":"/getwithparam",
"method":"get",
"queries":{
"name":"huhansan",
"sex":"20"
}
},
"response":{
"text":"我胡汉三又回来啦!!!!"
}
}
]
**模拟一个post请求配置:**
[
{
"description":"模拟一个post请求",
"request":{
"uri":"/postdemo",
"method":"post"
},
"response":{
"text":"这是我的第一个mock的post请求"
}
},
**模拟一个带参数的post请求配置:**
{
"description":"这是一个带参数的post请求",
"request":{
"uri":"/postwithparam",
"method":"post",
"forms":{
"name":"huhansan",
"sex":"man"
}
},
"response":{
"text":"我胡汉三带着参数来啦!!!"
}
}
]
[
{
"description":"这是一个会返回cookies信息的get请求",
"request":{
"uri":"/getCookies",
"method":"get"
},
"response":{
"cookies":{
"login":"true"
},
"text":"恭喜你获得cookies信息成功"
}
},
{
"description":"这是一个带cookies信息的get请求",
"request":{
"uri":"/get/with/cookies",
"method":"get",
"cookies":{
"login":"true"
}
},
"response":{
"text":"这是一个需要携带cookies信息才能访问的get请求"
}
},
{
"description":"这是一个带cookies信息的post请求",
"request":{
"uri":"/post/with/cookies",
"method":"post",
"cookies":{
"login":"true"
},
"json":{
"name":"huhansan",
"age":"18"
}
},
"response":{
"status":200,
"json":{
"huhansan":"success",
"status":"1"
}
}
}
]
[
{
"description":"这是一个带header信息的post请求",
"request":{
"uri":"/post/with/headers",
"method":"post",
"headers":{
"content-type":"application/json"
},
"json":{
"name":"wanglaosi",
"sex":"woman"
}
},
"response":{
"json":{
"wanglaosi":"success",
"status":"1"
}
}
}
面试官: 小伙子可以,那啥我有点事要处理,等下我们接着聊,先休息下
小王:(嘿嘿)好的,看小花去喽!
总结
Moco还可以通过在json文件中添加cookies、header、重定向这些参数,来模拟各种情况下的请求和返回值,可以根据自己工作的需求去对这些东西进行了解。
Moco是热更新的,所以启动了jar包的服务之后,即使修改了json文件中的内容,也不需要重启服务就
生效。掌握了mock测试的技术,可以让我们在开发没有完成对应接口的时候,有接口文档就提前进入到测试状态,是现在敏捷模式下不可或缺的技术,也是持续集成中一个重要的组成部分。