网站域名可以更改吗,申请域名后如何发布网站,微商建立网站,wordpress同步发布一。基本概念 接口概念#xff1a;系统与系统之间 数据交互的通道。 接⼝测试概念#xff1a;校验 预期结果 与 实际结果 是否⼀致。 特征#xff1a; 测试⻚⾯测试发现不了的问题。#xff08;因为#xff1a;接⼝测试 绕过前端界⾯。 #xff09; 符合质量控制前移理…一。基本概念 接口概念系统与系统之间 数据交互的通道。 接⼝测试概念校验 预期结果 与 实际结果 是否⼀致。 特征 测试⻚⾯测试发现不了的问题。因为接⼝测试 绕过前端界⾯。 符合质量控制前移理念。 低成本⾼收益。 实现⽅式 ⼯具实现 Postman 使⽤简单。功能较少。 Jmeter功能完善上⼿难度⼤。 代码实现 python requests pytest java HttpClient 二。HTTP协议 协议 就是规则。要求使⽤的 双⽅必须严格遵守。 HTTP 协议简介 HTTP概念 超⽂本传输协议。基于客户端和服务器的应⽤层协议。 特性 1.客户端、服务器模式 2.简单快速 3.灵活 4.⽆状态 5.⽆连接 URL 定义URLuniform Resource Locator) 统一资源定位符网络资源地址 HTTP使用URL来来建立连接和传送数据 URL组成协议://hostname[:port]/path/[?查询参数1查询参数2] 格式协议 :// 域名 : 端⼝号 / 资源路径查询参数 1 查询参数 2... 协议指定数据传输的规则 http 和 https 域名在⽹络环境中定位⼀台主机。 本质IP 地址 端⼝号在⽹络主机上定位⼀个进程应⽤程序。 可以省略端⼝号跟随协议。 http 80 https 443 资源路径指定要访问的 数据资源。 可以没有。如果没有默认 值为 “/” 查询参数给数据资源传递的参数 。可以有多个 ⽤ 隔分 每⼀组查询参数采⽤ kv 键值对格式 下面URL的各个组成部分 http://www.weather.com.cn/data/sk/101010100.html 协议http 域名www.weather.com.cn 端口80 资源路径/data/sk/101010100.html 查询参数无 三。HTTP请求 产⽣端 ⼀定产⽣于 客户端。 数据格式请求行请求头请求体 整体格式 请求⾏http 请求第⼀⾏ 请求头第⼆⾏开始到空⾏之前 空⾏代表请求头结束 请求体空⾏之后直到结束 示例 POST http://demo.zentao.net/user-login.html HTTP/1.1 Host: demo.zentao.net User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:68.0) Gecko/20100101 Firefox/68.0 Accept: text/html,application/xhtmlxml,application/xml;q0.9,*/*;q0.8 Accept-Language: zh-CN,zh;q0.8,zh-TW;q0.7,zh-HK;q0.5,en-US;q0.3,en;q0.2 Accept-Encoding: gzip, deflate Referer: http://demo.zentao.net/user-login.html Content-Type: application/x-www-form-urlencoded Content-Length: 54 Connection: keep-alive Upgrade-Insecure-Requests: 1 accountdemopasswordefc4a3b32e48054865e5a8321cfda3e4 请求⾏ 组成请求⽅法空格URL 空格协议版本 请求⽅法 get查询 —— 没有请求体 post添加登录、注册 put修改 delete删除 —— 没有请求体 URL 语法格式⻅上。 协议版本默认常⽤ HTTP/1.1 请求头 内部所有数据均采⽤ k:v 语法格式 . Content-Type请求体数据类型 text/html HTML格式 text/plain纯文本格式 image/jpegjpg图片格式 application/json JSON数据格式 application/x-www-form-urlencoded 表单默认的提交数据格式 multipart/form-data 在表单中进行文件上传时使用 请求体 get、 delete 请求没有请求体 post、 put 请求有请求体 请求体中的数据类型受 请求头中 Content-Type 的 值影响。 位置空白行之后的内容 作用传输数据实体 请求体常在POST、PUT方法中使用 常配合的请求头Content-Type和Content-Length 四。HTTP响应 产⽣端 ⼀定是在服务器接受到 http 请求后回发响应数据。 整体格式 响应⾏第⼀⾏ 响应头第⼆⾏开始到空⾏结束 空⾏表示响应头结束 响应体空⾏直到结束 响应行也叫状态行 位置响应数据中第一行 作用描述服务器处理结果 内容状态行由协议版本号、 状态码 、状态消息组成 状态码三位数字组成第一个数字定义响应类别 1xx指示信息 2xx成功 3xx重定向 4xx客户端错误 5xx服务器端错误 响应头 位置第二行开始到空白行之间 作用描述客户端要使用的一些附加信息 特点响应头由键值对组成每行一对 响应体 位置响应数据空白行之后 作用服务器返回的数据实体 特点有图片、json、xml、html等多种类型 四。接口规范 传统接口特性 请求⽅法统⼀使⽤ get 或 post 针对⼀个资源的操作URL 不唯⼀ 响应状态码统⼀使⽤ 200 表示 RESTful ⻛格接⼝ 特性请求⽅法与 http 协议对应。 get —— 查询 post —— 添加 put —— 修改 delete —— 删除 针对⼀个资源的操作 URL 唯⼀。 只看 URL ⽆法确定具体操作。 状态码使⽤较灵活 五。接口测试流程 1. 需求分析产品经理产出的需求⽂档 2. 接⼝⽂档解析由开发产出接⼝⽂档 3. 编写接⼝测试⽤例将⽤例⽤ Excel形式表现 4. 编写接⼝测试脚本 ⼯具postman⽣成脚本 代码python编写⽣成脚本 5. 执⾏脚本跟踪缺陷 6. ⽣成接⼝测试报告 7. 可选接⼝⾃动化持续集成 六。接口文档解析 接口文档 又称为API文档是由后端开发编写用来描述接口信息的文档。 为什么要写接口文档 协同团队人员工作协同配合 。约束项目更新修改同步维护 接口解析要关注的核心要素 1.请求报文请求方法/请求路径/请求数据 2.响应报文响应状态码/响应数据 接口文档的内容 基本信息 接口名称、接口描述 请求参数 1. 请求方法 2. 请求路径3.请求头 4.请求数据字段、说明、类型、备注、是否必填 返回参数 1. 响应状态码 2.响应数据字段、说明、类型、备注、是否必填 3.data结构类型 七。Requests库 resp requests.请求方法(urlURL地址, params{k:v}, headers{k:v}, data{k:v}, json{k:v}, cookiescookie数据(如令牌)) 请求方法 get请求 - get方法 post请求 - post方法 put请求 - put方法 delete请求 - delete方法 url要访问的地址 - string类型 params查询参数 - 字典 headers请求头 - 字典 data表单格式请求体数据 - 字典 - jsonjson格式请求体数据 - 字典 - cookies用来传递cookies resp代表响应结果。 获取指定响应数据 常用 获取 URL resp.url 获取 响应状态码resp.status_code 获取 Cookieresp.cookies 获取 响应头resp.headers 获取 响应体 文本格式resp.text json格式resp.json()。 如果看到 JSONDecodeError 错误提示说明 不能转换为 json 八。cookies和session 设置cookies 获取cookies:cookiesresponse.cookies requests.get(url,cookies{c1:v1} Cookie简介 cookie 是工程师针对 http协议 是无状态这一特征设计的一种技术。 cookie 将数据保存在浏览器端。默认存储空间大小为 4k可以修改。 cookie 中的数据用户和随意获取没有安全性可言。 cookie 中存放的数据类型受浏览器限制。 cookie 中大多存放于网络通信相关的不敏感数据信息。提高访问速度。如用户名、登录状态等。 Session简介
概念也叫 会话从客户端登录服务器开始直到客户端退出登录所产生的所有通信数据保存在 session中。 session 将数据存在服务器端 session 使用服务器存储空间没有大小限制。 session 支持的数据类型受服务器主机影响。几乎支持所有数据类型。 session 中的数据大都采用 加密、转码存储。安全性较高。
Session自动管理Cookie
因为cookie中的数据都是由 session 提供的。 实现步骤 创建 session 对象(实例)。 my_session requests.Session()【注意() 不能丢】 使用 session实例调用get方法发送 获取验证码请求不需要提取cookie。 my_session.get() 使用同一个 session实例调用post方法发送登录请求不需要携带cookie。my_session.post() 使用同一个 session实例调用get方法发送查看我的订单页面请求不需要携带cookie。my_session.get() # 导包 import requests # 1. 创建session实例my_session requests.Session() # 2. 使用session实例调用 get方法发送 获取验证码请求 resp1 my_session.get(urlhttp://tpshop-test.itheima.net/index.php?mHomecUseraverify) # print(resp1.text) # 3. 使用同一个session实例调用 post方法发送 登录请求。正确 用户名、密码 resp2 my_session.post(urlhttp://tpshop-test.itheima.net/index.php?mHomecUserado_login, data{username: 13812345678, password: 123456, verify_code: 8888}) print(登录结果, resp2.json()) # 4. 使用同一个session实例调用 get方法查询我的定义页面。 resp3 my_session.get(urlhttp://tpshop-test.itheima.net/Home/Order/order_list.html) # 5. 打印响应结果 print(我的订单页面, resp3.text) 面试题 Cookie 和 Session 区别 数据存储位置 Cookie 存储在 浏览器端 Session 存储在 服务器端 安全性 Cookie 直接存储在浏览器可以任意获取没有安全性可言。 Session 存储在 服务器端采用 加密、转码形式存储数据安全性较高。 数据类型 Cookie 直接存储在浏览器支持测试数据类型受浏览器限制 Session 存储在 服务器端服务器就是一台主机。因此几乎支持所有的数据类型。 大小 Cookie 默认大小 4k可调 Session 直接使用服务器存储。没有大小限制。
九。PyMySQL操作数据库 操作步骤 导包 import pymysql 创建 连接 conn pymyql.connect() 创建 游标 cursor conn.cursor() 执行 SQL 语句 cursor.execute( “sql 语句” ) 查询语句 select —— 不修改数据库会返回结果集 从结果集中提取 想要的数据 cursor.fetch*() 增删改语句 insert、update、delete —— 没有 结果返回会修改数据库 执行成功提交事务。conn.commit() 执行失败回滚事务。conn.rollback() 关闭游标 cursor.close() 关闭连接 conn.close() 十。日志收集 日志 日志就是用于记录系统运行时的信息对一个事件的记录也称为 Log 有哪些信息需要记录 • 脚本运行过程中某个重要变量的值 • 方法的输入参数和返回结果 • 异常信息 日志作用 1.调试程序 2.了解系统程序运行的情况是否正常 3.系统程序运行故障分析与问题定位 4.用来做用户行为分析和数据统计 日志级别 日志级别是指日志信息的优先级、重要性或者严重程度 当为程序指定一个日志级别后程序会记录所有日志级别 大于或等于 指定日志级别的日志信息而不是仅仅记录指定级别的日志信息 一般建议只使用DEBUG、INFO、WARNING、ERROR这四个级别 日志收集的位置 控制台 方便自动化测试脚本的调试 日志文件可以把日志长久的保存起来 需要达成的效果 1. 可以把日志输出到不同位置 控制台 日志文件防止日志文件过大每日生成一个日志文件 2. 记录更加详细的日志信息 打印日志的时间 日志的级别 打印日志的位置 日志内容 3. 可以打印不同级别的日志如 INFO ERROR 十一。代码分层 分层思想 按代码功能划分为 接口对象层、测试脚本层 接口对象层 负责 发送 http请求访问待测接口。返回响应数据。 测试用例层测试脚本层 调用 接口按响应数据断言完成测试。 封装思想 将 普通方式实现代码中固定不变的直接写到方法的实现内部。 将动态变化的从参数传入。 将响应结果通过返回值 return
十二。Unittest框架
unittest是Python标准库中的一个单元测试框架用于编写和执行单元测试。它提供了一组用于编写测试用例、运行测试以及生成测试报告的类和方法。
下面是unittest框架的一些重要概念和使用方法 测试用例Test Case测试用例是单元测试的最小单位它是一个独立的测试单元用于验证代码的某个具体功能或行为。通常继承自unittest.TestCase类并包含一个或多个测试方法。 测试方法Test Method测试方法是测试用例中的一个函数以test_开头用于执行具体的测试逻辑。可以在测试方法中使用断言assert来验证预期结果和实际结果是否一致。 测试套件Test Suite测试套件是由多个测试用例组成的集合用于按照一定顺序运行多个测试。 测试运行器Test Runner测试运行器是用于执行测试的工具可以运行单个测试用例、单个测试模块或整个测试套件并生成测试报告。 断言方法Assertion Methods断言方法是用于验证测试结果的方法可以判断实际结果与预期结果是否相等、是否为真等。例如assertEqual()用于判断两个值是否相等。 十三。参数化 参数化步骤 将 测试数据按 [{},{},{}] 格式 组织到 json文件中。 读取 json文件将数据转换为 [(),(),()] 在通用测试方法上一行添加 pytest.mark.parameterize() 给 parameterize() 传参。参1字符串类型内容为 json文件中一组数据的 key。参2[(),(),()]格式数据。 给 通用测试方法添加形参与 parameterize() 参1 字符串的内容一致。 修改 通用测试方法 内部实现使用形参。 # 将测试数据 组织到 json文件中
[{x: 10, y: 20, expect: 30},{x: 100, y: 200, expect: 300},{x: 1000, y: 2000, expect: 3000}
]
--------------------------------------------------------------
import pytest
import json# 待测 函数
def add(x, y):return x y# 封装函数读取json文件将 [{},{},{}] 数据 转换为 [(),(),()] 格式的数据
def read_json_data(filename):with open(filename, r, encodingutf8) as f:json_data json.load(f)data_list []for data in json_data:val data.values()tmp tuple(val)data_list.append(tmp)# 必须返回不能在 for 内return data_list # 返回 [(10, 20, 30), (100, 200, 300), (1000, 2000, 3000)]# 结合 pytest 定义测试类
class TestAddFunc(object):pytest.mark.parametrize(x, y, expect, read_json_data(add_data.json)) # 参2 要求必须是 [(),(),()] 格式的数据def test_add(self, x, y, expect): # 通用测试方法res add(x, y) # 调用 待测函数得实际结果assert expect res # 断言
十四。接口自动化测试框架 目录结构 api/接口对象层代码python package scripts/测试脚本层代码python package common/通用工具方法、函数代码python package data/测试数据文件文件dir report/测试报告文件dir config.py: 项目中的 配置信息。全局变量 pytest.ini: pytest 配置 1.在data/下组织数据文件
2. 在 common/ 下创建 文件 read_json_file.py 在 文件内创建 函数读取json文件中的数据转换成 [(),(),()] 格式数据 测试此函数功能通过 建议读取 json文件时使用 绝对路径法传入文件名 在 config.py 中添加 全局变量获取 项目目录 BASE_DIR os.path.dirname(__file__) 拼接 json文件的绝对路径 filename BASE_DIR/data/login_data.json 使用 绝对路径传入 json文件读取函数。 read_json_data(filename)
import json# 定义工具函数读取json文件中的数据转换成 [(),(),()] 格式数据
def read_json_data(filename):with open(filename, r, encodingutf8) as f:json_data json.load(f)login_list []for data in json_data:tmp tuple(data.values())login_list.append(tmp)return login_listif __name__ __main__:res read_json_data(../data/login_data.json)print(res)
3.在common下写断言工具和数据库操作类
4.在api下写登录工具和员工管理工具
5.解决重复手机号问题 在 测试 添加员工接口前setup保证 数据库中无此手机号执行 delete SQL语句将欲使用的手机号删除。 使用 这个手机号展开 添加员工接口的 测试。 在 测试 添加员工接口结束后teardown删除 添加员工接口测试时使用的手机号。 def setup(self):del_sql fdelete from bs_user where mobile{TEL};DBTools.db_uid(del_sql)def teardown(self):del_sql fdelete from bs_user where mobile{TEL};DBTools.db_uid(del_sql)
6.获取请求头 在 common/ 下创建文件 get_header.py 文件中添加 代码获取请求头并测试无误
from api.ihrm_login_api import IhrmLoginApidef get_header():req_data {mobile: 13800000002, password: 123456}resp IhrmLoginApi.login(req_data)header {Authorization: resp.json().get(data)}return headerif __name__ __main__:ret get_header()print(ret)
7.生成测试报告储存在report目录下 十五。全量字段校验
十六。Dubbo