# 接口对象封装

接口对象封装

学习目标

  1. 理解接口对象封装的目的
  2. 能够实现接口对象的封装

核心思想

  • 引入Unittest后代码存在的问题?
    • 代码冗余
    • 代码耦合度高
    • 代码维护成本高

image-20231211152224494

案例一

  • 练习 : ihrm系统登录接口对象封装

  • 需求:

    • 封装登录接口API对象
    • 测试脚本中调用登录接口API对象
    • 使用UnitTest框架管理测试脚本

思考

  1. 为什么要封装接口对象?
  2. 封装接口对象的实现?

接口自动化测试框架

学习目标

  1. 能够实现接口自动化测试框架
  2. 完成IHRM系统接口测试

接口测试框架思想

image-20231211152627520

接口自动化框架设计思路

image-20231211152700373

接口自动化框架开发

搭建基础框架

  • 定义项目目录结构 :

image-20231211152812888

  • 安装依赖包 :

    • 安装requests包

    • 安装parameterized包

    • 安装PyMySQL包

    • 安装htmlTestReport包

封装数据库操作工具类

  • 提示:为减少代码冗余,提高测试效率,将数据库相关操作封装成工具类

  • 数据库工具类要求 :

    • 实现的功能:
      • 获取数据库连接对象方法
        • get_conn()
      • 关闭数据库连接对象
        • close_conn()
      • 查询一条记录
        • get_one()
      • 更新数据库
        • uid_db()

用例基础代码

image-20231211153123857

  • 测试脚本层:

    • 使用UnitTest管理测试脚本
      • 登录模块:test_login.py
      • 员工模块:test_employee.py
    • 实现要求:
      • 1、完成测试脚本的业务实现
      • 2、通过fixture进行测试数据构造和清理
  • 接口对象层 :

    • 按功能模块封装接口对象
      • 登录模块:login.py
      • 员工模块:employee.py
    • 实现要求:
      • 1、API对象封装,使用通用参数
      • 2、抽离管理域名等共性信息

测试数据参数化

image-20231211153328882

生成测试报告

image-20231211153403891

总结

  1. 请描述接口测试框架的架构
  2. 接口测试框架的设计核心步骤
  3. 请描述如何实现接口自动化测试框架的封装?

全量字段校验

学习目标

  • 掌握如何对接口响应数据进行全量字段校验

全量字段校验

学习目标

  • 理解全量字段校验的目标

接口校验思考

  • 问题一:接口响应校验哪些字段?
    • 答:客户端或其他服务使用的字段
  • 问题二:需要校验字段的哪些内容?
    • 答:字段名/字段值或字段类型

image-20231211154943723

image-20231211155006380

JSON Schema介绍

学习目标

  1. 掌握JSON Schema关键字
  2. 根据JSON数据的要求定义JSON Schema

JSON Schema介绍

  • Json Schema: 用来定义json数据约束的一个标准

入门案例

  • 待校验的数据 :
1
2
3
4
5
{
"success": true,
"code": 10000,
"message": "操作成功"
}
  • 校验规则描述 :

    • 整个JSON数据是一个对象

    • 包含success、code、message字段,并且是必须存在的字段

    • success字段为布尔类型

    • code为整数

    • message为字符串

  • JSON Schema :

    • 注意:待校验JSON对象的所有字段分别都通过对应的JSONSchema的校验检测,这个对象才算是通过校验!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
{
"type": "object",
"properties": {
"success": {
"type": "boolean"
},
"code": {
"type": "integer"
},
"message": {
"type": "string"
}
},
"required": ["success", "code", "message"]
}

json schema在线校验工具

JSON Schema重点关键字

image-20231211155553874

关键字详解-type

  • type:用于限定待校验JSON元素所属的数据类型

image-20231211155641794

案例

  • JSON Schema关键字-type

  • 需求:

    • 已知JSON数据

    • 要求定义每个一级字段的数据类型

1
2
3
4
5
6
7
8
9
10
11
{
"success": true,
"code": 10000,
"message": "操作成功",
"money": 6.66,
"address": null,
"data": {
"name": "tom"
},
"luckyNumber": [6, 8, 9]
}
  • 定义JSON Schema :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
{
"type": "object",
"properties": {
"success": {
"type": "boolean"
},
"code": {
"type": "integer"
},
"message": {
"type": "string"
},
"money": {
"type": "number"
},
"address": {
"type": "null"
},
"data": {
"type": "object"
},
"luckyNumber": {
"type": "array"
}
}
}

