0


测试必要会的接口测试,不一样的接口测试学完就能涨薪3k。

【文章末尾给大家留下了大量的福利】

requests是基于urllib的HTTP库,可以帮助我们发送各式各样的请求,携带各式各样的参数。

pip install requests

请求

包括:

  • 如何发送不同类型的请求- get- post- delete- put- 。。。。
  • 在请求中,如何携带参数- cookies- headers- data- json

响应

在响应对象中:

  • 都有哪些属性
  • json
  • bytes
  • 文本类型

如何通过响应头判断该响应体的内容?通过content-type来判断:

  • json类型的响应content-type:application/json
  • 图片:content-type:image/gif
  • 文本类型的响应:content-type:text/html

如果获取到的文本内容有乱码,如何解决?

  1. 要想到查看当前页面编码格式
  2. 使用response.encoding = 编码格式

requests.request(method, url, **kwargs)类能够构造一个请求,支持不同的请求方式。

import requests
​
response = requests.request(method='get', url='https://www.baidu.com')
print(response.status_code)

request类中来看看几个参数:

  • method:请求方式。
  • url:请求URL。
  • **kwargs:- params:字典或者字节序列,作为参数增加到url中,使用这个参数可以把一些键值对以k1=v1&k2=v2的模式增加到url中,get请求中用的较多。- data:字典、字节序列或者文件对象,重点作为向服务器提供或提交资源,作为请求的请求体,与params不同放在url上不同。它也可以接受一个字符串对象。- json:json格式的数据,可以向服务器提交json类型的数据。- headers:字典,定义请求的请求头,比如可以headers字典定义user agent。- cookies:字典或者CookieJar。- auth:元组,用来支持HTTP认证功能。- files:字典,用来向服务器传输文件。- timeout:指定超时时间。- proxies:字典,设置代理服务器。- allow_redirects:开关,是否允许对URL进行重定向,默认为True。- stream:开关,是否对获取内容进行立即下载,默认为False,也就是立即下载。这里需要说明的,stream一般应用于流式请求,比如说下载大文件,不可能一次请求就把整个文件都下载了,不现实,这种情况下,就要设置stream=True,requests无法将连接释放回连接池,除非下载完了所有数据,或者调用了response.close。- verify:开关,用于SSL证书认证,默认为True。- cert:用于设置保存本地SSL证书路径。

流式请求,指的不是请求是流,而是请求返回的数据流,返回一点取一点,而普通的请求是返回完毕你再取内容。

分享:httpbin.org # httpbin,提供了常用的请求方式,用于接口练习

requests示例介绍

params参数

常用于get请求。

import requests
# response = requests.get(url='http://www.neeo.cc:6001/get?user=zhangkai&pwd=666')
# print(response.json())
​
params = {
    "user": "张开",
    "pwd": 666
}
response = requests.get(url='http://www.neeo.cc:6001/get', params=params)
print(response.json())

headers

该参数使用所有请求需要携带请求头的场景。

import requests
headers = {
    "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.113 Safari/537.36"
}
​
response = requests.get('https://www.zhihu.com/question/361649589/answer/1163303688', headers=headers)
print(response.status_code)
print(response.text)

cookies参数

import requests
# 1. 登录,获取cookies值
​
response = requests.post(url="http://www.neeo.cc:6002/pinter/bank/api/login?userName=admin&password=1234")
print(response.json())
print(response.cookies)
print(response.cookies.get_dict())
​
​
# 2. 在需要cookies验证的时候,携带上刚才获取到的cookies值
response = requests.get(url='http://www.neeo.cc:6002/pinter/bank/api/query?userName=admin', cookies=response.cookies.get_dict())
print(response.status_code)
print(response.json())

data参数

import requests
data = {
    "userName": "=admin",
    "password": "1234"
}
response = requests.post(url="http://www.neeo.cc:6002/pinter/bank/api/login", data=data)
print(response.json())
print(response.cookies)

json参数

import requests
response = requests.post('http://www.neeo.cc:6001/post', json={"user":"zhangkai"})
print(response.json())

文件上传

import requests
file = {"file": open('a.gif', 'rb')}
response = requests.post("http://www.neeo.cc:6001/post", files=file)
print(response.json())

requests模块的基本操作

import requests

