一.在咱们没有学习过python语言的时候领导让咱们作接口测试 咱们都使用工具来作测试,通常经常使用的如jemeter,postman这些个工具,我来推荐使用postmanpython
这个工具来进行接口测试,有的小伙伴们说Fiddler或Charles抓接口,而后进行测试不也成吗?成是成,可是接口测试每每优先于客户端测试而且postman这个工具方便用来模拟异常请求,而且postman这个工具还带有验证功能,提升咱们接口测试的效率mysql
咱们来用postman来进行一个简单的自动化ios
1.发送一个get请求sql
2.发送一个post请求数据库
3.设置检查点,检验请求的返回值json
验证包含哪些内容api
postman断言是JavaScript语言编写的,在postman客户端指定区域编写便可。cookie
clear a global variable | 清除全局变量 | pm.globals.unset("variable_key"); |
Clear an environment variable | 清除一个环境变量 | pm.environment.unset("variable_key"); |
get a global variable | 获得一个全局变量 | pm.globals.get("variable_key"); |
get a variable | 获得一个变量 | pm.variables.get("variable_key"); |
Get an environment variable | 获得一个环境变量 | pm.environment.get("variable_key"); |
response body:contains string | 检查response body包含字符串 | pm.test("Body matches string", function () { pm.expect(pm.response.text()).to.include("string_you_want_to_search"); }); |
response body:convert XML body to a JSON object | response body:将XML转换为JSON对象 | var jsonObject = xml2Json(responseBody); |
response body:is equal to a string | 检查响应体等于一个字符串 | pm.test("Body is correct", function () { pm.response.to.have.body("response_body_string"); }); |
response body:JSON value check | 检查response body中JSON某字段值 | pm.test("Your test name", function () { var jsonData = pm.response.json(); pm.expect(jsonData.value).to.eql(100); }); |
response headers:content-Type header check | 检查content-Type是否包含在header返回 | pm.test("Content-Type is present", function () { pm.response.to.have.header("Content-Type"); }); |
response time is than 200ms | 响应时间超过200ms | pm.test("Response time is less than 200ms", function () { pm.expect(pm.response.responseTime).to.be.below(200); }); |
send s request | 发送一个请求 | pm.sendRequest("https://postman-echo.com/get", function (err, response) { console.log(resp onse.json()); }); |
set a global variable | 设置一个全局变量 | pm.globals.set("variable_key", "variable_value"); |
set an environment variable | 设置一个环境变量 | pm.environment.set("variable_key", "variable_value"); |
status code:Code is 200 | 状态码:代码是200 | pm.test("Status code is 200", function () { pm.response.to.have.status(200); }); |
status code:code name has string | 状态码:代码中有指定字符串 | pm.test("Status code name has string", function () { pm.response.to.have.status("Created"); }); |
status code:successful POST request | 状态码:成功的post请求 | pm.test("Successful POST request", function () { pm.expect(pm.response.code).to.be.oneOf([201,202]); }); |
use tiny validator for JSON data | 为json数据使用tiny验证器 | var schema = { "items": { "type": "boolean" } }; var data1 = [true, false]; var data2 = [true, 123]; pm.test('Schema is valid', function() { pm.expect(tv4.validate(data1, schema)).to.be.true; pm.expect(tv4.validate(data2, schema)).to.be.true; }); |
有时须要在不一样的环境下跑相同的测试,此时能够经过设置环境变量来动态选择。点击右上角的设置按钮:session
填写该环境的名称:如测试环境,并在key和value中填写须要的键值框架
使用这些键值的时候只须要加上两个花括号引用key
1 {{base_url}}/username
解析完后
创建多个环境时,key一般都是相同的,只是value不一样
点击这个位置来新增环境变量
建立好全部环境后,在跑用例的时候在右上角下拉列表选择须要的环境就好
二。请求
postman界面分为两部分:左边的sidebar 右边的request builder:快速建立几乎全部的请求
建立一个集合
1.GET请求参数及header
2.POST请求设置(重要)
能够上传一个文件做为key的value提交(如上传文件)。但该文件不会做为历史保存,只能在每次须要发送请求的时候,从新添加文件。
同前面同样,注意,你不能上传文件经过这个编码模式。
该模式和表单模式会容易混淆。urlencoded中的key-value会写入URL,form-data模式的key-value不明显写入URL,而是直接提交。
raw request能够包含任何东西。全部填写的text都会随着请求发送。
图片,音频,视频,文件均可以 。 也不能保存历史,每次选择文件,提交。
保证API响应的正确性,就是你须要作的大部分工做。postman的response viewer部分会协助你完成该工做且使其变得简单。
一个API的响应包含body,headers,响应状态码。postman将body和headers放在不一样的tabs中。响应码和响应时间显示在tabs的旁边。将鼠标悬停在响应码上面能够查看更详细的信息。
Postman的Tests标签能够用来写测试:
postman容许你运行collection,你能够运行任意的次数。 最后会给出一个总体运行的结果。会保存每一次运行的结果,提供给你比较每一次运行结果的不一样。
选择collection,选择环境。点击运行按钮。
这就是postman给咱们带来的好处,他能够收集全部接口请求,进行结果断言,在咱们须要的时候他能够成批的进行运行。
可是postman的缺点也是十分明显的,他是一个固定的工具,只能知足一部分接口请求的要求,可是有不少接口的请求参数需求他就没法实现了,好比说在请求参数了须要时间戳,须要一个MD5加密的字段,须要从数据库里查询一个id键值,再好比说须要获取返回中的参数这些都没法实现,只能经过手动去获取,那这样自动化的意义也就不存在了,因此最靠谱的实现自动化仍是须要使用python来开发一个脚本,按照接口文档的要求开发出相应的接口请求脚本。
二.当咱们学习过python中的request模块咱们能够发送接口请求,发送get,post,put,delete等请求,同时能够发送字典格式的,json格式的,发送文件等类型数据,也能够操做session,cookie,并对接口返回进行操做,如获取返回内容,并对返回内容格式化,获取返回的状态码,获取请求时间等功能呢。
下面 咱们就用request的模块进行一个简单的接口测试
#导入requests模块
import requests
def test(url,data,check_key,check_value):
rep=requests.post(url=url,data=data).json()
print(rep)
assertion=rep[check_key]
if assertion == check_value:
print("豆瓣发布接口测试经过")
else:
print("豆瓣发布接口测试不经过")
test('https://api.douban.com/shuo/statuses/',"{'media': [{'imgsrc': 'http://icanhascheezburger.files.wordpress.com/2009/04/funny-pictures-hairless-cat-phones- home.jpg', 'src': 'http://www.mapsofwar.com/photos/EMPIRE17.swf', 'type': 'flash'}]}", \
'msg','须要登陆')
结果以下:
咱们的入参须要一个时间戳而且须要一个数据库字段
#导入requests模块
import requests
import pymysql
import time
def test():
# 获取13位时间戳
millis = int(round(time.time() * 1000))
print("时间戳:%s"%millis)
# 建立链接
conn = pymysql.connect(host='localhost', port=3306, user='root', passwd='root123', db='autotest',charset='utf8')
# 建立游标
cursor = conn.cursor()
# 执行SQL,并返回受影响行数
cursor.execute("select * from autotest_input WHERE id=1")
results = cursor.fetchall()
print(results)
print(results[0][1])
# 提交,否则没法保存新建或者修改的数据
conn.commit()
# 关闭游标
cursor.close()
# 关闭链接
conn.close()
url = 'http://ios.wecash.net/biz/wallet/amount'
data = 'CUSTOMER_ID=56256A951F81F0BCA10780AD02139B29'
rep = requests.get(url=url, data=data).json()
print(rep)
errorDescription = rep['errorDescription']
if errorDescription == '查询成功':
print("红包查询接口测试经过")
else:
print("红包查询接口测试不经过")
test()
结果以下:
咱们能够看到由于每个接口的请求方式都是不同的,传参也不同,返回结果的校验字段与校验值也是不同的,因此咱们须要一个接口请求写一个方法,这样作好处是清晰方便,便于代码检查,但缺点也一样是异常明显的。首先代码冗余,重复性代码过多,不便于维护并且咱们作接口测试,不能只是把接口测通就算经过了,咱们还须要进行接口的正反用例,对接口进行边界值测试,传参类型测试,传参合法性测试等等,那就须要咱们频繁的修改传参和断言字段与断言字段值,并且咱们进行结果断言的时候不能只是用等于来进行校验,由于有的返回字段咱们须要对他的类型就行校验,返回的结果的范围进行校验,因此咱们要写多个断言判断的方法,这么来看 接口测试用代码来实现 还真不是那么简简单单 so easy的事啊!!!
咱们仅仅用requests模块进行简单的接口测试是行得通的,可是要只有requests模块给整个公司上百个接口进行测试的话显然这是很难实现地,那么有没有一个更好的方法或者说有一个现成的框架供咱们使用呢?答案当时是有的,这就是unittest框架,今天咱们来介绍一下他
三。unittest框架简介
unittest单元测试框架不只能够适用于单元测试和接口自动化测试用例的开发与执行,还能够适用WEB自动化测试用例的开发与执行,该测试框架可组织执行测试用例,而且提供了丰富的断言方法,判断测试用例是否经过,最终生成HTML格式的测试结果,便于查看,这么看来unittest框架简直就是自动化测试人员必须掌握的技能之一。