关键字详解-properties

  • properties:定义待校验的JSON对象中包含的字段
    • 说明:
      • 该关键字的值是一个对象
      • 当type取值为object时使用
      • 用于指定JSON对象中的各种不同key应该满足的校验逻辑

案例

  • 需求:
    • 已知JSON数据
    • 要求定义JSON对象中包含的所有字段及数据类型
1
2
3
4
5
6
7
8
9
{
"success": true,
"code": 10000,
"message": "操作成功",
"data": {
"name": "tom",
"age": 18
}
}
  • JSON Schema :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
{
"type": "object",
"properties": {
"success": {"type": "boolean"},
"code": {"type": "integer"},
"message": {"type": "string"},
"data": {
"type": "object",
"properies": {
"name": {"type": "string"},
"age": {"type": "integer"}
}
}
}
}

关键字详解-required

  • required:定义待校验的JSON对象中,必须存在的key

  • 说明:

    • 用于限制JSON对象中必须包含哪些key
    • 该关键字的值是一个数组,而数组中的元素必须是字符串,而且必须是唯一的

案例

  • 需求:
    • 已知JSON数据
    • 要求JSON对象中必须包含success、code、message字段
1
2
3
4
5
6
{
"success": true,
"code": 10000,
"message": "操作成功",
"data": null
}
  • JSON Schema :
1
2
3
4
{
"type": "object",
"required": ["success", "code", "message"]
}

关键字详解-const

  • const:用于校验JSON元素必须等于指定的内容
  • 说明:
    • 如果待校验的JSON元素的值和该关键字指定的值相同,则通过校验。否则,无法通过校验
    • 该关键字的值可以是任何值,包括null

案例

  • 需求:
    • 已知JSON数据

    • 校验code字段的值必须等于10000

1
2
3
{
"code": 10000
}
  • JSON Schema :
1
2
3
4
5
6
7
8
{
"type": "object",
"properties": {
"code": {
"const": 10000
}
}
}

关键字详解-pattern

  • pattern:正则表达式
  • 说明:
    • 正则表达式:字符串的匹配模式
    • 包含指定字符串:pattern = “指定字符串”

案例

  • 需求:
    • 已知JSON数据

    • 校验message字段的值必须包含‘操作成功’

    • 校验手机号必须是11为数字

1
2
3
4
{
"message": "操作成功!",
"mobile": "13800000002"
}
  • JSON Schema :
1
2
3
4
5
6
7
8
9
10
11
{
"type": "object",
"properties": {
"message": {
"pattern": "操作成功"
},
"mobile": {
"pattern": "^[0-9]{11}$"
}
}
}

综合案例

  • 校验规则描述 :
    • 需求:
      • 整个JSON数据是一个对象
      • 包含success、code、message、data字段,并且是必须存在的字段
      • success字段为布尔类型
      • code为整数
      • message为以“登录成功”结尾的字符串
      • data为对象,必须包含name、age字段
      • data中的name字段必须等于lily
      • data中的age必须是20
1
2
3
4
5
6
7
8
9
{
"success": false,
"code": 10000,
"message": "xxx登录成功",
"data": {
"age": 20,
"name": "lily"
}
}
  • JSON Schema :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
{
"type": "object",
"properties": {
"success": {"type": "boolean"},
"code": {"type": "integer"},
"message": {
"pattern": "登录成功$"
},
"data": {
"type": "object",
"properties": {
"name": {"const": "lily"},
"age": {"const": 20}
}
}
}
}

思考

  1. JSON Schema重点关键字有哪些?
  2. 如何根据JSON数据的规范要求定义JSON Schema?

python实现JSON数据校验

学习目标

  • 掌握如何使用jsonschema校验JSON数据

jsonschema介绍和安装

  • jsonschema:是Python语言中实现对JSON Schema校验的模块
    • pip install jsonschema

jsonschema使用方式

  • jsonschema.validate(instance, schema)
    • instance:要验证的JSON数据
    • schema:用于校验JSON数据的验证规则
  • 说明:
    • 该函数首先验证所提供的schema本身是否有效,然后再验证json数据
    • 如果schema模式本身是无效的,则抛出 jsonschema.exceptions.SchemaError 异常
    • 如果JSON数据校验不通过,则抛出 jsonschema.exceptions.ValidationError 异常

jsonschema使用案例

  • 需求:测试ihrm登录接口-登录成功
  • 要求:全量校验接口返回结果(data字段为字符串,其他字段进行值匹配)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import jsonschema, requests, unittest

