python 行为驱动_什么是行为驱动的Python?

 2023-09-18 阅读 21 评论 0

摘要:python 行为驱动 您是否听说过行为驱动开发 (BDD),并想知道所有嗡嗡声是什么? 也许您发现团队成员在“小食”中聊天,并感到被排除在对话之外。 或者,也许您是一名Pythonista,正在寻找一种更好的方法来测试您的代码。 无论哪

python 行为驱动

您是否听说过行为驱动开发 (BDD),并想知道所有嗡嗡声是什么? 也许您发现团队成员在“小食”中聊天,并感到被排除在对话之外。 或者,也许您是一名Pythonista,正在寻找一种更好的方法来测试您的代码。 无论哪种情况,了解BDD都可以帮助您和您的团队实现更好的协作和测试自动化,而Python的behave框架是一个很好的起点。

什么是BDD?

行为是功能在定义明确的输入,操作和结果场景中的运作方式。 产品可能表现出无数的行为,例如:
  • 在网站上提交表格
  • 搜索所需的结果
  • 保存文件
  • 进行REST API调用
  • 运行命令行界面命令

根据产品行为定义产品功能,可以更轻松地描述,开发和测试产品。 这是BDD的核心:使行为成为软件开发的重点。 行为是在开发的早期使用示例语言规范来定义的。 Gherkin是最常见的行为规范语言之一,它是Cucumber项目中的Given-When-Then场景格式。 行为规范基本上是行为行为的通俗易懂的语言描述,并带有一点形式结构以保持一致性和重点。 通过将步骤文本“粘合”到代码实现中,测试框架可以轻松地自动化这些行为规范。

以下是用Gherkin编写的行为规范的示例:

Scenario: Basic DuckDuckGo Search
Given the DuckDuckGo home page is displayed
When the user searches for "panda"
Then results are shown for "panda"

行为一目了然。 除少数关键字外,该语言为自由格式。 该场景简洁但有意义。 一个真实的例子说明了这种行为。 步骤声明表示应该发生的,没有什么怎样的细节陷入困境。

python语言有哪些。 BDD的主要好处是良好的协作和自动化。 每个人都可以为行为发展做出贡献,而不仅仅是程序员。 从流程开始就定义并理解了预期的行为。 测试及其涵盖的功能可以自动进行。 为了避免重复,每个测试都涵盖一个单一的独特行为。 最后,新的行为规范可以重复使用现有步骤,从而产生滚雪球效应。

Python的行为框架

behave是Python中最受欢迎的BDD框架之一。 尽管未使用官方的Cucumber名称,但它与其他基于Gherkin的Cucumber框架非常相似。 behave有两个主要层:

  1. 用Gherkin .feature文件编写的行为规范
  2. 用实现Gherkin步骤的Python模块编写的步骤定义和挂钩

如上面的示例所示,Gherkin方案使用三部分格式:

  1. 给定一些初始状态
  2. 采取行动时
  3. 然后验证结果

behave运行测试时,装饰器会将每个步骤“粘合”到Python函数。

安装

前提条件是,确保在计算机上安装了Python和pip 。 我强烈建议使用pipenv 。(我也建议使用pipenv ,但以下示例命令使用更基本的pip 。)

behave仅需要一个软件包:

 pip install behave 

驱动型? 其他软件包也可能有用,例如:

pip install requests    # for REST API calls
pip install selenium    # for Web browser interactions

GitHub上的行为驱动Python项目包含本文中使用的示例。

小Cucumber功能

behave使用的Gherkin语法实际上符合官方的Cucumber Gherkin标准。 .feature文件具有“功能”部分,而“功能”部分又具有“情景”部分,并带有“ .feature定”步骤。 下面是一个示例:

Feature: Cucumber Basket
As a gardener,
I want to carry many cucumbers in a basket,
So that I don’t drop them all.

@cucumber-basket
Scenario: Add and remove cucumbers
Given the basket is empty
When "4" cucumbers are added to the basket
And "6" more cucumbers are added to the basket
But "3" cucumbers are removed from the basket
Then the basket contains "7" cucumbers

这里有一些重要的事情要注意:

  • Feature和Scenario部分均具有简短的描述性标题 。
  • Feature标题后紧接的行被behave忽略。 将用户故事放在那里是一个好习惯。
  • 方案和功能可以具有用于挂接和过滤的标签(请注意@cucumber-basket标记)(如下所述)。
  • 步骤遵循严格的“按时间给定”顺序 。
  • 使用AndBut可以为任何类型添加其他步骤。
  • 可以使用输入对步骤进行参数设置-注意双引号中的值。

通过使用方案大纲,还可以将方案编写为具有多个输入组合的模板:

Feature: Cucumber Basket

@ cucumber-basket
Scenario Outline: Add cucumbers
Given the basket has “ < initial > ” cucumbers
When "<more>" cucumbers are added to the basket
Then the basket contains "<total>" cucumbers

