接口自动化测试笔记,自用
来源:https://www.bilibili.com/video/BV1Cs4y1C73Hp=45\&vd_source=37bf552472afa993fb78c918d1dea2bc
目录
[1、路径参数Path Parameters](#1、路径参数Path Parameters)
[2、查询参数Query Parameters](#2、查询参数Query Parameters)
一、Postman接口测试
1.postman自动关联
登录时需要手动填入验证码,可以设置公共数据在容器中
1)创建环境并选择
2)使用自动关联技术,登录成功
需求:
1、验证码接口:/captcha
2、登录接口:sys/login
3、登录接口请求体uuid字段→验证码接口返回uuid字段
操作:
1、设置提取环境变量-验证码uuid
javascript
//验证码接口响应体中提取uuid
var jsonData = pm.response.json()
//设置环境变量保存uuid
pm.environment.set("uuid", jsonData.uuid)
2、登录接口引用变量
javascript
//引用
key:{{变量名}}
需求:
登录后获取列表
1、登录接口:/login
2、获取列表接口:admin/selectAll
3、获取列表请求token字段->登录接口返回token字段
2.postman批量执行
作用:通过运行测试集的方式批量运行测试用例。
需求:用户登录->查询列表->新增
步骤:
1、点击测试集中的"Run"按钮,批量运行测试用例②
2、弹出Collection Runner窗口,点击运行按钮③
3、查看测试结果
3.接口用例设计
1)单接口测试用例-登录
优先级:业务->正向->逆向
1、提取测试点
2、设计测试用例
按照:id、模块名称、优先级、用例名称、接口名称、前置条件、请求url、请求方法、请求头、请求参数类型、请求参数、预期结果、实际结果
3、执行测试用例(建立测试集)
2)单接口测试用例-根据id
-注意请求参数格式
1、路径参数Path Parameters
2、查询参数Query Parameters
- 这些参数附加在 URL 的末尾,通常用于过滤、排序或分页等目的。它们以**
?
** 开始,多个参数之间用 **&
**分隔。 - 示例:
GET /users?age=25&sort=asc
,其中age
和sort
是查询参数
4.postman断言
作用:让Postman工具代替人工自动判定预期结果和实际结果是否一致。
1)响应状态码断言
javascript
//断言响应状态码为200
pm.test("Status code is 200", function () {
pm.response.to.have.status(200);
});
2)包含指定字符串断言
javascript
//断言响应数据中包含admin
pm.test("Body matches string", function () {
pm.expect(pm.response.text()).to.include("string_you_want_to_search");
});
3)JSON断言指定变量
javascript
//断言json返回数据中msg值为"成功"
pm.test("Your test name", function () {
var jsonData = pm.response.json();
pm.expect(jsonData.value).to.eql(100);
});
5.postman参数化
场景:测试脚本中仅测试数据不一样,使用参数化 提高脚本复用 。
步骤:
1、测试数据保存在数据文件单独维护
2、引用数据文件实现脚本循环调用
-创建json格式的测试数据(包含输入数据和预期结果)
-在Tests中引入数据变量
-Runn中选择json文件
-批量执行查看是否通过
二、接口自动化测试(Python)
1.搭建自动化测试环境
1)接口自动化流程
2)核心技术
编程语言:python
测试框架:pytest
接口请求:requests
python
#安装pytest框架
pip install pytest
#安装request请求
pip install requests
#验证
pytest --version
pip show requests
2.接口自动化框架
1)框架
2)思路
3)搭建基础框架
-定义项目目录结构
3.Requests-登录接口
1)Requests介绍
Requests库::python中的"浏览器",基于urllib的HTTP库
python
#安装
pip3 install requests
#验证
pip3 show requests
操作步骤:
导包 -> 发送接口请求 -> 查看响应数据
2)Requests发送请求
3)Response查看响应
4)示例=登录接口自动化
注意:报错不兼容中文编码
解决方法:在文件前面添加以下代码
python
# -*- coding:utf8 -*-
4.接口优化-接口对象层
登录后的token需保存在公共区域
1)接口对象封装
-api层-接口封装层
python
#login.py
# -*- coding:utf8 -*-
# 接口信息
# 登录:
# 地址:http://localhost:9090/login
# 方法:POST
# 请求数据:
# 请求体:
# { "username": "admin2","password": "admin2","role":"ADMIN" }
# 需要使用的测试数据是从测试用例传递的、接口方法被调用时需要返回对应的响应结果
#导包
import requests
#创建接口类
class LoginAPI:
#初始化
def __init__(self):
#指定url信息
self.url_login = "http://localhost:9090/login"
#登录返回响应数据
def login(self, test_data):
return requests.post(self.url_login, json=test_data)
python
#selectAll.py
# -*- coding:utf8 -*-
# 接口信息
# 查询所有:
# 地址:http://localhost:9090/admin/selectAll
# 方法:GET
#接口封装:核心在于依据接口文档实现接口信息封装、重点关注接口如何被调用
# 导包
import requests
#创建接口类
class SelectAllAPI:
def __init__(self):
#指定url
self.url_selectAll = "http://localhost:9090/admin/selectAll"
def select_all(self, token):
#查询所有返回的响应数据
return requests.get(url = self.url_selectAll, headers = {"token": token})
2)测试脚本层
-scripts层-脚本测试层
python
#test02_selectAll.py
# -*- coding:utf8 -*-
#测试查询全部
#导包
from api.login import LoginAPI
from api.selectAll import SelectAllAPI
# 创建测试类
class TestSelectAll:
# 初始化
token = None
# 前置处理
def setup_method(self):
#实例化接口对象
self.login_api = LoginAPI()
self.select_all_api = SelectAllAPI()
# 后置处理
def teardown_method(self):
pass
# 1.登录成功
def test01_login_success(self):
# 登录
login_data = {
"username": "admin2",
"password": "admin2",
"role":"ADMIN"
}
#调用登录接口
res_l = self.login_api.login(test_data = login_data)
print(res_l.status_code)
print(res_l.json())
#提取登录成功之后的token数据并保存在类的属性中
TestSelectAll.token = res_l.json().get("data").get("token")
print(TestSelectAll.token)
# 2.查询所有成功
def test02_select_all_success(self):
#调用查询所有接口
response = self.select_all_api.select_all(token = TestSelectAll.token)
print (response.status_code)
print (response.json())
3)PyCharm选择pytest框架执行
4)文件上传接口
-接口封装
python
# upload.py
# 上传文件
# 地址:http://localhost:9090/files/upload
# 方法:POST
# 请求头:{ "Content-Type": "multipart/form-data", "token" : xxx}
# 请求体:{ "file": "xxxx" }
#接口封装:核心在于如何读取文件数据
#导包
import requests
#创建接口类
class UploadAPI:
# 初始化
def __init__(self):
self.url_upload = "http://localhost:9090//files/upload"
# 上传文件接口
def upload(self, test_data, token):
return requests.post(url = self.url_upload, files = {"file": test_data}, headers = {"token": token})
-关键测试脚本
python
# 2.上传文件成功
def test02_upload_success(self):
#读取jpg文件数据 r为读 b为字节
f = open("../data/avatar01.jpg", "rb")
response = self.upload_api.upload(test_data=f, token=TestSelectAll.token)
print(response.json())
5.单接口自动化测试
1)Python常见断言方式
1、相等断言: asset test_data == 'xxx'
2、包含断言:assert 'xxx' in test_data
2)登录-单接口测试
-测试脚本
python
#test04_login
# 登录单接口测试
# 导包
from api.login import LoginAPI
from script.test01_login import response
# 创建测试类
class TestLoginAPI:
#初始化
token = None
#前置处理
def setup_method(self):
self.login_api = LoginAPI()
#后置处理
def teardown_method(self):
pass
#1. 登录成功
def test01_login_success(self):
login_data = {
"username": "admin2",
"password": "admin2",
"role": "ADMIN"
}
#调用接口
response = self.login_api.login(test_data=login_data)
#断言 状态码为200
assert 200 == response.status_code
#断言 响应数据中包含"token"
assert "token" in response.text
#断言 响应json数据中"msg"值为"成功"
assert "成功" == response.json().get("msg")
#2. 登录失败(用户名为空)
def test02_without_username(self):
login_data = {
"username": "",
"password": "admin",
"role":"ADMIN"
}
# 调用接口
response = self.login_api.login(test_data=login_data)
# 断言 状态码为200
assert 200 == response.status_code
# 断言 响应数据中包含"4001"
assert "4001" in response.text
# 断言 响应json数据中"msg"值为"参数缺失"
assert "参数缺失" == response.json().get("msg")
#2. 登录失败(未注册用户名)
def test02_username_no_register(self):
login_data = {
"username": "admin3",
"password": "admin",
"role": "ADMIN"
}
# 调用接口
response = self.login_api.login(test_data=login_data)
# 断言 状态码为200
assert 200 == response.status_code
# 断言 响应数据中包含"5004"
assert "5004" in response.text
# 断言 响应json数据中"msg"值为"用户不存在"
assert "用户不存在" == response.json().get("msg")
#3. 登录失败(用户密码为空)
def test03_without_password(self):
login_data = {
"username": "admin",
"password": "",
"role": "ADMIN"
}
# 调用接口
response = self.login_api.login(test_data=login_data)
# 断言 状态码为200
assert 200 == response.status_code
# 断言 响应数据中包含"4001"
assert "4001" in response.text
# 断言 响应json数据中"msg"值为"参数缺失"
assert "参数缺失" == response.json().get("msg")
#4. 登录失败(用户与密码不匹配)
def test04_not_matched(self):
login_data = {
"username": "admin",
"password": "admin1",
"role": "ADMIN"
}
# 调用接口
response = self.login_api.login(test_data=login_data)
# 断言 状态码为200
assert 200 == response.status_code
# 断言 响应数据中包含"5003"
assert "5003" in response.text
# 断言 响应json数据中"msg"值为"账号或密码错误"
assert "账号或密码错误" == response.json().get("msg")
-断言结果
3)登录-数据驱动实现
数据驱动:以测试数据驱动脚本执行,维护焦点从脚本转向测试数据的一种自动化测试设计模式。
步骤:
1、导包 import pytest
2、编写测试数据(输入值和预期结果)注意:要用[ ( ), ( ), ..]
3、在测试方法上引入参数化(@pytest.mark.parametrize( , ) )注意:变量与值一一对应!
python
# test05_login_params
# 登录单接口测试-数据驱动
# 导包
from api.login import LoginAPI
import pytest
#测试数据
test_data = [
("admin", "admin", 200, "token", "成功"),
("", "admin", 200, "4001", "参数缺失"),
("admin3", "admin", 200, "5004", "用户不存在"),
("admin", "", 200, "4001", "参数缺失"),
("admin", "admin1", 200, "5003", "账号或密码错误")
]
# 创建测试类
class TestLoginAPI:
#初始化
token = None
#前置处理
def setup_method(self):
self.login_api = LoginAPI()
#后置处理
def teardown_method(self):
pass
#循环测试方法
@pytest.mark.parametrize("username, password, status, code, msg", test_data)
def test_login(self, username, password, status, code, msg):
login_data = {
"username": username,
"password": password,
"role": "ADMIN"
}
#调用接口
response = self.login_api.login(test_data=login_data)
#断言 状态码为200
assert status == response.status_code
#断言 响应数据中包含"token"
assert code in response.text
#断言 响应json数据中"msg"值为"成功"
assert msg == response.json().get("msg")
4)登录-json文件实现数据驱动
数据驱动好处:
①以测试数据驱动脚本执行
②维护焦点从脚本转向测试数据文件
③增强代码的可维护性
步骤:
1、准备json文件
javascript
//login.json
[
{
"username": "admin",
"password": "admin",
"status": 200,
"code": "token",
"msg": "成功"
},
{
"username": "",
"password": "admin",
"status": 200,
"code": "4001",
"msg": "参数缺失"
},
{
"username": "admin3",
"password": "admin",
"status": 200,
"code": "5004",
"msg": "用户不存在"
},
{
"username": "admin",
"password": "",
"status": 200,
"code": "4001",
"msg": "参数缺失"
},
{
"username": "admin",
"password": "admin1",
"status": 200,
"code": "5003",
"msg": "账号或密码错误"
}
]
2、读取json文件,转为列表
python
import json
#读取json文件
def build_data(json_file):
# 定义空列表
test_data = []
# 打开json文件
with open(json_file, "r", encoding='UTF-8') as f:
# 加载json文件数据
json_data = json.load(f)
# 循环遍历测试数据
for case_data in json_data:
# 转换数据格式 [{},{}] ==> [(),()]
username = case_data.get('username')
password = case_data.get('password')
status = case_data.get('status')
code = case_data.get('code')
msg = case_data.get('msg')
#加入列表
test_data.append((username, password, status, code, msg))
# 返回处理之后的测试数据
return test_data
注意!报错gbk编码,需添加 encoding='UTF-8'
3、调用方法获取调整后的json数据
6.项目配置文件config
python
# config.py
# 存放被测试项目基本信息,如URL地址等
# 导包
import os
# 设置项目环境域名
BASE_URL= "http://localhost:9090"
# 获取项目根路径
BASE_PATH= os.path.dirname(__file__)
print(BASE_PATH)
7.Allure测试报告
1)Allure介绍
-能生成美观易读的报告
-支持多种开发语言,如java、python等
-能快速上手
安装allure和allure-pytest
2)生成测试结果文件(json文件)
①修改 pytest.ini 配置文件
python
#pytest.ini
[pytest]
#指定存放结果报告的目录为 report
addopts = -s --alluredir report
#指定测试文件的位置
testpaths = ./script
#指定要运行的测试文件
python_files = test*.py
#指定要运行的测试类
python_classes = Test*
#指定要运行的测试方法
python_functions = test*
②运行pytest命令产生测试结果文件