# response = requests.request(method='get', url='https://www.autohome.com.cn/news/')
response = requests.get('https://www.autohome.com.cn/news/')
# print(response)  # 查看响应状态
print(response.status_code)  # 查看响应状态
# print(response.content)  # 查看bytes类型的数据,通常是获取图片
# print(response.headers)   # 查看响应头
# print(response.json())   # 获取json类型的数据,要确保响应类型是json,不然报错
# response.encoding = "GBK"   # 指定(修改)当前响应结果的编码类型
# print(response.text)   # 文本类型的数据用text
# print(response.content)  # 获取bytes类型的数据
# print(response.url)  # 当前请求的url
# print(response.encoding)  # 获取当前响应的编码类型
# print(response.request)  # 请求类型
# print(response.request.method)  # 请求类型
# print(response.cookies)  # 查看cookis
# print(response.is_redirect)  # 查看是否是重定向的响应
# print(response.iter_lines())  # 循环获取,一行一行的取,但是,请忘掉这个方法
# print(response.iter_content(chunk_size=1024))  # 迭代取值,可以指定chunk_size
# print(response.reason)

bs4模块,解析文本查找标签及标签属性或者内容:

"""
pip install beautifulsoup4
"""

from bs4 import BeautifulSoup

soup = BeautifulSoup(文本类型请求结果, 解析器)   # response.text, "html.parser"

div_obj = soup.find(name="div", attr={"id": "xxxxx"})   # 找一个
img_list = div_obj.find_all(name="img", [attr])   # 找多个标签, 可以根据attr属性过滤,以列表的形式返回多个

for img in img_list:
    img.get("src")   # 获取标签的属性
div_obj.text  # 获取标签的文本内容

requests/bs4爬虫练习

https://www.autohome.com.cn/news/

爬取汽车之家新闻页的新闻列表缩略图

思路:

  1. 访问汽车之家新闻页
  2. 定位到缩略图外部的div
  3. 获取所有的img标签中的src属性
  4. 使用requests模块向img的src地址发请求
  5. 保存到本地

View Code

