Skip to content

什么是pytest-dsl

pytest-dsl是一个用于测试DSL文件的工具,基于pytest构建,通过自定义的领域特定语言(DSL)让测试编写变得像写文档一样简单。核心的自动化测试能力依靠pytest生态系统,配合强大的VSCode扩展,提供完整的开发支持体验。

核心理念

🎯 让测试变得简单

传统的自动化测试往往需要深厚的编程基础,而pytest-dsl采用自然语言风格的DSL,让测试人员能够专注于测试逻辑本身,而不是复杂的编程语法。

传统方式:

python
import requests
import pytest

def test_user_api():
    response = requests.get("https://api.example.com/users/1")
    assert response.status_code == 200
    assert "name" in response.json()
    user_id = response.json()["id"]
    # 更多复杂的断言和处理...

pytest-dsl方式:

python
@name: "用户API测试"

[HTTP请求], 客户端: "default", 配置: '''
    method: GET
    url: https://api.example.com/users/1
    captures:
        user_id: ["jsonpath", "$.id"]
    asserts:
        - ["status", "eq", 200]
        - ["jsonpath", "$.name", "exists"]
'''

🔧 关键字驱动的威力

关键字驱动测试是一种成熟的测试方法论,pytest-dsl将其发挥到极致:

  • 高度抽象 - 将复杂的技术实现封装为简单的关键字
  • 易于维护 - 修改关键字实现,所有使用该关键字的测试自动更新
  • 团队协作 - 技术专家创建关键字,测试人员专注业务逻辑
  • 知识复用 - 一次编写,到处使用

核心优势

🎯 零门槛上手

python
# 即使没有编程基础,也能理解这个测试在做什么
@name: "检查网站首页"

[HTTP请求], 客户端: "default", 配置: '''
    method: GET
    url: https://www.example.com
    asserts:
        - ["status", "eq", 200]
        - ["body", "contains", "欢迎"]
'''

[打印], 内容: "网站首页检查完成"

🔧 高度可扩展

创建自定义关键字就像定义函数一样简单:

python
# 定义一个登录关键字
function 用户登录 (用户名, 密码="默认密码") do
    [HTTP请求], 客户端: "default", 配置: '''
        method: POST
        url: /api/login
        request:
            json:
                username: "${用户名}"
                password: "${密码}"
        captures:
            token: ["jsonpath", "$.token"]
    '''
    [设置全局变量], 变量名: "auth_token", 值: ${token}
    return ${token}
end

# 使用自定义关键字
token = [用户登录], 用户名: "admin"

🌐 分布式执行

内置的远程关键字功能让分布式测试变得简单:

python
@remote: "http://server1:8270/" as server1
@remote: "http://server2:8270/" as server2

# 在不同服务器上并行执行测试
server1|[HTTP请求], 客户端: "default", 配置: '''
    method: GET
    url: https://internal-api.example.com/health
'''

server2|[数据库查询], 查询语句: "SELECT COUNT(*) FROM users"

🔄 无缝集成

完美兼容pytest生态,可以渐进式迁移:

python
# test_runner.py
from pytest_dsl.core.auto_decorator import auto_dsl

@auto_dsl("./tests")
class TestAPI:
    """自动加载tests目录下的所有DSL文件"""
    pass
bash
# 使用pytest运行,享受所有pytest功能
pytest test_runner.py -v --alluredir=reports

🎨 强大的开发工具支持

pytest-dsl提供了专业的VSCode扩展,让开发体验更加流畅:

📊 智能关键字管理

  • 分类浏览器 - 按类型自动分组关键字(内置、自定义、收藏夹等)
  • 智能搜索 - 支持名称、参数、说明的模糊搜索
  • 收藏夹功能 - 标记常用关键字,快速访问
  • 树状结构 - 清晰的层级展示,支持展开/折叠

🔍 智能编辑功能

  • 语法高亮 - 完整的pytest-DSL语法高亮支持
  • 智能补全 - 基于关键字库的自动补全
  • 参数模板 - 自动生成带参数的关键字模板
  • 快捷键支持 - 高效的键盘操作

⚙️ 便捷配置管理

  • 关键字文件生成 - 自动生成和管理关键字JSON文件
  • 实时缓存 - 智能缓存减少重复加载
  • 可视化编辑 - 图形化界面编辑关键字定义

适用场景

✅ 非常适合

  • API接口测试 - 完整的HTTP测试支持
  • 分布式测试 - 跨服务调用、服务间通信和分布式系统测试
  • 回归测试 - 数据驱动和批量执行
  • 集成测试 - 跨系统测试协调
  • 团队协作 - 技术和业务人员协作
  • 快速原型 - 快速验证测试想法

⚠️ 需要考虑

  • 复杂UI测试 - 虽然可以扩展,但可能不如专门的UI测试工具
  • 性能测试 - 需要结合其他性能测试工具
  • 单元测试 - 传统的pytest可能更适合

与其他工具的比较

特性pytest-dslRobot FrameworkPostman传统pytest
学习门槛🟢 很低🟡 中等🟢 很低🔴 较高
扩展性🟢 很强🟢 很强🟡 中等🟢 很强
API测试🟢 优秀🟡 一般🟢 优秀🟡 需要编码
分布式🟢 内置🔴 需要插件🔴 不支持🔴 需要额外工具
开发工具🟢 专业VSCode扩展🟡 基础支持🟢 专用客户端🟡 通用编辑器
报告🟢 丰富🟢 丰富🟡 基础🟡 需要插件
生态🟡 新兴🟢 成熟🟢 成熟🟢 非常成熟

设计哲学

简单性优于复杂性

pytest-dsl相信简单的工具能解决复杂的问题。我们的设计原则是:

  • 直观的语法 - 代码即文档
  • 合理的默认值 - 减少配置负担
  • 渐进式学习 - 从简单到复杂
  • 最小惊讶原则 - 行为符合直觉

组合优于继承

通过关键字组合构建复杂的测试场景:

python
# 通过组合基础关键字实现复杂流程
function 完整的用户测试流程 (用户名) do
    # 登录
    token = [用户登录], 用户名: ${用户名}
    
    # 获取用户信息
    [HTTP请求], 客户端: "default", 配置: '''
        method: GET
        url: /api/user/profile
        request:
            headers:
                Authorization: "Bearer ${token}"
        captures:
            user_id: ["jsonpath", "$.id"]
    '''
    
    # 更新用户信息
    [HTTP请求], 客户端: "default", 配置: '''
        method: PUT
        url: /api/user/${user_id}
        request:
            headers:
                Authorization: "Bearer ${token}"
            json:
                last_login: "${当前时间}"
    '''
    
    # 登出
    [用户登出]
end

下一步

现在您已经了解了pytest-dsl的核心理念和优势,让我们开始实际体验吧:

Released under the MIT License.