【文章末尾给大家留下了大量的福利】
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
如果获取到的文本内容有乱码,如何解决?
- 要想到查看当前页面编码格式
- 使用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/
爬取汽车之家新闻页的新闻列表缩略图
思路:
- 访问汽车之家新闻页
- 定位到缩略图外部的div
- 获取所有的img标签中的src属性
- 使用requests模块向img的src地址发请求
- 保存到本地
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. 普通的get请求2. 带参数get请求3. post请求:k:v4. post请求:k:{“k1”:"va1"}5. post请求:json6. webservice接口
- 特殊的接口1. 文件上传2. cookies3. token4. 签名接口
- 环境管理1. 如何配置环境
- 断言1. 状态码断言2. json断言
- 接口自动化
- 命令行测试
- 参数化配置
普通请求
- k:v格式的post请求
- 参数为json的post请求
- 文件上传:
集合的概念
将同一类型,同一项目的接口管理起来。
今日内容
环境管理
创建环境:
编辑当前环境的变量:
如何在请求中应用上环境中的变量?
使用
{{变量名}}
的方式使用环境中的变量值。
变量的作用域
全局变量:作用于全局,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. sign:md5(手机号 + 盐 + 时间戳)
- 知道,在请求之前处理相关的数据
// 获取手机号
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接口
- 在post请求的
raw
中输入请求的参数,并且,格式选择xml
:
- 由于上一步中,选择
xml
格式的时候,postman会自动的在请求头中,添加上Content-Type:application/xml
,但是webservice接口的content-type不是application/xml
而是text/xml
.
- 修改请求content-type值。
- 就正常的发请求就完了。
集合自动化
如上图,在启动集合的时候,有如下参数配置:
- Environment:选择接口执行时依赖的环境。
- Iterations:表示该集合内的接口运行的次数。
- Delay:接口执行前延时多少毫秒。
- Log Response:默认记录所有的响应日志。
- Data:参数数据,暂时先不管它。
- Keep variable values:保存在运行过程中产生的变量或者值,选择默认即可。
- Run collection without using stored cookies:运行中不使用cookie,这里也保持默认。
- Save cookies after collection run:在集合执行之后,保存cookies,选择默认。
- Run 集合名称:运行集合。
数据驱动这里:一般轮训次数会自动的根据你的数据行数来定。如果轮训次数大于数据行数,那么在剩余的轮训中,提取的数据就是数据文件的最后一行。
命令行测试
环境配置
- 安装nodejs:,注意,nodejs版本不低于10。
- 由于自带的npm命令受网络影响严重,我们需要配置一个国内的淘宝镜像:cnpm,终端(管理员权限)执行如下命令:
npm install -g cnpm --registry=https://registry.npm.taobao.org
- 测试vnpm是否安装成功:
cnpm -v
- 使用cnpm来安装Newman插件:
cnpm install newman --global
newman -v
- 安装reporter插件,用来生成测试报告
cnpm install -g newman-reporter-html
- 执行终端命令,获取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项目
要安装java jdk(Windows/Mac):
下载
apache-tomcat-8.5.38.zip
压缩包,解压到你的本机上,一个没有中文,空格的目录中。配置相关的环境变量。
变量名值JAVA_HOMEjava jdk 的安装目录PATH%JAVA_HOME%\binCATALINA_HOMEtomcat的安装目录PATHtomcat的bin目录启动,在任意目录打开终端,输入
pinter
,启动过程稍慢,选哟静等一会儿浏览器访问
127.0.0.1:8231/pinter/index
问题
打开tomcat的启动文件,一闪即逝,意思是你的Java环境配置的有问题,解决办法:
- 检擦你的环境变量是否配置好了。
- 重启电脑
内容回顾
- 如何使用postman处理各式请求- get请求- post请求- 其他类型的请求
- 在请求中如何携带参数- params- data, x-www-form-urlencoded k:v ---> content-type:application/x-www-form-urlencoded- json, raw, json ---> content-type:application/json
- 特殊接口- 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 - 环境管理- 自定义的环境变量,当使用时,直接选择即可- 全局的环境变量,可以定义基础的一些变量- 集合变量,作用域只作用于当前集合中- 内置的动态变量$guid- 使用,内置动态变量使用
{{$guid}}
, 其他引用直接{{变量名}}
- 断言- 该功能就是在请求结束后要做的操作,不仅限于断言,还能,set变量,get变量,clear变量。- 断言:- 状态码断言,判断响应状态码是否是指定的状态码- 字符串断言,文本类型的请求结果中是否包含指定的字符- json断言,判断jsonData中,指定的key值是否符合预期- 在集合中,如果有一些公共的断言,可以写在集合的断言中,不用在每个接口里面写断言了,避免了重复造轮子,只需要在接口中实现接口特定的断言
- 集合自动化- 能自动的将集合内的接口进行自动化运行,指定运行的轮次- 在自动化运行中,可以加入断言- 还可以做数据驱动测试,即测试数据来自外部的文件中,一般我们选择将外部数据保存为CSV和json类型。- CSV:是一个无格式的文本文件,但它可以使用Excel打开。- 可以导出json类型的运行结果。
- 命令行测试- 在终端中进行执行postman脚本。- 要下载newman插件,该插件用来在终端中执行postman脚本,但该插件本身基于nodejs开发,所以要配置:- nodejs ---- 版本问题,不能太高,太高了,低版本的Windows报错,太低了,插件装不上,所以,选择 >=10版本的, 也不要选择最新版本的- nodejs有nmp(下载软件的工具),在国内受网络影响,所以,配置cnpm,即淘宝的npm镜像- 在进行终端测试时,还需要导出html文件, 那就要在下载 reporter插件- 上述几个软件和插件下载完毕,可以执行命令:- newman run 脚本 -d 参数文件 -e 环境文件 -n 循环次数 -r html --reporter-html-export 测试报告路径- ##
版权归原作者 测试架构师北凡 所有, 如有侵权,请联系我们删除。