beautifulsoup4:

  • soup_obj = BeautifulSoup(response.text, "html.parser") # response.text: 要解析的文本 html.parser:指定什么解析器来解析文本
  • soup_obj.find(name=标签名, attr={”属性名":"属性值"}) 因为找到的标签可能有多个,那使用attr来过滤指定的标签。
  • soup_obj.find_all(name=标签名, attr={”属性名":"属性值"})) 找到所有以attr过滤的标签。
  • img.get('src'),表示获取指定标签的属性
  • 获取标签的文本内容,使用标签名.text

postman

  1. 常见的接口1. 普通的get请求2. 带参数get请求3. post请求:k:v4. post请求:k:{“k1”:"va1"}5. post请求:json6. webservice接口
  2. 特殊的接口1. 文件上传2. cookies3. token4. 签名接口
  3. 环境管理1. 如何配置环境
  4. 断言1. 状态码断言2. json断言
  5. 接口自动化
  6. 命令行测试
  7. 参数化配置

普通请求

  1. k:v格式的post请求

  1. 参数为json的post请求

  1. 文件上传:

集合的概念

将同一类型,同一项目的接口管理起来。

今日内容

环境管理

创建环境:

编辑当前环境的变量:

如何在请求中应用上环境中的变量?

使用

{{变量名}}

的方式使用环境中的变量值。

变量的作用域

全局变量:作用于全局,postman中的任何地方

集合变量:变量只作用于集合中的接口

内置动态变量:内置的一些时间戳,UIID变量。

自定义环境变量:自己定义的环境,在该环境中创建的变量,只要你使用该环境,就能使用其中变量值。

全局变量

如何创建全局变量

使用

{{变量名}}

来使用。

集合变量

只作用于当前的集合中。

创建

使用

{{变量名}}

来使用。

内置的变量

作用于所有地方,使用

{{$内置的变量名}}

常用的:

  • timestap
  • guid

更多内置的变量参考:

断言

python中的断言,assert,断定结果是怎样的,否则就断言失败。

import requests
​
response = requests.get("https://www.baidu.com", timeout=5)
​
​
try:
    assert response.status_code == 201
    print('断言成功')
except AssertionError as e:
    print('断言失败')

在postman中,如何使用断言。

postman中,可用的模板?
模板描述示例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 objectresponse 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响应时间超过200mspm.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状态码:代码是200pm.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; });

常用的断言

// 状态码断言
​
pm.test("判断响应状态码是否是 200", function () {
    pm.response.to.have.status(200);
});
​
// 判断json中的key value是否符合预期,如果你的key是嵌套结构,就点下去
​
pm.test("Your test name", function () {
    var jsonData = pm.response.json();
    pm.expect(jsonData.args.k2).to.eql("v2");
});
​
​
// 判断文本类型的响应文本中,是否包含指定的字段
pm.test("判断响应体是否包含指定的字段", function () {
    pm.expect(pm.response.text()).to.include("百度一下");
});

集合公共断言

创建集合公共断言。

可以将集合中的一些公共的断言写到集合配置中,在集合中的接口在执行时,会自动的应用上集合配置中的断言。

特殊接口

签名接口

  1. 知道签名接口的加密规则1. sign:md5(手机号 + 盐 + 时间戳)
  2. 知道,在请求之前处理相关的数据

// 获取手机号
​
var phone = "1212113";
​
// 获取盐
var optCode = "testfan";
​
​
// 获取时间戳
​
var timestamp = new Date().getTime();
​
// console.log(timestamp);
​
// md5 加密
​
var md5 = CryptoJS.MD5(phone + optCode + timestamp).toString();
// console.log(md5);
​
// 将加密后的字符串set回环境中
pm.globals.set("phone", phone);
pm.globals.set("timestamp", timestamp);
pm.globals.set("md5", md5);

cookies

处理cookie有两种方式:

  • 第一种,手动的获取cookies值,然后在需要cookies的请求中,手动携带,注意:你要保证cookie值是有效的。
  • 第二种,postman在发送请求的时候,如果响应中有cookies返回,就会自动的帮我们保存在cookie管理器中。当有向该域名发送请求的时候,postman会自动的帮我们携带cookie值。

token

postman不会帮我们处理token,只能我们自己来完成:

  • 第一种,用例浏览器登录账号,获取token值,在有需要的接口中,手动添加。
  • 第二种:- 在登录接口访问成功后,从请求体中获取token字段,并且set到全局变量中。// 从响应体中获取token字段: datavar token = pm.response.json().data;​// 将token值set到全局的环境中去。pm.globals.set("my_token", token);- 在需要使用token的接口中,在该接口请求发送之前, 从环境中获取token值,填写在请求头中。

webservice接口

简单来说,webservice是通过xml进行交互的web请求,本质上也是HTTP请求。

Web Service也叫XML Web Service WebService是一种可以接收从Internet或者Intranet上的其它系统中传递过来的请求,轻量级的独立的通讯技术。是通过SOAP在Web上提供的软件服务,使用WSDL文件进行说明,并通过UDDI进行注册。

如何调试webservice接口

  1. 在post请求的raw中输入请求的参数,并且,格式选择xml:

  1. 由于上一步中,选择xml格式的时候,postman会自动的在请求头中,添加上Content-Type:application/xml,但是webservice接口的content-type不是application/xml而是text/xml.

  1. 修改请求content-type值。

  1. 就正常的发请求就完了。

集合自动化

如上图,在启动集合的时候,有如下参数配置:

  • Environment:选择接口执行时依赖的环境。
  • Iterations:表示该集合内的接口运行的次数。
  • Delay:接口执行前延时多少毫秒。
  • Log Response:默认记录所有的响应日志。
  • Data:参数数据,暂时先不管它。
  • Keep variable values:保存在运行过程中产生的变量或者值,选择默认即可。
  • Run collection without using stored cookies:运行中不使用cookie,这里也保持默认。
  • Save cookies after collection run:在集合执行之后,保存cookies,选择默认。
  • Run 集合名称:运行集合。

数据驱动这里:一般轮训次数会自动的根据你的数据行数来定。如果轮训次数大于数据行数,那么在剩余的轮训中,提取的数据就是数据文件的最后一行。

命令行测试

环境配置

  1. 安装nodejs:,注意,nodejs版本不低于10。
  2. 由于自带的npm命令受网络影响严重,我们需要配置一个国内的淘宝镜像:cnpm,终端(管理员权限)执行如下命令:
npm install -g cnpm --registry=https://registry.npm.taobao.org
  1. 测试vnpm是否安装成功:
cnpm -v
  1. 使用cnpm来安装Newman插件:
cnpm install newman --global
newman -v
  1. 安装reporter插件,用来生成测试报告
cnpm install -g newman-reporter-html
  1. 执行终端命令,获取html类型的报告
newman run 脚本 -d 参数文件 -e 环境文件 -n 循环次数 -r html --reporter-html-export 测试报告路径

question

newman required node version >=10

意思是nodejs版本太低了,需要10及以上的版本。

nodejs需要win8以上的系统

这个意思是新版本的nodejs要求的Windows系统在win8以上,你可以安装一个稍微低一点的nodejs,如12.x版本

本地部署Java项目

  1. 要安装java jdk(Windows/Mac):

  2. 下载apache-tomcat-8.5.38.zip压缩包,解压到你的本机上,一个没有中文,空格的目录中。

  3. 配置相关的环境变量。
    变量名值JAVA_HOMEjava jdk 的安装目录PATH%JAVA_HOME%\binCATALINA_HOMEtomcat的安装目录PATHtomcat的bin目录

  4. 启动,在任意目录打开终端,输入pinter,启动过程稍慢,选哟静等一会儿

  5. 浏览器访问127.0.0.1:8231/pinter/index

问题

打开tomcat的启动文件,一闪即逝,意思是你的Java环境配置的有问题,解决办法:

  1. 检擦你的环境变量是否配置好了。
  2. 重启电脑

内容回顾

  1. 如何使用postman处理各式请求- get请求- post请求- 其他类型的请求
  2. 在请求中如何携带参数- params- data, x-www-form-urlencoded k:v ---> content-type:application/x-www-form-urlencoded- json, raw, json ---> content-type:application/json
  3. 特殊接口- cookies- 手动去浏览器做登录操作,获取cookies,然后,在postman发请求时,自己携带- 使用postman向登录接口发请求,如果该响应有cookies,就保存到cookies管理器中,当有想同域名的接口发送请求时,会去cookies管理器中,自动添加- token- 手动去浏览器做登录操作,获取token,然后,在postman发请求时,自己携带- 在postman中,首先向登录接口发请求,在请求结束后,手动的通过脚本获取token值,然后set到全局变量中;当向需要token的接口发请求时,在带上- 签名接口- 首先要知道该接口的加密算法- 要手动的去处理各个参数和加密后的结果, set到环境变量中- 在请求的参数中使用{{变量名}}引用- webservice接口- 以xml格式作为数据交换的HTTP请求。- 携带参数时,需要选择xml类型,注意,当你选择了xml类型,postman会自动的在请求头中携带content-type:application/xml- 但是,至于该接口的content-type需要什么值- 文件上传- 请求类型是 form-data
  4. 环境管理- 自定义的环境变量,当使用时,直接选择即可- 全局的环境变量,可以定义基础的一些变量- 集合变量,作用域只作用于当前集合中- 内置的动态变量$guid- 使用,内置动态变量使用{{$guid}}, 其他引用直接{{变量名}}
  5. 断言- 该功能就是在请求结束后要做的操作,不仅限于断言,还能,set变量,get变量,clear变量。- 断言:- 状态码断言,判断响应状态码是否是指定的状态码- 字符串断言,文本类型的请求结果中是否包含指定的字符- json断言,判断jsonData中,指定的key值是否符合预期- 在集合中,如果有一些公共的断言,可以写在集合的断言中,不用在每个接口里面写断言了,避免了重复造轮子,只需要在接口中实现接口特定的断言
  6. 集合自动化- 能自动的将集合内的接口进行自动化运行,指定运行的轮次- 在自动化运行中,可以加入断言- 还可以做数据驱动测试,即测试数据来自外部的文件中,一般我们选择将外部数据保存为CSV和json类型。- CSV:是一个无格式的文本文件,但它可以使用Excel打开。- 可以导出json类型的运行结果。
  7. 命令行测试- 在终端中进行执行postman脚本。- 要下载newman插件,该插件用来在终端中执行postman脚本,但该插件本身基于nodejs开发,所以要配置:- nodejs ---- 版本问题,不能太高,太高了,低版本的Windows报错,太低了,插件装不上,所以,选择 >=10版本的, 也不要选择最新版本的- nodejs有nmp(下载软件的工具),在国内受网络影响,所以,配置cnpm,即淘宝的npm镜像- 在进行终端测试时,还需要导出html文件, 那就要在下载 reporter插件- 上述几个软件和插件下载完毕,可以执行命令:- newman run 脚本 -d 参数文件 -e 环境文件 -n 循环次数 -r html --reporter-html-export 测试报告路径- ##

本文转载自: https://blog.csdn.net/csdnchengxi/article/details/127269766
版权归原作者 测试架构师北凡 所有, 如有侵权,请联系我们删除。

“测试必要会的接口测试,不一样的接口测试学完就能涨薪3k。”的评论:

还没有评论