测试学习之——Pytest Day5

发布于:2025-07-26 ⋅ 阅读:(12) ⋅ 点赞:(0)

一、接口测试用例

1、设计用例内容

  1. 名字
  2. 标记(可选)
  3. 步骤:
  • 请求接口: GET https://www.baidu.com
  • 响应断言; status_code == 200
  • 提取变量: json()['code']

2、YAML表示用例

name: 登录成功的用例
steps:
  - request:
      method: POST
      url:  http://127.0.0.1:5000/login
      params:
        json:{
          "username":"admin",
          "password":"admin123"
        }
  - response:
      status_code: 200
      json:
        code: 0
        msg: 登录成功
        data:
          login_time:
            username: admin

  - extract:
      token: [json,$.data.token]

二、封装接口自动化框架

1、请求接口

外部工具请求接口:requests

HTTP协议抓包,请求组成由三部分组成:

  • 行:方法+地址(必填)
  • 头:请求头(键值对)
  • 体:参数内容
import requests
### 1、方法
url = "http://127.0.0.1:5000/login"
#GET方法
requests.get(url)
#POST方法
requests.post(url)
#任意方法
requests.requests(''MOV',url)

头:

import requests
###2、头
url = "http://127.0.0.1:5000/login"
method = "POST"

def test_login():
    r = requests.request(
        method,url,
        headers={#字符串字典
            "1":"a",
            "2":"b"
        }
)
    print(r.status_code)
    print(r.text)

参数:

import requests

url = "http://127.0.0.1:5000/login"
method = "POST"

requests.requests(
    method,url,
    json ={
        "a":1,
        "b":[1,2,3],
        "c":{}
    }
)

2、断言响应

  1. 响应包含什么
  • 行:状态码
  • 头:响应头(键值对)
  • 体:响应内容
  1. 响应如何断言
import requests
#断言全部内容 
from responses_validator import  validator

### 1、方法
url = "http://127.0.0.1:5000/login"

json = {
    "username": "admin",
    "password": "admin123"
}
method = "POST"

def test_login():
    r = requests.request(method,url,json = json)
    # 断言单个内容是否正确
    assert r.status_code == 200
    assert 'admin' in r.text
    assert r.json()['data']["username"]=="admin"
    #断言全部内容
    validator(
        r,
        status_code=200,
        text='*admin*',
        json={
            "data": {
                "username": "admin"
            }
        }

    )
    print(r.status_code)
    print(r.text)
    print(r.headers)
    print(r.json())

3、变量提取

基本原则:

  • JSON:JSONPATH
  • HTML:XPATH
  • 字符串:RE(兜底)
import jsonpath

def extract(resp,name,exp):
    try:
        resp.json = resp.json()
    except:
        resp.json = {}

    attr = getattr(resp, name)

    res = jsonpath.jsonpath(attr,exp)

    return res
from extract_utils import extract

var = extract(r,'json','$..username')

print(var)

4、框架落地封装

import requests
import responses_validator
from commons.extract_utils import extract

import logging

logger = logging.getLogger("hejie")
def runner(k,v,my_var):
    match k:
    case 'requests':
        logger.info('1.正在发送请求。。。')
        logger.info(f'{v}')
        my_var['resp']  = requests.request(**v)#字典使用 **
    case 'response':
        logger.info('2.正在验证响应。。。')
        logger.info(f'{v}')
        responses_validator.validator(my_var['resp'] ,**v)
    case 'extract':
        logger.info('3.正在提取变量。。。')
        for var_name,var_exp in v.items():
            value =  extract(my_var['resp'] ,*var_exp) #列表使用 *
            logger.info(f'{var_name} = {value}')
import allure

from commons.extract_utils import extract

from commons.runner_utils import runner

def test_yaml():
    my_var = {}
    data = extract("/Users/user/python/tmp_1112/tests/test_api_1.yaml")
    allure.title(data['name'])

    for step in data['steps']:
        for k ,v in step.items():
            runner(k,v,my_var)
import pytest
import  os


pytest.main()

#执行命令
os.system("allure generate ./allure-results -o ./allure-report --clean")
name: 登录成功的用例
steps:
  - request:
      method: POST
      url:  http://127.0.0.1:5000/login
      params:
        json:{
          "username":"admin",
          "password":"admin123"
        }
  - response:
      status_code: 200
      json:
        code: 0
        msg: 登录成功
        data:
          login_time:
            username: admin

  - extract:
      token: [json,$.data.token]
[pytest]

addopts = --alluredir=./allure-results --clean-alluredir -m web  --driver chrome -vs

markers =
api:接口测试
web:UI测试
ut:单元测试
login:登录相关
pay:支付相关
ddt:数据驱动测试

log_file= ./logs/pytest.log
log_file_level= info
log_file_format= %(levelname)-8s %(asctime)s [%(name)s:%(lineno)s] : %(message)s
log_file_date_format= %Y-%m-%d %H:%M:%S
;记录用例执行结果
result_log_enable=1
;记录用例分割线
result_log_separator=1
;分割线等级
result_log_level_separator= warning
;异常信息等级
result_log_level_verbose= info


网站公告

今日签到

点亮在社区的每一天
去签到