> 技术文档 > 黑马客达天下-接口测试-Postman+Pytest+Allure+Jenkins实现持续集成_客达天下项目

黑马客达天下-接口测试-Postman+Pytest+Allure+Jenkins实现持续集成_客达天下项目

目录

项目简介

待测接口

测试流程

设计接口测试用例

合同新增业务

业务路径

解析接口文档

接口测试用例

接口测试-合同

验证码接口

登录接口

验证码和登录接口关联

新增课程接口

合同上传接口

添加合同接口

合同列表接口

单接口测试

登录接口

提取测试点

设计测试用例

进行测试

断言简化测试

课程添加接口

提取测试点

设计测试用例

查询课程列表接口

提取测试点

设计测试用例

课程修改接口

提取测试点

设计测试用例

课程删除接口

提取测试点

设计测试用例

PostMan

批量执行

断言

响应码断言

包含指定字符串断言

JSON数据断言

参数化

自定义变量

JSON

CSV

自动化

搭建环境

基础知识

代码实现验证码接口

代码实现登录接口

接口对象封装

代码实现课程新增接口

代码实现合同上传及合同新增接口

代码实现单接口测试-登录接口-JSON实现

自动化集成Allure

集成Jenkins

搭建Newman自动化测试环境

普通报告和加强版报告

Allure报告

通过Jenkins持续集成

自动构建包含Allure生成报告的任务

配置Allure插件

创建任务

Postman任务运行后,postman_Allure任务随之运行


配套资料链接: 百度网盘 请输入提取码

项目简介

项目名称:客达天下项目类型:销售管理系统(CRM)项目特点:前后端分离、功能通用性强项目链接:客达天下/

待测接口

  • 合同管理业务

    • 登录

    • 添加课程

    • 上传合同

    • 新增合同

  • 课程管理模块

    • 添加课程

    • 修改课程

    • 查询课程

    • 删除课程

测试流程

  1. 接口文档解析

  2. 设计测试用例

  3. 脚本开发

  4. 执行脚本

  5. 缺陷跟踪

  6. 测试报告

设计接口测试用例

  1. 根据流程图、找出业务路径

  2. 根据业务路径分析对应的接口请求

  3. 将业务路径转化为接口测试用例

合同新增业务

合同新增流程图:

业务路径

解析接口文档

对新增合同接口文档进行分析,通过请求中的参数(URL、请求方法、请求头、请求参数类型、请求参数等),设计测试用例

接口测试用例

接口测试-合同

验证码接口

请求路径:

http://kdtx-test.itheima.net/api/captchaImage 

实现步骤:

  1. 设置请求方式和接口地址

  2. 发送请求

  3. 查看响应结果

登录接口

请求路径:

http://kdtx-test.itheima.net/api/login

实现步骤:

  1. 设置请求方式和接口地址

  2. 设置请求头

  3. 设置请求体

  4. 发送请求

  5. 查看响应结果

验证码和登录接口关联

上文可知,登录接口的请求体中包括验证码接口的返回值,使用关联技术可以避免手动赋值

需求:

  1. 验证码接口:/api/captchaImage

  2. 登录接口:/api/login

  3. 登录接口请求体uuid字段->验证码接口返回uuid字段

实现步骤:

  1. 创建Environments并添加变量 (此处设置为uuid)

  2. 创建Collection并设置环境

  3. 添加对应请求 Image、Login (与上文中验证码接口、登录接口一致)

  4. 验证码接口中配置tests

  5. 登录接口中使用变量uuid

  6. 查看响应结果

需要先运验证码接口,在运行登录接口

新增课程接口

请求路径:

http://kdtx-test.itheima.net/api/clues/course

实现步骤:

  1. Environments中设置token

  2. 登录接口中设置tests

  3. 创建对应请求

  4. 发送请求

  5. 查看响应结果

合同上传接口

请求路径:

http://kdtx-test.itheima.net/api/common/upload

