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"

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

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次,因为存在三行输入组合。 方案大纲是避免重复方案的好方法。

嫩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 夹具来完成。

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

任何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 行为驱动

python 行为驱动_什么是行为驱动的Python?相关推荐

  1. Python灰帽子_黑客与逆向工程师的Python编程之道

    收藏自用 链接:Python灰帽子_黑客与逆向工程师的Python编程之道

  2. Windows驱动_文件系统微小过滤驱动之三微小过滤驱动的操作

    30岁左右的程序员,现在除了奋斗以外,要开始考虑下自己的身体了,到了这个年纪,不能像之前20岁左的年轻人一样不顾一切去拼搏.现在的自己,应该更讲究效率.所以选择公司也很重要.同样,运动开始变得必需了, ...

  3. Windows驱动_文件系统微小过滤驱动之一初识MiniFilter

    人的一生,就那么几十年,所有的人都无法知道下一刻会发生什么,我们活在当下,只能努力将自己目前的工作或生活过好.船到桥头自然直,况且,自己这么多年,经历了多多少少的风浪太多了,说到底还是不够自信,我应该 ...

  4. Windows驱动_文件系统微小过滤驱动之二驱动的安装和加载

    机会总是留给有准备的人,人生只不过有6到7次机会,极少数的人抓住了,大部分的人,让机会从自己的身边溜走.在机会还没有到来的时候,千万不要气馁,也千万不要放弃.首先,认清自己,很多人,其实都没有将自己认 ...

  5. win7万能声卡驱动_黑苹果常见 .kext 驱动解读下载

    科普一下黑苹果下各种  ***.kext  驱动的各种功能,方便大家认清楚自己驱动包里的各项驱动是干什么用的,也可对应此表把自己不用的驱动做适当精简.如果您有更多黑苹果安装的驱动或以下内容有误需要补充 ...

  6. 胜为蓝牙适配器驱动_胜为蓝牙适配器驱动

    胜为蓝牙适配器驱动下载!胜为蓝牙适配器驱动是胜为蓝牙适配器官网提供的胜为蓝牙适配器驱动!胜为蓝牙适配器驱动支持32位和64位系统,能够有效建立蓝牙驱动相连,有需要的这款udc324b usb4.0驱动 ...

  7. 如何在pe里加载阵列卡驱动_如何将SATA驱动集成到pe中

    WinPE系统最关键的就是内核驱动和外置驱动,内核驱动主要就是南桥驱动,针对RAID.SATA,以及AHCI,这是WinPE最关键的部份,主要是让WinPE能够识别系统的SATA硬盘和RAID磁盘阵列 ...

  8. 小米手机adb驱动_小米手机GPU驱动可独立更新性能提升;iQOO Neo3正式开卖

    [科技犬] 小米应用商店推送GPU驱动更新,支持GPU驱动独立升级.据悉,小米10.小米10 Pro.Redmi K30 Pro首次支持应用商店GPU驱动更新,主要功能如下: 1.优化GPU驱动,增强 ...

  9. alc236黑苹果驱动_黑苹果AMD显卡驱动优化,大幅提升性能!

    我们通常说的某些型号的 AMD 显卡在黑苹果中免驱,指的是只要把这个显卡插上,搭配WhateverGreen.kext 的情况下 macOS 就能识别出对应的型号,并提供基础性能驱动. 其实这个时候, ...

  10. canon l11121e驱动_佳能Canon L11121e 驱动

    驱动支持系统:Windows 客户端操作系统(32/64 位)- Win10|Win8|WIN7|XP 怎么安装佳能Canon L11121e 打印机官方驱动和注意事项: 1. 系统最好是没有安装过打 ...

最新文章

  1. NBT:南农突破成果—噬菌体:土壤“狙击手”激发根际防御军团(附视频)
  2. php 检测是否是微信浏览器,php判断是否是微信浏览器和是否是移动端代码
  3. 2020:编程语言大盘点
  4. DevExpress控件使用经验总结
  5. 计算机网络 --- 网络层路由算法与路由协议
  6. 《深入学习 Golang》并发编程
  7. 回文树 / 自动机模板
  8. 【linux就该这么学】-09
  9. 基于wincc的虚拟电梯设计_基于WinCC的电梯PLC控制仿真.doc
  10. linux下载m3u8工具,[2020.11.2更新]m3u8命令行下载工具,支持windows和linux
  11. MAML代码及理论的深度学习 PyTorch二阶导数计算
  12. 手机怎么设置腾达路由器后显示远端服务器,怎么用手机设置腾达(Tenda)路由器wifi密码?...
  13. 零基础如何学 Web 前端开发
  14. 研发路上的总结和思考 -----来自阿里巴巴中间插件----作者:石佳宁
  15. 百度地图离线开发demo(热力图)
  16. 腾讯笔试题20210321
  17. [总结]好书的评判标准
  18. ABAP ALV中自定义搜索帮助
  19. Arduino编程基础-C
  20. java对文件的处理(读取,写入,复制,加密和解密)

热门文章

  1. [解题报告]1005 - Number Sequence
  2. poj1163 数字三角形 (动态规划)
  3. workplace background
  4. SQL Server数据库原理
  5. Dubbo搭建监控中心
  6. ros云服务器_减少运维工作量,如何通过 ROS 轻松实现资源编排新方式
  7. 复习 2 个月拿下大厂 Offer,Java 面试指南带你通关跳槽季
  8. Chrome 73 DevTools 新功能之 Logpoints
  9. (开源)XMind2TestCase一个高效的测试用例设计解决方案
  10. 【PHP发展史】PHP5.2 到 PHP5.6 中新增的功能详解