pytest-bdd 行为驱动自动化测试

引言

pytest-bdd 是一个专为Python设计的行为驱动开发(BDD)测试框架,它允许开发人员使用自然语言(如Gherkin)来编写测试用例,从而使测试用例更易于理解和维护。

安装

通过pip安装

shell 复制代码
pip install pytest-bdd

介绍

特性文件(Feature File):定义了要测试的系统功能。通常以.feature为扩展名,并使用Gherkin语言编写。特性文件包含特性名称、描述以及一个或多个场景。

场景文件(Scenario File):定义了特定场景的步骤。虽然pytest-bdd不直接要求场景文件具有特定的扩展名或格式,但通常会将场景步骤的定义放在Python测试文件中,并使用pytest-bdd提供的装饰器来映射场景文件中的步骤。

步骤定义:将特性文件中的步骤映射到Python代码中的函数。这些函数使用pytest-bdd提供的@given、@when、@then等装饰器来定义。

钩子:在特定测试事件(如测试开始或结束)时调用的函数。pytest-bdd提供了几个内置钩子,如before_scenario、after_scenario、before_step、after_step等,允许在测试的不同阶段执行自定义代码。

简单代码实现

feature文件编写

yaml 复制代码
Feature: TestApi

	Scenario: Successful Test
		Given: 我是接口测试
		When: 调用 "www.baidu.com" 接口
		When: 使用 "get" 请求
		Then: 调用成功

python文件编写

python 复制代码
import pytest
from pytest_bdd import scenarios, given, when, then, parsers
import requests

class ApiCaller:
    def __int__(self):
        self.api = None
        self.methods = None
        self.types = None
        self.params = None

    def call_api(self):
        print(self.api)
        result = requests.request(method,'http://' + self.api)
        return result

scenarios('test.feature')

@pytest.fixture
@given('我是测试接口')
def api_caller():
    return ApiCaller()


@when(parsers.parse('调用 "{api}" 接口'))
def api(api_caller, api):
    api_caller.api = api


@when(parsers.parse('使用 "{methods}" 请求'))
def method(api_caller, methods):
    api_caller.methods = methods


@then('调用成功')
def asserts(api_caller):
    result = api_caller.call_api()
    assert result.status_code == 200

运行

shell 复制代码
pytest test.py

拓展

通过上面简单的使用,我们知道行为驱动测试是通过pytest-bdd提供的@given、@when、@then等装饰器,来获取到feature文件中的参数,然后来进行编码测试。所以我们可以编写一个较为通用的python测试脚本,来运行所有的feature文件。这样我们只需要通过写feature文件,就可以进行接口自动化测试了。

python 复制代码
import pytest
from pytest_bdd import scenarios, given, when, then, parsers
import requests

class ApiCaller:
   def __int__(self):
       self.api = None
       self.methods = None
       self.types = None
       self.params = None
       self.headers = None

   def call_api(self):
       result = requests.request(self.methods,'http://' + self.api)
       return result

scenarios('test1.feature')

@pytest.fixture
@given('我是测试接口')
def api_caller():
   return ApiCaller()


@when(parsers.parse('调用 "{api}" 接口'))
def api(api_caller, api):
   api_caller.api = api


@when(parsers.parse('使用 "{methods}" 请求'))
def method(api_caller, methods):
   api_caller.methods = methods


@when(parsers.parse('参数类型 "{types}"'))
def types(api_caller, types):
   api_caller.types = types


@when(parsers.parse('参数 "{params}"'))
def params(api_caller, params):
   api_caller.params = params


@when(parsers.parse('参数为空'))
def params_none():
   pass

@when(parsers.parse('请求头 "{headers}"'))
def headers(api_caller, headers):
   api_caller.headers = headers


@when(parsers.parse('请求头为空'))
def params_none():
   pass

@then('调用成功')
def asserts(api_caller):
   result = api_caller.call_api()
   assert result.status_code == 200

我们把一些特殊场景提前定义好,比如请求头为空,参数为空。也可以根据自身业务来继续添加一些特殊场景,比如不同的校验方式等。这样,我们就可以通过一个python脚本,来实现不同的feature文件进行接口自动化测试。

相关推荐
张张123y5 小时前
后端第十四课:Agent 记忆系统(让 Agent 记住上下文和用户,跨会话不健忘)
java·大数据·人工智能·python·agent·记忆
happylifetree9 小时前
Python67:核心语法-函数进阶-参数类型(函数作为参数)
python
小羊没烦恼!10 小时前
铁道部新客票系统设计(二)
开发语言·前端·数据库·python·oracle·c#·php
quantdash_cc11 小时前
从实时行情到价格观察表:用 Python 和 Pandas 构建策略输入数据
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash
镜子AI11 小时前
镜子AI工程实践:用 Python 做 GEO 实体一致性审计,并自动生成 JSON-LD 结构化数据
人工智能·python·json
2601_9628857215 小时前
如何用 Python 计算 VaR 和 CVaR(在险价值)?
开发语言·python
李航198315 小时前
DeepSeekAI建模三 - 实战建模一组柜子
人工智能·python·计算机视觉·ai·ai编程
严谨的麻辣烫16 小时前
静态代理 IP 的出口一致性如何验证?Python 请求检测与异常排查
开发语言·python·http·网络安全
我命由我1234516 小时前
5-1.Python 编码进阶 - 函数进阶(参数、返回值、递归、函数作为参数传递、lambda 匿名函数)
java·服务器·数据库·后端·python·java-ee·python3.11
FITA阿泽要努力17 小时前
Fork Agent:共享上下文的艺术
开发语言·python·agent