使用 Python behave 框架的行为驱动开发模式可以帮助你的团队更好的协作和测试自动化。

您是否听说过行为驱动开发behavior-driven development(BDD),并好奇这是个什么东西?也许你发现了团队成员在谈论“嫩瓜”(LCTT 译注:“嫩瓜gherkin” 是一种简单的英语文本语言,工具 cucumber 通过解释它来执行测试脚本,见下文),而你却不知所云。或许你是一个 Python 人Pythonista,正在寻找更好的方法来测试你的代码。 无论在什么情况下,了解 BDD 都可以帮助您和您的团队实现更好的协作和测试自动化,而 Python 的 behave 框架是一个很好的起点。

什么是 BDD?

在软件中,行为是指在明确定义的输入、动作和结果场景中功能是如何运转的。 产品可以表现出无数的行为,例如:

在网站上提交表单

搜索想要的结果

保存文档

进行 REST API 调用

运行命令行界面命令

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

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

根据产品的行为定义产品的功能可以更容易地描述产品,开发产品并对其进行测试。 这是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 框架

behave 是 Python 中最流行的 BDD 框架之一。 它与其他基于 Gherkin 的 Cucumber 框架非常相似,尽管没有得到官方的 Cucumber 定名。 behave 有两个主要层:

用 Gherkin 的 .feature 文件编写的行为规范

用 Python 模块编写的步骤定义和钩子,用于实现 Gherkin 步骤

如上例所示,Gherkin 场景有三部分格式:

鉴于(Given)一些初始状态

每当(When)行为发生时

然后(Then)验证结果

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

安装

作为先决条件,请确保在你的计算机上安装了 Python 和 pip。 我强烈建议使用 Python 3.(我还建议使用 pipenv,但以下示例命令使用更基本的 pip。)

behave 框架只需要一个包:

pip install behave

其他包也可能有用,例如:

pip install requests # 用于调用 REST API

pip install selenium # 用于 web 浏览器交互

GitHub 上的 behavior-driven-Python 项目包含本文中使用的示例。

Gherkin 特点

behave 框架使用的 Gherkin 语法实际上是符合官方的 Cucumber Gherkin 标准的。.feature 文件包含了功能(Feature)部分,而场景部分又包含具有 Given-When-Then 步骤的场景(Scenario) 部分。 以下是一个例子:

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 框架忽略掉的注释。将功能描述放在那里是一种很好的做法。

Scenario 和 Feature 可以有标签(注意 @cucumber-basket 标记)用于钩子和过滤(如下所述)。

使用 And 和 But 可以为任何类型添加附加步骤。

可以使用输入对步骤进行参数化——注意双引号里的值。

通过使用场景大纲(Scenario Outline),场景也可以写为具有多个输入组合的模板:

Feature: Cucumber Basket

@cucumber-basket

Scenario Outline: Add cucumbers

Given the basket has “” cucumbers

When "" cucumbers are added to the basket

Then the basket contains "" cucumbers

Examples: Cucumber Counts

| initial | more | total |

| 0 | 1 | 1 |

| 1 | 2 | 3 |

| 5 | 4 | 9 |

场景大纲总是有一个示例(Examples)表,其中第一行给出列标题,后续每一行给出一个输入组合。 只要列标题出现在由尖括号括起的步骤中,行值就会被替换。 在上面的示例中,场景将运行三次,因为有三行输入组合。 场景大纲是避免重复场景的好方法。

Gherkin 语言还有其他元素,但这些是主要的机制。 想了解更多信息,请阅读 Automation Panda 这个网站的文章 Gherkin by Example 和 Writing Good Gherkin。

Python 机制

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

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

可以使用三个步骤匹配器:parse、cfparse 和 re。默认的,也是最简单的匹配器是 parse,如上例所示。注意如何解析参数化值并将其作为输入参数传递给函数。一个常见的最佳实践是在步骤中给参数加双引号。

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

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()

注意:也可以使用 fixtures 进行构建和清理。

要了解一个 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

为方便起见,选项可以保存在 config 文件中。

其他选择

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

pytest-bdd,是 pytest 的插件,和 behave 一样,它使用 Gherkin 功能文件和步骤定义模块,但它也利用了 pytest 的所有功能和插件。例如,它可以使用 pytest-xdist 并行运行 Gherkin 场景。 BDD 和非 BDD 测试也可以与相同的过滤器一起执行。pytest-bdd 还提供更灵活的目录布局。

radish 是一个 “Gherkin 增强版”框架——它将场景循环和前提条件添加到标准的 Gherkin 语言中,这使得它对程序员更友好。它还像 behave 一样提供了丰富的命令行选项。

lettuce 是一种较旧的 BDD 框架,与 behave 非常相似,在框架机制方面存在细微差别。然而,GitHub 最近显示该项目的活动很少(截至2018 年 5 月)。

任何这些框架都是不错的选择。

另外,请记住,Python 测试框架可用于任何黑盒测试,即使对于非 Python 产品也是如此! BDD 框架非常适合 Web 和服务测试,因为它们的测试是声明性的,而 Python 是一种很好的测试自动化语言。

本文由 LCTT 原创编译,Linux中国 荣誉推出

