Skip to main content

无需编码的接口测试框架,支持json、yaml、py文件格式的用例,命令行mwj查看帮助。

Project description

mwj-apitest

一款无需编码且易用于二次开发的 HTTP 接口测试框架。支持 JSON、YAML、Python 三种用例格式,内置数据驱动、变量提取、断言校验、失败重跑、多线程执行、HTML 报告生成及多渠道通知(邮件/钉钉/企业微信)。

本框架可拆解用于自研接口自动化平台的接口执行引擎。

特性

  • 数据驱动:支持 JSON / YAML / Python 文件编写用例,零代码即可完成接口测试
  • 变量系统:${{var}} 引用变量,F{func()} 调用内置或自定义函数
  • 数据提取:支持 JSONPath 和正则表达式从响应中提取数据
  • 断言校验:支持 eq(相等)和 contains(包含)两种断言方式
  • 钩子机制:setup_hook / teardown_hook / db_check_hook 等前后置钩子
  • 数据库校验:支持 MySQL 前后置查询及数据校验
  • 多线程执行:基于 ThreadPoolExecutor 的并发测试执行
  • 失败重跑:可配置重试次数和间隔
  • HTML 报告:Jinja2 渲染,支持两种报告模板,含历史趋势数据
  • 通知推送:邮件(SMTP)、钉钉机器人、企业微信群消息

环境要求

  • Python >= 3.8
  • 推荐使用 uv 管理虚拟环境和依赖

安装

使用 uv(推荐)

uv pip install mwj-apitest

使用 pip

pip install mwj-apitest

从源码安装(开发模式)

git clone https://github.com/Lvan826199/mwjApiTest.git
cd mwjApiTest
uv venv
uv pip install -e .

发布到 PyPI

# 1. 修改 pyproject.toml 中的 version 字段
# 2. 构建包
uv build

# 3. 发布到 PyPI(需要 PyPI token)
uv publish --token <your-pypi-token>

# 或使用用户名密码方式
uv publish --username __token__ --password <your-pypi-token>

快速开始

1. 创建项目

mwj create my_project
cd my_project

2. 运行测试

mwj run

3. 指定文件运行

mwj run --file case_yaml/test_case_demo.yaml

命令行参数

mwj create <project_name>   创建测试项目
mwj run                     运行当前目录下的所有用例
mwj run --file <path>       指定用例文件或目录
mwj run --thread <n>        设置并发线程数
mwj run --rerun <n>         设置失败重跑次数
mwj run --interval <s>      设置重跑间隔(秒)
mwj -V                      查看版本号

用例编写

YAML 格式

- testSet:
    name: 用户接口测试
    host: http://httpbin.org
    interface: /get
    method: GET
    Cases:
      - title: 测试GET请求
        interface: /get
        method: GET
        verification:
          - [eq, 200, status_code]

JSON 格式

[
  {
    "name": "用户接口测试",
    "host": "http://httpbin.org",
    "interface": "/get",
    "method": "GET",
    "Cases": [
      {
        "title": "测试GET请求",
        "interface": "/get",
        "method": "GET",
        "verification": [["eq", 200, "status_code"]]
      }
    ]
  }
]

Python 格式

from mwjApiTest.core.httptest import HttpCase

class TestDemo(HttpCase):
    name = "接口测试示例"
    host = "http://httpbin.org"
    interface = "/get"
    method = "GET"
    Cases = [
        {
            "title": "测试GET请求",
            "interface": "/get",
            "method": "GET",
            "verification": [["eq", 200, "status_code"]]
        }
    ]

配置文件 (settings.py)

# 调试模式
DEBUG = True

# 日志文件路径
LOG_FILE_PATH = "./logs"

# 全局变量
ENV = {
    "host": "http://httpbin.org"
}

# 并发线程数
THREAD = 1

# 失败重跑次数
RERUN = 0

# 重跑间隔(秒)
INTERVAL = 2

