接口测试自动化+pytest 初学易懂版

自己整理了一些笔记,可以对接口测试做一个了解。上手直接看七

接口测试笔记

一、HTTP相关概念

  1. HTTP版本:HTTP有多个版本,当前最广泛使用的是 HTTP/1.1 版本。在1.1 以前的版本,服务端返回响应给客户端后,连接就会断开,下一次双方要进行信息交流,必须重新建立连接(客户端发送请求,服务返回响应)。而到了 1.1 版本,建立连接后,连接可以保持一段时间(keep alive),在这段时间内,双方可多次进行请求和响应,无需重新建立连接。
  2. HTTP请求消息
    • 请求行(request line):是HTTP请求的第一行内容,用于表示要操作的资源以及使用的HTTP协议版本。它包含3部分信息:请求的方法、操作资源的地址、协议的版本号。例如:GET /mgr/login.html HTTP/1.1
      • GET:从服务器获取资源信息,这是一种最常见的请求,如获取网页资源、图片资源、用户信息数据等。
      • POST:用于将资源信息添加到服务器进行处理,例如提交表单或者上传文件,如添加用户信息、上传图片数据到服务器等。Get请求通常是静态的,可能会使用缓存信息,而POST请求是动态的,会更新服务端的信息。
    • 请求头(request headers):存放一些信息,例如请求发送的服务端域名(Host,用于连接服务器,服务器可能有多个应用或者网站)、希望接收的响应消息使用的语言、请求消息体的长度等。
    • 消息体(message body):WEB API请求消息体通常是某种格式的文本,常见的有:
      • Json
      • Xml
      • www-form-urlencoded

二、接口测试流程

  1. 测试前准备
    • 了解需求:明确要测试的接口的功能,例如登录接口,需知道它所需的信息(如用户名、密码)以及返回结果(登录成功或失败的提示)。
    • 熟悉接口文档:接口文档会说明接口的地址、请求方法(如 GET、POST 等)、参数(参数名称、类型、是否必填)以及返回值的格式和含义等,这些是测试的重要依据。
    • 准备测试环境:搭建好测试用的服务器、数据库等环境,确保其能正常运行,并且与接口所依赖的其他系统或服务能正确连接和交互。
    • 选择测试工具:根据接口的类型和特点,选择合适的测试工具,如 Postman、Jmeter 等,这些工具可方便地发送请求和查看响应。
  2. 测试用例设计
    • 确定测试场景:根据接口的功能,设想各种可能的情况。以登录接口为例,需考虑用户名和密码正确、用户名错误、密码错误、都为空等不同情况。
    • 设计用例:针对每个测试场景,详细编写测试步骤,包括发送的请求、请求参数的设置以及预期的响应结果。例如,测试登录接口的用例可以是输入正确的用户名和密码,预期返回登录成功的信息。
    • 用例评审:将编写好的测试用例与开发人员、产品经理等相关人员共同评审,检查是否存在遗漏或不合理之处,并进行讨论修改。
  3. 执行测试
    • 发送请求:使用选定的测试工具,按照测试用例的要求向接口发送请求。例如在 Postman 中设置好接口地址、请求方法和参数后点击发送。
    • 检查响应:检查接口返回的结果是否与预期一致,包括响应的状态码(如 200 表示成功,400 表示请求错误等)、响应的数据格式(如 JSON 格式,字段是否正确)和数据内容(如返回的用户信息是否正确)。
    • 记录结果:记录每次测试的情况,包括测试用例的编号、执行时间、请求内容、响应结果以及测试是否通过,若未通过,还需记录错误信息。
  4. 缺陷管理
    • 发现缺陷:在执行测试过程中,若发现实际结果与预期结果不符,则表明存在缺陷。例如登录接口返回错误提示或数据格式错误。
    • 提交缺陷:将发现的缺陷详细记录到缺陷管理工具中,包括缺陷描述、发现环境、重现步骤、严重程度(如严重影响功能使用或只是小瑕疵)和优先级(确定修复顺序)。
    • 跟踪缺陷:开发人员根据提交的缺陷进行修复,测试人员需跟踪缺陷状态,检查是否已修复,并进行再次测试,此过程可能反复,直至缺陷全部解决。
  5. 测试总结
    • 整理测试报告:将整个测试过程整理成报告,内容包括测试的接口、用例执行情况(通过和失败的数量)、发现的缺陷数量以及缺陷的分布情况(哪些功能模块缺陷较多)等。
    • 总结经验教训:回顾测试过程中遇到的问题,如测试用例设计不合理或测试环境不稳定等,总结改进方法,以便下次测试更顺利。将测试报告和经验总结分享给相关人员,使其了解测试结果和情况。