class TestJsonSchema(unittest.TestCase):
def test01(self):
url = "http://ihrm-test.itheima.net/api/sys/login"
r = requests.post(url, json={"mobile": "13800000002", "password": "123456"})
json_data = r.json()

# 编写schema:
my_schema = {
"type": "object",
"properties": {
"success": { "const": True },
"code": { "const": 10000 },
"message": { "const": "操作成功!" },
"data": { "type": "string" }
},
"required": [ "success", "code", "message", "data" ]
}

# 验证:
jsonschema.validate(instance=json_data, schema=my_schema)

总结

  • 掌握如何对接口响应数据进行全量字段校验

持续集成

学习目标

  1. 掌握使用Git管理代码
  2. 掌握Jenkins安装配置
  3. 能够使用Jenkins集成自动化代码

持续集成

学习目标

  1. 了解互联网软件发布流程
  2. 清楚自动化测试在CI中要解决的问题

软甲发布流程

image-20231211181526329

持续集成目的

  • 快速迭代 保持高质量
  • 持续集成(Continuous integration)
    • 开发人员提交新代码后,立刻构建,部署到「测试环境」,执行测试并反馈
  • 持续交付(Continuous delivery)
    • 在持续集成的基础上,将集成后的代码部署到「类生产环境」
  • 持续部署(continuous deployment)
    • 在持续交付的基础上,自动部署到生产环境

如何契合CI流程

  • 目的:通过持续测试验证代码质量是否符合交付标准
  • 需解决的问题:
    • 自动化测试case执行不靠人工
      • 1)代码更新自动触发case执行
      • 2)每日定时自动触发case执行
    • 第一时间发布自动化测试结果

image-20231211181752912

思考

  1. 持续集成的流程和目的?
  2. 自动化测试在持续集成中要解决什么问题?

Git与Git代码托管平台

学习目标

  • 掌握Git管理代码的常见操作

Git介绍

  • 思考
    • 场景1:
      • 小A实现的自动化代码,需求变更后删除了该代码。之后又要加入该需求,怎么办?
    • 场景2:
      • 自动化项目有多名测试人员协同开发脚本,怎么保证项目代码统一?
        • Git 分布式版本控制系统,实现版本控制 + 多人协同

Git代码托管平台

  • 常见的代码托管平台:
    • Github
      • 国外的基于git实现在线代码托管的仓库(企业版收费)
      • 官网:https://github.com/
    • Gitee
    • Gitlab
      • 类似Github,一般用于企业内部搭建git私服

Git安装

  • Git:支持 Linux/Unix、Solaris、Mac和 Windows 平台
  • 安装Git:
  • 配置Git:
    • 安装完成后,需要在命令行配置用户名和邮箱
1
2
git config --global user.email "email@example.com"
git config --global user.name "Your Name"

Git常见操作

  1. 克隆 Git 资源作为本地资源
  2. 如果其他人修改了 Git 资源,需要更新本地资源
  3. 提交本地文件前对比Git资源上的文件,解决冲突
  4. 提交本地修改到Git仓库

Gitee使用

  • 码云Gitee是开源中国开发的一款基于Git的代码托管平台,能够实现代码托管、项目管理、协作开发等

  • 目前是国内最大的代码系统,目前已有超过 500 万的开发者选择码云

  • Gitee和GitHub的作用和性质是类似的,Gitee优势是速度快

  • 操作演示:

    • 在Gitee中创建项目

    • 在PyCharm中检出Gitee中的项目

    • 在PyCharm中编辑项目文件,对比文件,解决冲突

思考

  1. Git常见操作:克隆Gitee仓库
  2. 下载远程代码并合并
  3. 上传远程代码并合并
  4. 解决代码冲突

Jenkins

学习目标

  • 掌握Jenkin环境搭建及常见配置

Jenkins介绍

  • 基于Java开发的一种开源、跨平台的持续集成工具
  • 作用:
    • 持续自动构建/测试软件项目
    • 监控定时执行的任务

Jenkins环境搭建

  • 安装步骤:
    • 安装JDK

    • 安装Jenkins

