Pytest-BDD 行为驱动开发测试

这篇具有很好参考价值的文章主要介绍了Pytest-BDD 行为驱动开发测试。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

01 BDD

BDD 即 Behavior-driven development,行为驱动开发。
在软件工程中, BDD是一种敏捷开发流程。减少传统测试过程中由于技术背景能力,非技术与商业参与者之间业务理解不同而导致的问题。BDD它关注的核心是设计,其要求在设计测试用例的时候对系统进行定义,倡导使用通用的语言将系统的行为描述出来,将系统设计和测试用例结合起来,从而以此为驱动进行开发工作。
BDD行为驱动是一种敏捷开发模式, 重点在于消除开发/测试对需求了解的歧义及用户场景的验证。
BDD 使用自然语言Gherkin来描述系统功能和场景,根据这些描述步骤进行系统自动化的测试。

02 pytest-BDD

官方文档地址: https://pytest-bdd.readthedocs.io/en/latest/
Git仓库地址:https://gitlink.org.cn/test_framework/pytest-bdd

pytest-bdd 是一个BDD测试框架,类似于behave, cucumber。与许多其他传统框架pytest, unittest不同,BDD框架-pytest-bdd 不需要单独的运行程序,它可以统一单元测试和功能测试,减轻连续集成服务器配置的负担,并允许重用测试。
pytest-bdd作为pytest的一个插件,所有pytest的功能和插件都可以用于pytest-bdd!
为单元测试编写的pytest固定装置可以通过依赖项注入重新用于功能步骤中提到的设置和操作。允许对需求进行真正的BDD说明,而无需维护任何包含Gherkin命令性声明的上下文对象。

03 安装pytest-BDD

使用如下命令可以安装:pip install pytest-bdd

04 pytest-bdd的框架结构

我们先大概介绍以下框架结构,大家可以先有一个概念。了解了框架结构后,我们再详细介绍pytest-bdd的使用。
正常情况下,我们需要有一个目录features来管理测试用例(.feature文件),一个目录step_defs来管理测试步骤(test_*.py文件)。

  • 其中目录features可以自定义名称,以及自定义位置。只需要在测试步骤(test_*.py文件)中引用正确即可。
  • 目录step_defs也可以自定义名称以及自定义位置。

以下是示例:

# 第一种
├────features/   # 用户场景
│    ├────projects/
│    │    ├────create_project.features
│    ├────login.features
├────step_defs/  # 步骤函数和测试场景
│    ├────projects/
│    │    ├────test_create_project.py
│    └────test_login.py
# 第二种
├────cases/  # 用户场景
│    ├────projects/
│    │    ├────create_project.features
│    ├────login.features
├────test_cases/  # 步骤函数和测试场景
│    ├────projects/
│    │    ├────test_create_project.py
│    └────test_login.py
# 第三种
├────test_cases/  # 测试用例
│    ├────features/  # 用户场景
│    │    ├────login.features
│    ├────step_defs/  # 步骤函数和测试场景
│    │    ├────test_login.py
# 第四种
├────features/   # 用户场景
│    ├────projects/
│    │    ├────create_project.features
│    ├────login.features
├────step_defs/  # 步骤函数
│    ├────projects/
│    │    ├────create_project_steps.py
│    └────login_steps.py
├────test_case/  # 测试场景
│    ├────test_projects/
│    │    ├────test_create_project.py
│    └────test_login.py

05 pytest-bdd基础使用

5.1 第一步:添加需求描述/用户场景

5.1.1 BDD的表达语法

BDD提供一套标准的需求及用户场景表达语法, 使用文件后缀为.feature的文件进行管理。

BDD分如下几部分:

  • Fixture(特性):是向最终用户或其他涉众提供的一项功能,以支持他们实现业务目标所需的功能。
  • Background(背景):是所有场景公共的部分。在所有场景运行前会运行的部分。
  • Scenario(场景):用户在访问应用时,用户和应用之间有多种条件需要满足,每一种不同的情况都对应不同的场景,简短的声明性句子来总结这个例子的特别之处
  • Given(前置条件):在测试操作前有哪些先决条件?应该定义出所有的但不场景该场景要求范围的先决条件,given主要为后面的测试主体服务
  • When (用户操作):用户做了哪个操作,输入了哪些数据
  • Then (预期结果):回应行操作的预期结果,用户做了操作后会触发系统产生什么样的变化、输出的数据是什么