Examples: Cucumber Counts
| initial | more | total |
|    0    |   1  |   1   |
|    1    |   2  |   3   |
|    5    |   4  |   9   |

方案大纲始终具有一个“示例”表,其中第一行给出列标题,而随后的每一行给出一个输入组合。 在用尖括号将步骤中出现列标题的位置替换行值。 在上面的示例中,该场景将运行3次,因为存在三行输入组合。 方案大纲是避免重复方案的好方法。

python特性。 嫩Cucumber语言还有其他元素,但这是主要的机制。 要了解更多信息,请阅读Automation Panda文章示例Gherkin和编写Good Gherkin 。

Python机制

每个小Cucumber步骤都必须“粘合”到步骤定义中,这是提供实现的Python函数。 每个函数都有一个带有匹配字符串的步进类型装饰器。 它还接收共享上下文和任何步骤参数。 功能文件必须放置在名为features/的目录中,而步骤定义模块必须放置在名为features/steps/的目录中。 任何功能文件都可以使用任何模块中的步骤定义,而无需使用相同的名称。 下面是一个示例Python模块,其中包含针对Cucumber篮功能的步骤定义。

from behave import *
from cucumbers. basket import CucumberBasket

@ given ( 'the basket has "{initial:d}" cucumbers' )
def step_impl ( context , initial ) :
context. basket = CucumberBasket ( initial_count = initial )

@ when ( '"{some:d}" cucumbers are added to the basket' )
def step_impl ( context , some ) :
context. basket . add ( some )

@ then ( 'the basket contains "{total:d}" cucumbers' )
def step_impl ( context , total ) :
assert context. basket . count == total

提供了三步匹配器 : parsecfparsere 。 默认和最简单的游行者是parse ,如上例所示。 注意如何解析参数化的值并将其作为输入参数传递到函数中。 常见的最佳做法是分步在参数周围加上双引号。

每个步骤定义函数还接收一个上下文变量,该变量保存特定于当前正在运行的方案的数据,例如featurescenariotags字段。 也可以添加自定义字段,以在步骤之间共享数据。 始终使用上下文共享数据-永远不要使用全局变量!

behave还支持挂钩,以处理Gherkin步骤之外的自动化问题。 挂钩是将在步骤,场景,功能部件或整个测试套件之前或之后运行的功能。 钩子使人联想到面向方面的编程 。 应将它们放在features/目录下的特殊environment.py文件中。 挂钩函数也可以检查当前方案的标签,因此可以有选择地应用逻辑。 下面的示例显示了如何使用挂钩为标记为@web任何情况设置和拆除Selenium WebDriver实例。

from selenium import webdriver

def before_scenario ( context , scenario ) :
if 'web' in context. tags :
context. browser = webdriver. Firefox ( )
context. browser . implicitly_wait ( 10 )

def after_scenario ( context , scenario ) :
if 'web' in context. tags :
context. browser . quit ( )

注意:设置和清除也可以通过behave 夹具来完成。

python 类, 为了提供behave项目的外观,以下是示例项目的目录结构:

Example project's directory layout

任何Python包和自定义模块都可以与behave一起使用。 使用好的设计模式来构建可扩展的测试自动化解决方案。 步骤定义代码应简洁明了。

运行测试

要从命令行运行测试,请切换到项目的根目录,然后运行behave命令。 使用–help选项查看所有可用选项。

以下是一些常见的用例:

# run all tests
behave

# run the scenarios in a feature file
behave features/web. feature

# run all tests that have the @duckduckgo tag
behave --tags @ duckduckgo

# run all tests that do not have the @unit tag
behave --tags ~@ unit

# run all tests that have @basket and either @add or @remove
behave --tags @ basket --tags @ add ,@ remove

为了方便起见,可以将选项保存在配置文件中。

其他选择

behave不是Python中唯一的BDD测试框架。 其他好的框架包括:

  • pytest-bdd ,一个插件pytest 。 像behave一样,它使用Gherkin功能文件和步骤定义模块,但它也利用pytest所有功能和插件。 例如,它可以使用pytest-xdist并行运行Gherkin方案。 BDD和非BDD测试也可以与相同的过滤器一起执行。 pytest-bdd还提供了更灵活的目录布局。
  • radish是一个“ Gherkin-plus”框架-它在标准Gherkin语言中添加了方案循环和前提条件,这使其对程序员更加友好。 它还提供了behave丰富的命令行选项。
  • lettuce是一个较旧的BDD框架,与behave极为相似,但框架机制略有不同。 但是,GitHub在该项目中几乎没有近期活动(截至2018年5月)。

驱动, 这些框架中的任何一个都是不错的选择。

另外,请记住,Python测试框架可用于任何黑盒测试,甚至适用于非Python产品! BDD框架非常适合Web和服务测试,因为它们的测试是声明性的,而Python是测试自动化的出色语言 。


本文基于作者的PyCon Cleveland 2018演讲`` 行为驱动的Python'' 。

翻译自: https://opensource.com/article/18/5/behavior-driven-python

python 行为驱动

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/4/73205.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息