目录
Postman任务运行后,postman_Allure任务随之运行
配套资料链接: 百度网盘 请输入提取码
项目简介
项目名称:客达天下项目类型:销售管理系统(CRM)项目特点:前后端分离、功能通用性强项目链接:客达天下/
待测接口
-
合同管理业务
-
登录
-
添加课程
-
上传合同
-
新增合同
-
-
课程管理模块
-
添加课程
-
修改课程
-
查询课程
-
删除课程
-
测试流程
-
接口文档解析
-
设计测试用例
-
脚本开发
-
执行脚本
-
缺陷跟踪
-
测试报告
设计接口测试用例
-
根据流程图、找出业务路径
-
根据业务路径分析对应的接口请求
-
将业务路径转化为接口测试用例
合同新增业务
合同新增流程图:
业务路径
解析接口文档
对新增合同接口文档进行分析,通过请求中的参数(URL、请求方法、请求头、请求参数类型、请求参数等),设计测试用例
接口测试用例
接口测试-合同
验证码接口
请求路径:
http://kdtx-test.itheima.net/api/captchaImage
实现步骤:
-
设置请求方式和接口地址
-
发送请求
-
查看响应结果
登录接口
请求路径:
http://kdtx-test.itheima.net/api/login
实现步骤:
-
设置请求方式和接口地址
-
设置请求头
-
设置请求体
-
发送请求
-
查看响应结果
验证码和登录接口关联
上文可知,登录接口的请求体中包括验证码接口的返回值,使用关联技术可以避免手动赋值
需求:
-
验证码接口:/api/captchaImage
-
登录接口:/api/login
-
登录接口请求体uuid字段->验证码接口返回uuid字段
实现步骤:
-
创建Environments并添加变量 (此处设置为uuid)
-
创建Collection并设置环境
-
添加对应请求 Image、Login (与上文中验证码接口、登录接口一致)
-
验证码接口中配置tests
-
登录接口中使用变量uuid
-
查看响应结果
需要先运验证码接口,在运行登录接口
新增课程接口
请求路径:
http://kdtx-test.itheima.net/api/clues/course
实现步骤:
-
Environments中设置token
-
登录接口中设置tests
-
创建对应请求
-
发送请求
-
查看响应结果
合同上传接口
请求路径:
http://kdtx-test.itheima.net/api/common/upload
实现步骤:
-
创建对应请求
-
发送请求并查看响应结果
添加合同接口
请求路径:
http://kdtx-test.itheima.net/api/contract
请求样例: { "name":"测试接口21", "phone":"12222222222", "contractNo":"HT100120234", "subject":"6", "courseId":99, "channel":"0", "activityId":77, "fileName":"{{fileName}}" }
实现步骤:
-
Environments中设置fileName
-
合同上传接口设置Tests
-
创建添加合同接口并设置对应属性
-
发送请求并查看响应结果
合同列表接口
请求路径:
http://kdtx-test.itheima.net/api/contract/list
实现步骤:
-
创建对应请求
-
发送请求并查看响应结果
单接口测试
登录接口
请求路径:
http://kdtx-test.itheima.net/api/login
需求:
-
已注册正确的用户名和密码,登录成功
-
用户名或密码错误,登录失败, 提示"用户名或密码错误"
提取测试点
设计测试用例
进行测试
-
关联验证码接口(省略)
-
设置不同的请求数据登录成功
登录失败-用户名为空
登录失败-未注册用户名
-
发送请求并查看返回结果登录成功
登录失败-用户名为空
登录失败-未注册用户名
断言简化测试
在登录请求的Tests种添加以下内容:
//断言 状态码为200 pm.test("Status code is 200", function () { pm.response.to.have.status(200); }); //断言数据中包含 "成功" pm.test("Body matches string", function () { pm.expect(pm.response.text()).to.include("成功"); }); //断言json返回数据中的msg值为 "操作成功" pm.test("Your test name", function () { var jsonData = pm.response.json(); pm.expect(jsonData.msg).to.eql("操作成功"); });
发送请求并查看响应结果:
课程添加接口
请求路径:
http://kdtx-test.itheima.net/api/clues/course
需求:
-
必填参数
-
-
课程名称 (不超过30个字符)
-
课程学科 (1位数字,0->java,1->前端,6->测试)
-
课程价格 (1-5位数字)
-
使用人群 (1位数字,1->小白,2->中级程序员)
-
-
非必填参数
-
-
课程介绍 (不超过200个字符)
-
提取测试点
设计测试用例
查询课程列表接口
请求路径:
http://kdtx-test.itheima.net/api/clues/course/list
需求:
-
支持课程名称、课程学科、课程价格、适用人群、课程介绍的单条件查询
-
支持课程名称、课程学科、课程价格、适用人群、课程介绍的组合条件查询
-
查询存在满足条件课程信息时,返回该课程信息
-
查询不存在满足条件课程信息时,返回空值
提取测试点
设计测试用例
课程修改接口
请求路径:
http://kdtx-test.itheima.net/api/clues/course
需求:
-
课程ID (数字、必填)
提取测试点
设计测试用例
课程删除接口
请求路径:
http://kdtx-test.itheima.net/api/clues/course/id
需求:
-
课程ID (数字、必填)
提取测试点
设计测试用例
PostMan
批量执行
选中需要执行的Collections,点击运行按钮
选择要执行的请求,点击右侧按钮执行
断言
代替人工自动判定预期结果和实际结果是否一致
响应码断言
包含指定字符串断言
JSON数据断言
参数化
自定义变量
在Collections界面下的Variables页面卡中可以自定义变量
之后可以使用 {{变量名}} 来使用
JSON
创建json文件,内容如下:
[ {"username":"manager","password":123456,"status":200,"message":"成功","msg":"操作成功"}, {"username":"admin","password":"HM_2023_test","status":200,"message":"成功","msg":"操作成功"} ]
使用批量运行的方式,选择创建的json文件
可点击 Preview 按钮进行预览
修改请求中的Tests (使用data.名称 的形式)
在Body中使用{{变量名}}
批量运行
CSV
创建json文件,内容如下:
username,password,status,message,msg manager,123456,200,成功,操作成功 admin,HM_2023_test,200,成功,操作成功
其它配置同json
自动化
使用工具或代码代替人工对接口进行测试
接口自动化框架设计思路
搭建环境
-
编程语言:python
-
测试框架:pytest
-
接口请求:requests
安装requests
pip install requests
检查安装:
pip3 show requests
基础知识
Requests:
Response:
代码实现验证码接口
-
script文件夹下创建 ImageTest.py文件,添加以下内容
#获取图片验证码 import requests #导包 import requests #发送请求 response = requests.get(url="http://kdtx-test.itheima.net/api/captchaImage") #查看响应 print(response.status_code) print(response.text)
-
运行查看结果
代码实现登录接口
-
script文件夹下创建 LoginTest.py文件,添加以下内容
#登录接口 #导包 import requests #发送请求 url="http://kdtx-test.itheima.net/api/login" headers={ "Content-Type":"application/json", } loginData={ "username":"admin", "password":"HM_2023_test", "code":"2", "uuid":"37cb173d9c9245278ed786ce39ff974e" #运行ImageTest.py得到其中的uuid } response = requests.post(url=url,headers=headers,json=loginData) #查看响应 print(response.status_code) print(response.text)
-
运行查看结果
接口对象封装
安装Pytest
pip install pytest==7.4.0 可能还需要以下配置: pytest的测试用例文件名需要以test_命名开头 pycharm导航栏鼠标移入file点击Settings,选择Settings-Tools-Python Integrated Tools,Tesing 下拉框 选 pytest 点击OK
-
在api文件夹下创建login.py文件,添加以下内容
import requests # 创建接口类 class LoginAPI: # 初始化 def __init__(self): # 指定url基本信息 self.url_verify = "http://kdtx-test.itheima.net/api/captchaImage" self.url_login = "http://kdtx-test.itheima.net/api/login" # 验证码 def get_verify_code(self): return requests.get(url=self.url_verify) # 登录 def login(self, test_data): return requests.post(url=self.url_login, json=test_data)
-
在script目录下创建ContracTest.py文件,添加以下内容:
# 导包 from api.login import LoginAPI # 创建测试类 class TestContract: # 初始化 token = None # 前置处理 def setup(self): # 实例化接口对象 self.login_api = LoginAPI() # 后置处理 def teardown(self): pass # 1、登录成功 def test_login_success(self): # 获取验证码 responseImage = self.login_api.get_verify_code() print(responseImage.status_code) print(responseImage.json()) # 打印uuid数据 print(responseImage.json().get("uuid")) # 登录 login_data = { "username": "admin", "password": "HM_2023_test", "code": "2", "uuid": responseImage.json().get("uuid") } res_l = self.login_api.login(test_data=login_data) print(res_l.status_code) print(res_l.json())
-
运行查看响应结果
代码实现课程新增接口
-
在api目录下创建course.py文件,添加以下内容
import requests # 创建接口类 class CourseAPI: # 初始化 def __init__(self): self.url_add_course = "http://kdtx-test.itheima.net/api/clues/course" self.url_select_course = "http://kdtx-test.itheima.net/api/clues/course/list" # 课程添加 def add_course(self, test_data, token): return requests.post(url=self.url_add_course, json=test_data, headers={"Authorization": token})
-
script目录下ContractTest.py文件添加以下内容
from api.login import LoginAPI from api.course import CourseAPI # 创建测试类 class TestContract: # 初始化 token = None # 前置处理 def setup(self): # 实例化接口对象 self.login_api = LoginAPI() self.course_api= CourseAPI() # 后置处理 def teardown(self): pass # 1、登录成功 def test_login_success(self): # 获取验证码 responseImage = self.login_api.get_verify_code() print(responseImage.status_code) print(responseImage.json()) # 打印uuid数据 print(responseImage.json().get("uuid")) # 登录 login_data = { "username": "admin", "password": "HM_2023_test", "code": "2", "uuid": responseImage.json().get("uuid") } res_l = self.login_api.login(test_data=login_data) print(res_l.status_code) print(res_l.json()) TestContract.token=res_l.json().get("token") #添加token print(TestContract.token) # 课程新增 方法 def test_add_Course(self): add_data = {"name": "测试开发提升课01", "subject": "6", "price": 899, "applicablePerson": "2", "info": "测试开发提升课01"} response=self.course_api.add_course(test_data=add_data,token=TestContract.token) print(response.json())
-
运行查看响应结果
代码实现合同上传及合同新增接口
-
在config.py文件中添加以下内容
import os # 设置项目环境域名 BASE_URL = "http://kdtx-test.itheima.net" # 获取项目根路径 BASE_PATH = os.path.dirname(__file__)
-
在api目录下创建contract.py文件,添加以下内容
import requests import config # 创建接口类 class ContractAPI: # 初始化 def __init__(self): self.url_upload = config.BASE_URL + "/api/common/upload" self.add_contrat = config.BASE_URL + "/api/contract" # 合同上传接口 def upload_contract(self, test_data, token): return requests.post(url=self.url_upload, files={"file": test_data}, headers={"Authorization": token}) # 合同新增 def add_contract(self, test_data, token): return requests.post(url=self.add_contrat, json=test_data, headers={"Authorization": token})
-
在script目录下的TestContract.py文件中追加下面的内容:
# 导包 from api.login import LoginAPI from api.course import CourseAPI from api.contract import ContractAPI import config # 创建测试类 class TestContract: # 初始化 token = None fileName=None # 前置处理 def setup(self): # 实例化接口对象 self.login_api = LoginAPI() self.course_api= CourseAPI() self.contract_api = ContractAPI() # 后置处理 def teardown(self): pass # 1、登录成功 def test_login_success(self): # 获取验证码 responseImage = self.login_api.get_verify_code() print(responseImage.status_code) print(responseImage.json()) # 打印uuid数据 print(responseImage.json().get("uuid")) # 登录 login_data = { "username": "admin", "password": "HM_2023_test", "code": "2", "uuid": responseImage.json().get("uuid") } res_l = self.login_api.login(test_data=login_data) print(res_l.status_code) print(res_l.json()) TestContract.token=res_l.json().get("token") #添加token print(TestContract.token) # 课程新增 方法 def test_add_Course(self): add_data = {"name": "测试开发提升课01", "subject": "6", "price": 899, "applicablePerson": "2", "info": "测试开发提升课01"} response=self.course_api.add_course(test_data=add_data,token=TestContract.token) print(response.json()) # 上传合同成功 def test_upload_contract(self): self.test_login_success() # 前置条件:登录 # 读取pdf文件数据 # f = open("../data/test.pdf", "rb") f = open(config.BASE_PATH + "/data/1.txt", "rb") response = self.contract_api.upload_contract(test_data=f, token=TestContract.token) TestContract.fileName=response.json().get("fileName") print(response.json()) # 合同新增成功 def test_add_contract(self): self.test_upload_contract() #前置条件-上传合同 # contractNo: 数据唯一 add_data = {"name": "测试888", "phone": "13612345678", "contractNo": "HT20230007", "subject": "6", "courseId": " 99", "channel": "0", "activityId": 77, "fileName": TestContract.fileName} response = self.contract_api.add_contract(test_data=add_data, token=TestContract.token) print(response.json())
-
运行查看响应结果
上传合同需要在data目录下存放对应的文件
代码实现单接口测试-登录接口-JSON实现
代码:
from api.login import LoginAPI import pytest import json import config # # 测试数据 # test_data = [ # ("admin", "HM_2023_test", 200, '成功', 200), # ("", "123456", 200, '错误', 500), # ("jack666", "123456", 200, '错误', 500), # ] # 读取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") message = case_data.get("message") code = case_data.get("code") test_data.append((username, password, status, message, code)) # 返回处理之后测试数据 return test_data # 创建测试类 class TestLoginAPI: # 初始化 uuid = None # 前置处理 def setup(self): # 实例化接口类 self.login_api = LoginAPI() # 获取验证码 response = self.login_api.get_verify_code() print(response.json()) # 提取验证码接口返回的uuid参数值 TestLoginAPI.uuid = response.json().get("uuid") print(TestLoginAPI.uuid) # 后置处理 def teardown(self): pass # 登录成功 # @pytest.mark.parametrize("username, password, status, message, code", build_data(json_file="../data/login.json")) @pytest.mark.parametrize("username, password, status, message, code", build_data(json_file=config.BASE_PATH + "/data/login.json")) def test01_success(self, username, password, status, message, code): login_data = { "username": username, "password": password, "code": "2", "uuid": TestLoginAPI.uuid } response = self.login_api.login(test_data=login_data) # 断言响应状态码为200 assert status == response.status_code # 断言响应数据包含'成功' assert message in response.text # 断言响应json数据中code值 assert code == response.json().get("code")
运行结果:
自动化集成Allure
下载地址:
GitHub: https://github.com/allure-framework/allure2/releases 镜像源: https://repo.maven.apache.org/maven2/io/qameta/allure/allure-commandline/
解压并添加环境变量(bin目录)
检验安装
allure --version
配置pytest.ini文件,添加以下内容:
[pytest] addopts=-s --alluredir report testpaths=./script python_files=ContractTest.py python_classes=Test* python_functions=test*
运行pytest:(终端中)
pytest
然后可以看到report目录下生成了对应日志
生成Allure报告:在对应的路径下运行下面命令
allure serve report
运行之后会弹出网页,可以看到详细的测试报告
出错原因:更新及删除的操作需要指定对应的id,此处并未指定
集成Jenkins
由于postman请求中使用了断言,并且请求中包含接口验证的错误用例,故报告中存在的问题均在预期之内
搭建Newman自动化测试环境
Newman 是一个命令行工具,用于运行 Postman 集合。它允许你在命令行中自动化测试 API,并可以与持续集成和持续部署(CI/CD)流程集成 相关操作
首先要安装node.jscmd中执行下面命令 验证是否正确安装:
node -v
运行下面命令安装newman:
npm install -g newman
之后运行下面命令验证是否正确安装:
newman -v
然后导出我们的测试文件
使用cmd进入到测试文件所在目录,运行以下命令
newman run .\Postman.json --reporters cli
普通报告和加强版报告
#导入报告模块 ##普通 npm install -g newman-reporter-html ##加强版 npm install -g newman-reporter-htmlextra #运行下面命令 生成报告(HTML) newman run Postman.json -r html,htmlextra --reporter-html-export --reporter-html-export html1.html --reporter-htmlextra-export html2.html
普通版html
加强版html
会发现:此页面样式错误,原因是引用的js文件在国外解决方法:手动修改对应的js文件
https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css 修改为 https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/5.3.1/css/bootstrap.min.css
Allure报告
#运行下面命令安装依赖 npm install newman-reporter-allure -g #运行下面命令生成results newman run Postman.json --reporters allure --reporter-allure-export allure-results #运行下面命令查看 报告 allure serve
通过Jenkins持续集成
官网:Jenkins/
安装好之后,cmd进入对应文件夹中运行下面命令
java -jar -Dfile.encoding=UTF-8 jenkins.war
进入之后,我们点击左侧的新建Item创建任务
输入任务名称、选择 Freestyle project
选中Build perodiaclly 设置以下内容:
#每分钟执行一次 * * * * *
Build Steps中选择ExecuteWindowsbatchcommand 来执行我们的cmd命令
call newman run D:\newman\Postman.json --reporters cli exit 0
之后会发现,每分钟都会构建
查看控制台输出可以发现
自动构建包含Allure生成报告的任务
至此,已经实现了定时构建,下面我们实验以下内容:当newman构建时(模拟开发上传新代码等),自动构建包含Allure生成报告的任务
配置Allure插件
网站:Index of /jenkins/plugins/allure-jenkins-plugin/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror/
下载插件之后,进入下面界面安装
选择刚才下载的文件之后,点击部署
重启Jenkins即可
创建任务
同样的,我们创建新的任务
在构建触发器部分,配置下面的内容
Build Steps部分,我们仍选择windows命令行,输入以下内容
## call md allure-results 可不加 call newman run D:\newman\Postman.json --reporters cli,allure --reporter-allure-export allure-results exit 0
添加构建后操作
注意这两个路径是有要求的,相对于工作目录。
results目录与上方命令中的目录是一致的,不然会出现报告没有数据的情况
Postman任务运行后,postman_Allure任务随之运行
查看Allure Report报告如下
此处图标为!指测试中有失败样例(与测试用例有关),至此,实现了Jenkins+Allure自动化测试报告的持续集成