三、抓包工具 Fiddler

  1. Fiddler原理:Fiddler 是代理式抓包工具,会启动一个代理服务器(同时设置自己作为系统代理),监听在 8888 端口上。
  2. 使用设置:安装好 Fiddler 后,通常需要设置抓包过滤项,否则抓到的包过多,不利于分析。可以根据目标主机地址过滤 HTTP 消息,在界面左边的红色箭头处,选择 show only the following hosts,例如:localhost; 127.0.0.1;*.sohu.com。修改完设置后,需点击特定位置(根据实际界面确定)才能保存生效。
  3. 查看请求和响应:Fiddler 界面右边上半区显示请求消息的内容,下半区显示响应消息的内容。点击上半区和下半区的 raw 标签,可以查看整个 HTTP 请求和响应的具体内容。
  4. 手机抓包
    • 确保手机使用的 WIFI 和运行 Fiddler 的电脑使用同一个子网,即连接同一个 WIFI 信号。
    • 设置 Fiddler,允许远程机器连接自己。点击菜单 option,点击 connections 标签,勾选 Allow remote computer to connect
    • 在手机 WIFI 中设置代理:电脑的 IP(可在 cmd 里用 ip config 查看)和端口(一般为 8888)。
    • 最后在手机上访问网址,即可在 Fiddler 里看到相关请求和响应。

四、构建HTTP请求

  1. 构建请求URL参数:例如 https://www.baidu.com/s?wd=iphone&rsv_spt=1,问号后面的部分 wd=iphone&rsv_spt=1 就是 url 参数,每个参数之间用 & 隔开。上述例子中有两个参数 wdrsv_spt,其值分别为 iphone1 。使用 Requests 发送 HTTP 请求时,url 里面的参数通常可直接写在 url 中,如 response = requests.get('https://www.baidu.com/s?wd=iphone&rsv_spt=1')。但当 url 参数中有特殊字符(如参数值包含 & 符号)时,可将参数放到一个字典中,然后将字典对象传递给 Requests 请求方法的 params 参数,示例如下:
urlpara = {    
    'wd':'iphone&ipad',    
    'rsv_spt':'1'
}
response = requests.get('https://www.baidu.com/s',params=urlpara)
  1. 构建请求消息头:指定参数 headers 的值为一个字典即可,示例如下:
headers = {    
    'user-agent':'my-app/0.0.1',     
    'auth-type': 'jwt-token'
}
r = requests.post("http://httpbin.org/post", headers=headers)
print(r.text)
  1. 构建请求消息体:常见的 UrlencodedXMLjson 格式,具体用法在实际使用时查阅相关资料。

五、session机制

通常情况下,session 机制依赖于 cookie 来工作。当客户端第一次与服务器建立连接时,服务器会为该客户端创建一个唯一的 session ID,并将这个 session ID 以 cookie 的形式发送给客户端。客户端收到后,会把这个 session ID 存储在本地的 cookie 中。在后续的请求中,客户端会自动在请求头里带上这个包含 session ID 的 cookie,服务器接收到请求后,通过解析请求头中的 session ID,就能在服务器端找到对应的 session 数据,从而识别出是哪个客户端在发起请求。

六、接口框架pytest

  1. 安装必要的库:使用 pip install pytest requests 安装 pytestrequests 库。
  2. 编写测试用例:创建一个 Python 文件,文件名通常以 test_ 开头。示例如下:
import requests

# 定义一个测试函数,函数名以 test_ 开头
def test_get_api():
    # 发送一个 GET 请求到指定的 API 地址
    response = requests.get('https://jsonplaceholder.typicode.com/todos/1')
    # 断言响应状态码是否为 200,表示请求成功
    assert response.status_code == 200
    # 断言响应的 JSON 数据中的 'userId' 字段是否为 1
    assert response.json().get('userId') == 1
  1. 执行测试:在终端中,进入包含测试文件的目录,然后运行 pytest test_api.py 命令。
  2. 更复杂的测试场景
    • 参数化测试:当需要对同一个接口使用不同的参数进行测试时,可以使用 pytestparametrize 装饰器。示例如下:
import requests 
import pytest 

@pytest.mark.parametrize("todo_id, expected_user_id", [(1, 1), (2, 1)]) 
def test_get_api_parametrized(todo_id, expected_user_id): 
    response = requests.get(f'https://jsonplaceholder.typicode.com/todos/{todo_id}') 
    assert response.status_code == 200 
    assert response.json().get('userId') == expected_user_id