python是什么公司开发的软件-软件开发|什么是行为驱动的 Python?相关推荐

  1. python 黑客工具开发_python黑客软件的搜索结果-阿里云开发者社区

    带你读<Python科学计算(原书第2版)>之一:导论 计算机科学丛书点击查看第二章点击查看第三章Python科学计算(原书第2版)Python for Scientists, Secon ...

  2. 一个开发团队、软件公司,团队工作氛围很重要,没有好氛围难出好产品、好项目...

    接触软件行业很多年有些年头了,展望过去的岁月,总想写点儿东西,总结总结,我也 不怕拍砖了,曾经也换过很多公司.跳过很多槽,现在想想,总结出来:"天下的乌鸦 是一样黑的",没有理想的 ...

  3. python学习笔记(装饰器、迭代器生成器、内置函数、软件目录开发规范)

    装饰器 定义:本质是函数,(功能:装饰其他函数):就是为其他函数添加附加功能 模拟场景一,在现有的函数中增加某个功能.现有的做法是定义新函数,并且加入函数中.需要修改源代码. def logger() ...

  4. vc6开发一个抓包软件_开发一个软件多少钱?3种软件开发公司报价

    开发一个软件多少钱?现在随着智能手机的发展,各种各样的app大受市场欢迎,同时也方便了大家日常生活,开发一个自己的app软件成为不少传统企业及创业者的首选.但是如何选择靠谱的开发公司呢?同样的app开 ...

  5. python是什么软件-软件开发是什么?

    原标题:软件开发是什么? 小白同学想学软件开发,却不知道软件开发都在开发什么. 软件开发就是根据用户要求建造出软件系统或者系统中的软件部分的过程. 一般是用某种程序设计语言来实现的软件开发的,像Jav ...

  6. 百万年薪python之路 -- 软件的开发规范

    一. 软件的开发规范 什么是开发规范?为什么要有开发规范呢? 你现在包括之前写的一些程序,所谓的'项目',都是在一个py文件下完成的,代码量撑死也就几百行,你认为没问题,挺好.但是真正的后端开发的项目 ...

  7. Python开发多媒体管理软件实现方法

    软件开发环境 python 3.7.3 pycharm Community 2020 PYQT5 教师端控制界面 下拉列表显示全部已经连接的客户端ip地址 对选中的设备进行查看设备信息,重启电脑,关闭 ...

  8. 2019经济寒冬,软件定制开发公司的竞争力在哪里??

    都说2019是"经济寒冬",那么,2019年软件市场情况如何呢? 目前,随着越来越多软件服务商不断涌现,导致软件市场竞争也越来越激烈,软件服务商对业务的需求也在不断增加.同时,企业 ...

  9. 一个软件公司需要多少前端_开发APP软件需要多少钱?

    简介:开发APP软件需要多少钱?很多人不太理解,为什么做一个在手机上买东西的app,就像网站一样,找人外包开发价格怎么要花十几万?app开发成本是如何计算的?到底需要多少钱呢?app的开发价格并没有一 ...

  10. Python的IDE:基于Eclipse/MyEclipse软件的PyDev插件配置python的开发环境(不同python项目加载不同版本的python)—从而实现Python编程图文教程之详细攻略

    Python的IDE:基于Eclipse/MyEclipse软件的PyDev插件配置python的开发环境(不同python项目加载不同版本的python)-从而实现Python编程图文教程之详细攻略 ...

最新文章

  1. Opencv 基础 MatOfByte创建和byte数组
  2. 【Android 逆向】类加载器 ClassLoader ( 类加载时机 | 隐式加载 | 显示加载 | 类加载步骤 | 装载 | 链接 | 初始化 )
  3. hibernate的一种报错
  4. boost::python::upcast的测试程序
  5. 埃森哲携手阿里云,采用K8s容器云服务为客户提供无限弹性
  6. 使用html-table模块生成html格式
  7. Thinkphp5.1整合支付宝APP支付
  8. 小甲鱼第45课 魔术方法 简单定制
  9. java转换中文日期格式_java 转换日期格式的方法
  10. chrome设置微信ua_模拟UA实现访问只能在微信上打开的网页
  11. <img>标签中alt属性和title属性的区别
  12. 盘点史上最危险的10种创业合伙人
  13. 行而不辍,未来可期|云扩科技入选上海市专精特新企业
  14. CentOS7 搭建企业级NFS网络文件服务器
  15. HTML5汽车网页设计成品_学生DW汽车静态网页设计代做_web课程设计网页制作_宽屏大气汽车自驾游网站模板html源码
  16. 云时代下最强的“管理驾驶舱”制作方法,你学会了吗?
  17. Android 10.0 SystemUI下拉状态栏UI定制化开发系列(八)
  18. 自动交易程序介绍——普通个人和团队如何快速上手量化
  19. 大家觉得有哪些聊天软件比较适合
  20. 机器学习--数据清洗

热门文章

  1. 状态模式的介绍及状态机模型的函数库javascript-state-machine的用法和源码解析
  2. MediaPlayer loading 问题解决
  3. Python 获取接口数据,解析JSON,写入文件
  4. PHP array_combine
  5. PHP获取页面执行时间的方法
  6. 团队项目第一阶段冲刺站立会议04
  7. 连接sql sever2008数据库出现了无法连接到数据库引擎问题解决
  8. 帝国cms让当前栏目显示不同样式(图文)
  9. How to open robotium-solo-1.4.0 javadoc.jar to get the information of robotium.
  10. python中的in运算符