注意:

  • 一个需求文件中只能有一个Feature字段,可以包含多个Scenario(用户场景)。
  • Given->When->Then类似与准备->执行->验证/清理的流程。
  • Given:一般可以用来做预置条件/数据准备,下面第一个And也属于Given。
  • When下面的量And都属于When, 一般是操作步骤。
  • Then: 一般用于验证结果(断言),也可以进行清理数据。
5.1.2 创建.feature文件

如下所示是一个示例(文件名:login.feature):

Feature: 登录模块
    需求描述: 用户进入登录页面/弹窗登录页面,使用正确用户名以及密码可以登录成功

    Background: 清除浏览器缓存,避免缓存影响用例
        Given 清除浏览器缓存

    Scenario: 弹窗登录: 正确用户名和密码登录成功
        Given 打开浏览器,访问项目首页
        When 点击:登录按钮,打开登录弹窗
        And 弹窗中,输入用户:xxxxxx, 密码:12345678
        And 弹窗中,点击: 登录按钮, 提交登录表单
        Then 当前页面的url地址应该是:https://www.gitlink.org.cn/explore
        And 右上角显示的用户昵称应该是:xxxxxx

    Scenario: 网页登录: 正确用户名和密码登录成功
        Given 打开浏览器,访问GitLink首页
        When 点击:登录按钮,进入登录页面
        And 登录页面中,输入用户:xxxxxx, 密码:12345678
        And 登录页面中,点击: 登录按钮, 提交登录表单
        Then 当前页面的url地址应该是:https://www.gitlink.org.cn/xxxxxx
        And 右上角显示的用户昵称应该是:xxxxxx

5.2 第二步:实现用户场景

在前面的章节我们已经实现了测试场景,但是单单是靠测试场景是无法运行测试的。 我们还需要将每个场景文件.feature中的描述翻译成具体的页面操作, 每一句对应一个步骤函数。

5.2.1 用户场景的解析/实现

我们需要从pytest_bdd中导入given, when, then, parsers,帮助我们实现用户场景中的每一个步骤。

注意:我这里只摘取了上述部分步骤进行实现展示。方法都是类似的。

比如我们实现given中步骤,只需要写一个步骤函数,使用@given("步骤名称")装饰器即可。

@given("打开浏览器,访问项目首页")
def visit_projects_home(driver, host):
    driver.get(host)

同时,一个步骤函数是可以添加多个步骤的,例如:

@when("点击:登录按钮,进入登录页面")
@when("点击:登录按钮,打开登录弹窗")
def click_login_button(driver):
	login_button = driver.find_element(By.XPATH, "//a[text()='登录']")
	login_button.click()

如果我们需要从测试步骤弹窗中,输入用户:xxxxxx, 密码:12345678 中提取用户名和密码的具体值,我们可以使用parsers来解析语句中的参数。例如:

@when(parsers.parse("弹窗中,输入用户:{username}, 密码:{password}"))
def input_login_info_on_pop(driver, username, password):
	# 这里通过parsers.parse解析到username=xxxxxx, password=12345678
    username_input = driver.find_element(By.XPATH, "//input[@name='username']")
	password_input = driver.find_element(By.XPATH, "//input[@name='password']")
	username_input.send_keys(username)
	password_input.send_keys(password)

而且在步骤函数中,我们可以直接使用pytest的fixture。

# conftest.py 中定义了一个fixture
@pytest.fixture(scope="session")
def host():
    return GLOBAL_VARS.get("host")

# --------------------------------------------------------------#
# test_*.py 测试方法中直接传入fixture的名称作为参数使用即可。
# 这里直接传入了fixture的名称: host, 作为测试方法:visit_projects_home的入参使用。
@given("打开浏览器,访问项目首页")
def visit_projects_home(driver, host):
    driver.get(host)

特别注意:步骤函数中的步骤描述,需要于.feature中的保持完全一致,否则可能会报错。

5.2.2 使用scenarios@scenario关联用户场景和步骤函数

前面我们已经分别使用.feature文件以及.py文件分别实现了用户场景以及步骤函数。 我们需要将这两者关联起来。
假如我们的步骤函数是放在test_开头的.py文件中,我们可以直接在该文件中使用scenarios@scenario关联用户场景和步骤函数。
假如我们的步骤函数不是放在test_开头的.py文件中,我们可以新建一个test_开头的.py来管理测试场景,但是我们需要导入该测试场景中所需要相关的步骤函数。

我这里是直接在test_开头的.py文件中放置步骤函数以及测试场景。

下面我将分别介绍scenarios文章来源地址https://www.toymoban.com/news/detail-621694.html