显示测试报告

  • 安装HTML Publisher插件 :

  • 安装步骤:

    • 进入首页,选择’Jenkins’后面的小图标->’系统管理’->’管理插件’
    • 输入搜索关键字,选择要安装的插件,点击‘Install without restart’安装
    • 查看安装进度
  • 解决HTML报告样式无法显示问题 :

    • 为了测试报告样式的美观以及易读,测试报告中会搭配CSS和JS实现自定义的样式或动画效果。

    • 问题:

      • Jenkins中在访问有自定义样式或动画效果的测试报告时,会出现样式无法正常显示的问题。
    • 产生问题的原因 :

      • Jenkins为了避免受到恶意HTML/JS文件的攻击,会默认将安全策略CSP设置为 :
        • sandbox; default-src 'none'; img-src 'self'; style-src 'self';
      • 在此配置下,只允许加载:
        • Jenkins服务器上托管的CSS文件
        • Jenkins服务器上托管的图片文件
        • 其他形式的内容都会被禁止:JavaScript、plugins (object/embed)、HTML中的内联样式表和引用的外站CSS文件、HTML中的内联图片和外站引用的图片文件等等
    • 解决方案 :

      • 通过修改启动命令来实现:
        • D:\jenkins>java -Dhudson.model.DirectoryBrowserSupport.CSP= -jar jenkins.war

image-20231211182846277

邮件配置

  • 公司中发送测试报告邮件时,需要设置一些规范。
  • 例如配置收件人列表(项目经理,测试相关人员,开发相关人员,产品经理等)、项目基本信息等。
  • Jenkins提供了邮箱报告模板,可以通过配置模块,指定一些邮件固定的信息。

邮件测试报告模板

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>${ENV, var="JOB_NAME"}-第${BUILD_NUMBER}次构建日志</title>
</head>
<body leftmargin="8" marginwidth="0" topmargin="8" marginheight="4" offset="0">
<div>
<h2>项目信息</h2>
<ul>
<li>项目名称:${PROJECT_NAME}</li>
<li>详细测试报告:<a href="${PROJECT_URL}HTML_20Report/">${PROJECT_URL}HTML_20Report/</a></li>
<li>触发原因:${CAUSE}</li>
<li>项目Url:<a href="${PROJECT_URL}">${PROJECT_URL}</a></li>
</ul>
<hr/>
<h2>构建日志</h2>
<div>${JELLY_SCRIPT,template="html"}</div>
<hr/>
</div>
</body>
</html>

系统邮箱配置

  • Jenkins完成系统邮箱配置后,才能够发送邮件
  • 配置内容:
    • 配置’系统管理员邮件地址’
    • 配置’Extended E-mail Notification’
    • 配置’邮件通知’

思考

  1. Jenkins的作用是什么?
  2. 测试报告配置和邮件模版配置注意项

自动化测试持续集成实现

学习目标

  • 掌握Jenkin环境搭建及常见配置

实现效果

  • 自动化测试case执行不靠人工
    • 1)代码更新自动触发case执行
    • 2)每日定时自动触发case执行
  • 第一时间发布自动化测试结果
    • 核心:Jenkins job 的源码配置

源码管理

  • 作用:能够让Jenkins自动从代码服务器上拉取自动化测试脚本代码

image-20231211183342228

  • 配置参数说明:
    • Repository URL:项目仓库地址
    • Credentials:登录凭证,需添加代码托管平台的登录用户名和密码

构建触发器

  • 作用:定义一些触发规则,当满足某一个规则时,让Jenkins开始执行自动化测试脚本
  • 常用触发器:
    • Build periodically:定时构建
    • Poll SCM:轮询构建,定时轮询检查代码是否发生变更,如果发生变更就拉取最新代码并执行构建动作

image-20231211183432772

日程表介绍

  • Jenkins采用了著名的UNIX任务调度工具CRON所使用的配置方式,一般称之为“cron表达式”

  • 基本语法格式:* * * * * => 分 时 日 月 星期

    • 用5个字段代表5个不同的时间单位,中间用空格分隔
    • 每一个位置都可以使用数字表示,还可以使用一些特殊字符
    • *:表示匹配该域的任意值,假如在表示分的位置*, 即表示每分钟都会触发事件
  • 示例:

    • 0 8 * * * : 每天上午8点构建一次
    • */1 * * * * : 每分钟执行一次
    • * */1 * * * : 每小时执行一次

构建

  • 作用:触发自动化测试脚本开始执行的命令
  • 常用构建组件:
    • Execute Windows batch command:运行Windows环境下的命令
    • Execute shell:运行Linux和Mac环境下的命令

image-20231211183756728

构建后操作

  • 作用:自动化测试脚本运行完之后要做的操作
  • 常见构建后操作:
    • 发布测试报告
    • 发送邮件通知

image-20231211183827948

思考

  • 请描述如何通过Jenkins集成自动化测试脚本?

总结

  1. 如何使用Git管理代码?
  2. 如何安装配置Jenkins?
  3. 如何通过Jenkins集成自动化测试脚本?