- **使用 fixture 管理测试环境**:`fixture` 可以用来设置和清理测试环境,例如创建一个会话对象。示例如下:
import requests 
import pytest 

@pytest.fixture 
def session(): 
    s = requests.Session() 
    # 可以在这里进行一些初始化操作,如登录 
    yield s 
    # 可以在这里进行清理操作 
    s.close() 

def test_api_with_session(session): 
    response = session.get('https://jsonplaceholder.typicode.com/todos/1') 
    assert response.status_code == 200
  1. 生成测试报告:使用 pip install pytest-html 安装 pytest-html 插件,然后运行 pytest test_api.py --html=report.html 命令生成测试报告。

七、一个示例

用户注册接口测试示例

接口文档描述

  1. 接口地址http://example.com/api/register
  2. 请求方法POST
  3. 请求头
    • Content-Type:必须为 application/json,用于告知服务器请求体的数据格式是 JSON。
    • Authorization:在测试阶段可以为空,实际生产中可能需要携带用户的认证令牌(这里先不考虑复杂的认证逻辑)。
  4. 请求体(JSON 格式)
    • username:字符串类型,必填,用户注册的用户名。
    • password:字符串类型,必填,用户注册的密码。
    • email:字符串类型,必填,用户注册的邮箱地址。
  5. 返回值
    • 状态码 201:表示用户注册成功,响应体为 JSON 格式,包含 message 字段,内容为 Registration successful
    • 状态码 400:表示请求参数错误,响应体为 JSON 格式,包含 error 字段,描述具体的错误原因。

测试用例设计

  1. 测试用例 1:正常注册
    • 测试场景:输入正确的用户名、密码和邮箱地址,测试接口是否能正常注册用户。
    • 测试步骤
      1. 构造包含正确 Content-Type 的请求头。
      2. 构造包含正确用户名、密码和邮箱地址的 JSON 格式请求体。
      3. 使用 POST 方法发送请求到接口地址。
      4. 检查响应状态码是否为 201
      5. 检查响应体中的 message 字段是否为 Registration successful
  2. 测试用例 2:缺少用户名
    • 测试场景:不输入用户名,测试接口是否能正确返回参数错误的提示。
    • 测试步骤
      1. 构造包含正确 Content-Type 的请求头。
      2. 构造包含密码和邮箱地址但缺少用户名的 JSON 格式请求体。
      3. 使用 POST 方法发送请求到接口地址。
      4. 检查响应状态码是否为 400
      5. 检查响应体中的 error 字段是否包含关于用户名缺失的错误描述。
  3. 测试用例 3:错误的 Content-Type
    • 测试场景:设置错误的 Content-Type,测试接口是否能正确处理。
    • 测试步骤
      1. 构造包含错误 Content-Type(如 text/plain)的请求头。
      2. 构造包含正确用户名、密码和邮箱地址的 JSON 格式请求体。
      3. 使用 POST 方法发送请求到接口地址。
      4. 检查响应状态码是否为 400(假设服务器会因不支持的 Content-Type 返回 400 错误)。
      5. 检查响应体中的 error 字段是否包含关于 Content-Type 错误的描述。

代码实现(Python)

import requests
import pytest


# 测试用例 1:正常注册
def test_register_success():
    url = "http://example.com/api/register"
    headers = {
        "Content-Type": "application/json"
    }
    data = {
        "username": "testuser",
        "password": "testpassword",
        "email": "test@example.com"
    }
    response = requests.post(url, json=data, headers=headers)
    assert response.status_code == 201
    assert response.json().get("message") == "Registration successful"


# 测试用例 2:缺少用户名
def test_register_missing_username():
    url = "http://example.com/api/register"
    headers = {
        "Content-Type": "application/json"
    }
    data = {
        "password": "testpassword",
        "email": "test@example.com"
    }
    response = requests.post(url, json=data, headers=headers)
    assert response.status_code == 400
    error_message = response.json().get("error")
    assert "username" in error_message.lower()


# 测试用例 3:错误的 Content-Type
def test_register_wrong_content_type():
    url = "http://example.com/api/register"
    headers = {
        "Content-Type": "text/plain"
    }
    data = {
        "username": "testuser",
        "password": "testpassword",
        "email": "test@example.com"
    }
    response = requests.post(url, json=data, headers=headers)
    assert response.status_code == 400
    error_message = response.json().get("error")
    assert "content-type" in error_message.lower()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值