到了这里,关于Pytest-BDD 行为驱动开发测试的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Python+Pytest+Allure+Git+Jenkins数据驱动接口自动化测试框架

    一、接口基础 接口测试是对系统和组件之间的接口进行测试,主要是效验数据的交换,传递和控制管理过程,以及相互逻辑依赖关系。其中接口协议分为HTTP,RPC,Webservice,Dubbo,RESTful等类型。 接口测试流程 1、需求评审,熟悉业务和需求 2、开发提供接口文档 3、编写接口测

    2024年02月08日
    浏览(83)
  • 软件测试/测试开发丨Pytest和Allure报告 学习笔记

    本文为霍格沃兹测试开发学社学员学习笔记分享 原文链接:https://ceshiren.com/t/topic/26755 类型 规则 文件 test_开头 或者 _test 结尾 类 Test 开头 方法/函数 test_开头 注意:测试类中不可以添加 __init__ 构造函数 注意:pytest对于测试包的命名没有要求 方法:类中定义的函数 函数:类

    2024年02月10日
    浏览(58)
  • 接口自动化测试框架开发(pytest+allure+aiohttp+ 用例自动生成)

    近期准备优先做接口测试的覆盖,为此需要开发一个测试框架,经过思考,这次依然想做点儿不一样的东西。 接口测试是比较讲究效率的,测试人员会希望很快能得到结果反馈,然而接口的数量一般都很多,而且会越来越多,所以提高执行效率很有必要 接口测试的用例其实

    2024年01月23日
    浏览(56)
  • 接口自动化测试框架开发 (pytest+allure+aiohttp+ 用例自动生成)

    目录 前言: 第一部分(整个过程都要求是异步非阻塞的) 读取 yaml 测试用例 http 请求测试接口 收集测试数据 第二部分 动态生成 pytest 认可的测试用例 后续(yml 测试文件自动生成) 前言: 开发一个接口自动化测试框架是一个很好的方式,可以提高测试效率和准确性。在这

    2024年02月16日
    浏览(62)
  • Pytest系列-数据驱动@pytest.mark.parametrize(7)

    unittest 和 pytest参数化对比: pytest与unittest的一个重要区别就是参数化,unittest框架使用的第三方库ddt来参数化的 而pytest框架: 前置/后置处理函数fixture,它有个参数params专门与request结合使用来传递参数,也可以用parametrize结合request来传参 针对测试方法参数化就直接使用装饰

    2024年02月08日
    浏览(54)
  • pytest数据驱动 pandas

    主要过程:用pandas读取excel里面的数据,然后进行百度查询,并断言 【留言777】 各位想获取源码等教程资料的朋友请 点赞 + 评论 + 收藏 ,三连! 三连 之后我会在评论区挨个私信发给你们~

    2024年02月13日
    浏览(41)
  • pytest数据驱动(最简单)

    目录 第一种:通过yaml文件获取数据(一维列表) 第二种:通过yaml文件获取数据(二维列表) 第三种:通过yaml文件获取数据(@pytest.fixture) 资料获取方法 data.yaml文件内容如下: - \\\'软件测试\\\' - \\\'单元测试\\\' - \\\'自动化测试\\\' - \\\'性能测试\\\' - \\\'测试开发\\\' - \\\'测试架构师\\\' 测试用例内容

    2024年02月13日
    浏览(32)
  • pytest笔记: pytest单元测试框架

    pycharm settings 查看  test_sample.py  后面带了个“.” 表示通过 如果不符合预期显示结果如下 D:softwarepython3anconda3Scripts 重启pycharm 后输入pytest

    2024年02月10日
    浏览(35)
  • Pytest教程:Pytest如何生成测试报告

    一、pytest如何生成测试报告? pytest 是一个流行的 Python 测试框架,可以用于编写和运行各种类型的测试。与基于 unittest 的传统测试框架相比,pytest 更加灵活和易于使用,并且支持各种插件扩展功能。同时,pytest 还提供了生成测试报告的功能,可以帮助开发者更好地理解测试

    2024年02月10日
    浏览(37)
  • pytest学习和使用-pytest如何进行分布式测试?(pytest-xdist)

    1 什么是分布式测试? 在进行本文之前,先了解些基础知识,什么是分布式测试? 分布式测试:是指通过局域网和Internet,把分布于不同地点、独立完成特定功能的测试计算机连接起来,以达到测试资源共享、分散操作、集中管理、协同工作、负载均衡、测试过程监控等目的

    2024年01月18日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包