pytest-bdd 行为驱动自动化测试
创始人
2024-11-13 12:40:59

引言

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

安装

通过pip安装

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文件编写

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

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  

运行

pytest test.py 

拓展

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

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文件进行接口自动化测试。

相关内容

热门资讯

裸辞做“一人公司”,我后悔了 去年这个时候,一位以色列程序员正在东南亚旅行。他顺手把一个在脑子里转了很久的想法做成了产品,一个让任...
南京建成国内首个Pre-6G试... 4月21日,2026全球6G技术与产业生态大会在南京开幕。全息互动技术展台前,一名远在北京的工作人员...
超梵求职受邀参加“2025抖音... 超梵求职受邀参加“2025抖音巨量引擎成人教育行业生态大会”,探讨分享优质内容传播,服务万千学员。 ...
摩托罗拉Razr 2026(R... IT之家 4 月 22 日消息,摩托罗拉宣布新一代 Razr 折叠手机将于 4 月 29 日在美国发...
库克卸任,特纳斯领航:苹果新纪... 苹果首席执行官蒂姆·库克将卸任,硬件工程主管约翰·特纳斯将接任,苹果公司今天宣布此事。 库克将在夏季...