# 测试报告配置
TEST_RESULT = {
    "filename": "report.html",
    "report_dir": "./reports",
    "title": "接口测试报告",
    "tester": "测试员",
    "desc": "接口自动化测试报告",
    "templates": 2,
}

# 数据库配置(可选)
DB = [
    {
        "name": "db1",
        "type": "mysql",
        "config": {
            "host": "127.0.0.1",
            "port": 3306,
            "user": "root",
            "password": "123456",
            "database": "test_db"
        }
    }
]

# 邮件通知(可选)
EMAIL = {
    "host": "smtp.qq.com",
    "port": 465,
    "email_account": "your_email@qq.com",
    "password": "smtp授权码",
    "to_addrs": ["receiver@example.com"],
}

# 钉钉通知(可选)
DINGTALK = {
    "webhook": "https://oapi.dingtalk.com/robot/send?access_token=xxx",
    "key": "关键字",
}

# 企业微信通知(可选)
WECHAT = {
    "chatid": "群ID",
    "access_token": "access_token",
}

变量与函数

变量引用

使用 ${{变量名}} 引用环境变量:

headers:
  Authorization: "Bearer ${{token}}"

内置函数

使用 F{函数名(参数)} 调用内置数据生成函数:

函数 说明
F{random_mobile()} 随机手机号
F{random_name()} 随机中文姓名
F{random_ssn()} 随机身份证号
F{random_email()} 随机邮箱
F{random_addr()} 随机地址
F{random_city()} 随机城市
F{get_timestamp()} 当前时间戳
F{base64_encode("text")} Base64 编码
F{md5_encrypt("text")} MD5 加密
F{rsa_encrypt("msg","pubkey")} RSA 加密

数据提取

从响应中提取数据并存储到变量中:

extract:
  token: [ENV, jsonpath, "$.data.token"]
  user_id: [env, re, '"id":\s*(\d+)']
  • 第一个参数:变量作用域(ENV 全局 / env 局部)
  • 第二个参数:提取方式(jsonpath / re
  • 第三个参数:提取表达式

断言

verification:
  - [eq, 200, status_code]
  - [eq, "success", "V{{$.msg}}"]
  - [contains, "token", "V{{$.data}}"]
  • 第一个参数:断言方式(eq 相等 / contains 包含)
  • 第二个参数:预期值
  • 第三个参数:实际值(status_codeV{{jsonpath表达式}}

许可证

MIT License

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

mwj_apitest-1.3.0.tar.gz (39.2 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

mwj_apitest-1.3.0-py3-none-any.whl (58.3 kB view details)

Uploaded Python 3

File details

Details for the file mwj_apitest-1.3.0.tar.gz.

File metadata

  • Download URL: mwj_apitest-1.3.0.tar.gz
  • Upload date:
  • Size: 39.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.7 {"installer":{"name":"uv","version":"0.11.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":null,"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for mwj_apitest-1.3.0.tar.gz
Algorithm Hash digest
SHA256 4fe866b582bffdc71cd8fa054145502be39a23763662c515e9ca9429162f8a39
MD5 eca6424d5a74a6ecbf84581d6df23265
BLAKE2b-256 697d70f0ea5f8cf1625df9efcd402d79664e124714aba70a5a25ff9c82a37b35

See more details on using hashes here.

File details

Details for the file mwj_apitest-1.3.0-py3-none-any.whl.

File metadata

  • Download URL: mwj_apitest-1.3.0-py3-none-any.whl
  • Upload date:
  • Size: 58.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.7 {"installer":{"name":"uv","version":"0.11.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":null,"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for mwj_apitest-1.3.0-py3-none-any.whl
Algorithm Hash digest
SHA256 2d124fafc6f01e0f703fc5885b1b636953e72f7908740a1a5d4ff6ed6501c376
MD5 cbdb5688557f38ba0a4a43ee80b1a025
BLAKE2b-256 85ad3b3594cafb6428ce023f45cd558f81497f38bd9ffda59f36714d4195165b

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page