实现步骤:

  1. 创建对应请求

  2. 发送请求并查看响应结果

添加合同接口

请求路径:

http://kdtx-test.itheima.net/api/contract
请求样例:{   \"name\":\"测试接口21\",   \"phone\":\"12222222222\",   \"contractNo\":\"HT100120234\",   \"subject\":\"6\",   \"courseId\":99,   \"channel\":\"0\",   \"activityId\":77,   \"fileName\":\"{{fileName}}\"}

实现步骤:

  1. Environments中设置fileName

  2. 合同上传接口设置Tests

  3. 创建添加合同接口并设置对应属性

  4. 发送请求并查看响应结果

合同列表接口

请求路径:

http://kdtx-test.itheima.net/api/contract/list

实现步骤:

  1. 创建对应请求

  2. 发送请求并查看响应结果

单接口测试

登录接口

请求路径:

http://kdtx-test.itheima.net/api/login

需求:

  • 已注册正确的用户名和密码,登录成功

  • 用户名或密码错误,登录失败, 提示\"用户名或密码错误\"

提取测试点

设计测试用例

进行测试
  1. 关联验证码接口(省略)

  2. 设置不同的请求数据登录成功

    登录失败-用户名为空

    登录失败-未注册用户名

  3. 发送请求并查看返回结果登录成功

    登录失败-用户名为空

    登录失败-未注册用户名

断言简化测试

在登录请求的Tests种添加以下内容:

//断言 状态码为200pm.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,msgmanager,123456,200,成功,操作成功admin,HM_2023_test,200,成功,操作成功

其它配置同json

自动化

使用工具或代码代替人工对接口进行测试

接口自动化框架设计思路

搭建环境

  • 编程语言:python

  • 测试框架:pytest

  • 接口请求:requests

安装requests

pip install requests

检查安装:

pip3 show requests

基础知识

Requests:

Response:

代码实现验证码接口

  1. 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)
  2. 运行查看结果

代码实现登录接口

  1. 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)
  2. 运行查看结果

接口对象封装

安装Pytest

pip install pytest==7.4.0​可能还需要以下配置:pytest的测试用例文件名需要以test_命名开头pycharm导航栏鼠标移入file点击Settings,选择Settings-Tools-Python Integrated Tools,Tesing 下拉框 选 pytest 点击OK
  1. 在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)
  2. 在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())
  3. 运行查看响应结果

代码实现课程新增接口

  1. 在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})
  2. script目录下ContractTest.py文件添加以下内容

    from api.login import LoginAPIfrom 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())
  3. 运行查看响应结果

代码实现合同上传及合同新增接口

  1. 在config.py文件中添加以下内容

    import os​# 设置项目环境域名BASE_URL = \"http://kdtx-test.itheima.net\"​# 获取项目根路径BASE_PATH = os.path.dirname(__file__)
  2. 在api目录下创建contract.py文件,添加以下内容

    import requestsimport 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})
  3. 在script目录下的TestContract.py文件中追加下面的内容:

    # 导包from api.login import LoginAPIfrom api.course import CourseAPIfrom api.contract import ContractAPIimport 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())
  4. 运行查看响应结果

    上传合同需要在data目录下存放对应的文件

代码实现单接口测试-登录接口-JSON实现

代码:

from api.login import LoginAPIimport pytestimport jsonimport 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 reporttestpaths=./scriptpython_files=ContractTest.pypython_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#运行下面命令生成resultsnewman 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 cliexit 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-resultsexit 0

添加构建后操作

注意这两个路径是有要求的,相对于工作目录。

results目录与上方命令中的目录是一致的,不然会出现报告没有数据的情况

Postman任务运行后,postman_Allure任务随之运行

查看Allure Report报告如下

此处图标为!指测试中有失败样例(与测试用例有关),至此,实现了Jenkins+Allure自动化测试报告的持续集成

全球旅游攻略