# pytest-dsl: 强大的关键字驱动测试自动化框架
[](https://python.org)
[](LICENSE)
[](https://pypi.org/project/pytest-dsl/)
> 🚀 **让测试自动化变得简单直观** - 使用自然语言风格的DSL编写测试,无需复杂编程技能
pytest-dsl是一个革命性的关键字驱动测试框架,基于pytest构建,通过自定义的领域特定语言(DSL)让测试编写变得像写文档一样简单。无论是API测试、UI测试还是其他自动化场景,都能轻松应对。
## ✨ 核心特性
- 🎯 **门槛上手低** - 自然语言风格,只需少量编程基础
- 🔧 **高度可扩展** - 轻松创建自定义关键字,支持参数默认值
- 🌐 **分布式执行** - 支持远程关键字调用
- 🔄 **无缝集成** - 完美兼容pytest生态
- 📊 **丰富报告** - 集成Allure测试报告
- 🛡️ **企业级** - 支持变量管理、环境隔离
- ⚡ **智能简化** - 参数默认值让DSL更加简洁易读
## 🚀 5分钟快速开始
### 第一步:安装
```bash
# 使用 pip 安装
pip install pytest-dsl
# 或使用 uv 安装(推荐)
uv pip install pytest-dsl
```
### 第二步:创建第一个测试
创建文件 `hello.dsl`:
```python
@name: "我的第一个测试"
@description: "学习pytest-dsl的第一步"
# 定义变量
message = "Hello, pytest-dsl!"
count = 3
# 打印欢迎消息
[打印], 内容: ${message}
# 简单循环
for i in range(1, ${count} + 1) do
[打印], 内容: "第 ${i} 次循环"
end
# 测试断言
[断言], 条件: "${count} == 3", 消息: "计数器应该等于3"
teardown do
[打印], 内容: "测试完成!"
end
```
### 第三步:运行测试
```bash
# 直接运行DSL文件
pytest-dsl hello.dsl
# 运行目录下所有DSL文件
pytest-dsl tests/
```
🎉 **恭喜!** 您已经成功运行了第一个pytest-dsl测试!
## 📚 基础教程
### 1. 基本语法入门
#### 变量和数据类型
```python
# 字符串变量
name = "pytest-dsl"
version = "1.0.0"
# 数字变量
port = 8080
# 布尔值变量
is_enabled = True
is_disabled = False
# 列表
users = ["alice", "bob", "charlie"]
# 字典
user_info = {"name": "张三", "age": 30, "city": "北京"}
# 嵌套字典
config = {
"database": {
"host": "localhost",
"port": 3306,
"name": "test_db"
},
"api": {
"base_url": "https://api.example.com",
"timeout": 30
}
}
# 访问字典值
username = ${user_info["name"]}
db_host = ${config["database"]["host"]}
```
#### 流程控制
```python
# 条件判断
status = "success"
if status == "success" do
[打印], 内容: "测试通过"
else
[打印], 内容: "测试失败"
end
# 使用布尔值的条件判断
is_ready = True
if ${is_ready} do
[打印], 内容: "系统就绪"
end
# 循环结构
num = 4
for i in range(1, num) do
[打印], 内容: "执行第 ${i} 次"
end
# 循环中的break和continue
for j in range(1, 11) do
# 跳过偶数
if ${j} % 2 == 0 do
continue
end
# 当达到7时退出循环
if ${j} == 7 do
[打印], 内容: "达到7,退出循环"
break
end
[打印], 内容: "奇数: ${j}"
end
```
### 2. 内置关键字详解
#### 基础关键字
```python
# 打印输出
[打印], 内容: "Hello World"
# 断言测试
[断言], 条件: "1 + 1 == 2", 消息: "数学计算错误"
# 等待
[等待], 秒数: 2
# 生成随机数
random_num = [生成随机数], 最小值: 1, 最大值: 100
[打印], 内容: "随机数: ${random_num}"
```
#### 变量操作
```python
[设置全局变量], 变量名: "test_env", 值: "development"
# 获取全局变量
env = [获取全局变量], 变量名: "test_env"
[打印], 内容: "当前环境: ${env}"
```
### 3. 自定义关键字(函数)
自定义关键字让您可以封装复用的测试逻辑:
```python
@name: "自定义关键字示例"
# 定义一个计算器关键字
function 计算器 (操作, 数字1, 数字2=0) do
if ${操作} == "加法" do
[打印],内容: "执行加法操作"
结果 = ${数字1} + ${数字2}
else
结果 = 12
end
[打印], 内容: "${数字1} ${操作} ${数字2} = ${结果}"
return ${结果}
end
# 使用自定义关键字
sum_result = [计算器], 操作: "加法", 数字1: 10, 数字2: 5
product_result = [计算器], 操作: "其他", 数字1: 3, 数字2: 4
# 验证结果
[断言], 条件: "${sum_result} == 15", 消息: "加法计算错误"
[断言], 条件: "${product_result} == 12", 消息: "其他计算错误"
```
#### 资源文件复用
将常用关键字保存在资源文件中(`.resource`),实现跨项目复用:
**创建资源文件 `utils.resource`:**
```python
@name: "通用工具关键字"
# 定义一个简单的关键字(函数)
function 拼接字符串 (前缀, 后缀="默认后缀") do
# 直接使用关键字参数
[打印],内容: "拼接前缀: ${前缀} 和后缀: ${后缀}"
# 保存到变量中
结果变量 = "${前缀}${后缀}"
[打印],内容: "拼接结果: ${结果变量}"
# 返回结果
return ${结果变量}
end
```
**在测试中使用资源文件:**
```python
@name: "使用资源文件示例"
@import: "utils.resource"
# 使用自定义关键字
问候语 = [拼接字符串],前缀: "你好, ",后缀: "世界"
# 只传递必要参数,使用默认值
简单问候 = [拼接字符串],前缀: "你好"
[打印],内容: ${简单问候} # 输出: 你好默认后缀
```
### 4. API测试入门
#### 简单的GET请求
```python
@name: "API测试入门"
@description: "学习基本的API测试方法"
# 简单的GET请求
[HTTP请求], 客户端: "default", 配置: '''
method: GET
url: https://jsonplaceholder.typicode.com/posts/1
asserts:
- ["status", "eq", 200]
- ["jsonpath", "$.title", "contains", "sunt"]
''', 步骤名称: "获取文章详情"
```
#### 带参数的请求
```python
# 带查询参数的GET请求
[HTTP请求], 客户端: "default", 配置: '''
method: GET
url: https://jsonplaceholder.typicode.com/posts
request:
params:
userId: 1
_limit: 5
asserts:
- ["status", "eq", 200]
- ["jsonpath", "$", "length", "eq", 5]
''', 步骤名称: "获取用户文章列表"
```
#### 数据捕获和变量使用
```python
# 捕获响应数据
[HTTP请求], 客户端: "default", 配置: '''
method: GET
url: https://jsonplaceholder.typicode.com/users/1
captures:
user_name: ["jsonpath", "$.name"]
user_email: ["jsonpath", "$.email"]
asserts:
- ["status", "eq", 200]
''', 步骤名称: "获取用户信息"
# 使用捕获的变量
[打印], 内容: "用户名: ${user_name}"
[打印], 内容: "邮箱: ${user_email}"
# 在后续请求中使用
[HTTP请求], 客户端: "default", 配置: '''
method: GET
url: https://jsonplaceholder.typicode.com/posts
request:
params:
userId: 1
asserts:
- ["status", "eq", 200]
''', 步骤名称: "根据用户ID获取文章"
```
## 🚀 进阶功能
### 1. 环境配置管理
#### YAML变量文件
创建 `config/dev.yaml` 管理开发环境配置:
```yaml
# 环境配置
environment: "development"
debug: true
# API配置
api:
base_url: "https://jsonplaceholder.typicode.com"
timeout: 30
retry_count: 3
# HTTP客户端配置
http_clients:
default:
base_url: "${api.base_url}"
timeout: ${api.timeout}
headers:
Content-Type: "application/json"
User-Agent: "pytest-dsl/1.0"
# 测试数据
test_users:
admin:
username: "admin"
password: "admin123"
normal:
username: "user"
password: "user123"
# 数据库配置
database:
host: "localhost"
port: 5432
name: "test_db"
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论





























收起资源包目录





































































































共 248 条
- 1
- 2
- 3
资源评论


智慧安全方案
- 粉丝: 3927
上传资源 快速赚钱
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- 项目管理计划的3个不同层次.docx
- 消防配置设备设施接管验收移交表WINWGZAL.KF0637.doc
- 社会网络中心性对产业集群内信息资源传递的影响分析.docx
- 自动喷水灭火系统管道及系统组件安装分项工程质量技术交底卡.doc
- 面向智慧城市的电子政务信息资源管理研究.docx
- 煤矿机电自动化集控发展及其应用研究.docx
- 第4章--基本指令.ppt
- 商务会议团队合作.ppt
- 广东某市截污工程施工组织设计(第Ⅳ标段).doc
- 子课题中期总结报告wulb.docx
- 自动喷水灭火系统设计规范讲义.doc
- 电信运营商大数据平台规划研究.docx
- 各工种施工班组承包协议书汇总表(标准格式).doc
- 基于移动互联网技术的高校食堂特色订餐系统的设计.docx
- 单片机的天然气泄漏检测系统研究与设计开发.doc
- 陕西某道路绿化施工组织设计.doc
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈



安全验证
文档复制为VIP权益,开通VIP直接复制
