当前位置: 首页 > 科技观察

什么是行为驱动的Python?

时间:2023-03-12 23:52:10 科技观察

使用Pythonbehave框架的行为驱动开发模式,可以帮助您的团队更好地协作和测试自动化。您听说过行为驱动开发(BDD)并想知道它是什么吗?也许你发现团队成员在谈论“小黄瓜”(LCTT译注:“小黄瓜”是一种简单的英文文本语言,工具cucumber对其进行解释以执行测试脚本,见下文),而你却听不懂。也许你是一个Pythonista,一个Pythonista,正在寻找一种更好的方法来测试你的代码。无论如何,理解BDD可以帮助您和您的团队实现更好的协作和测试自动化,而Python的behave框架是一个很好的起点。什么是BDD?在软件中,行为是指功能如何在明确定义的输入、操作和结果场景中运行。产品可以表现出无数种行为,例如:在网站上提交表单搜索所需结果保存文档进行RESTAPI调用运行命令行界面命令开发和测试。BDD的核心是:使行为成为软件开发的重点。通过示例使用语言规范在开发早期定义行为。最常见的行为规范语言之一是Gherkin,Cucumber项目中的Given-When-Then场景格式。行为规范基本上是对行为如何工作的简单语言描述,具有一些用于一致性和重点的正式结构。测试框架可以通过将步骤文本“粘合”到代码实现来轻松地自动化这些行为规范。下面是一个用Gherkin编写的行为规范示例:根据产品的行为定义产品的功能,可以更轻松地描述、开发和测试产品。这就是BDD的核心:让行为成为软件开发的焦点。使用示例规范的语言在开发早期定义行为。最常见的行为规范语言之一是Gherkin,来自Cucumber项目中的Given-When-Then场景格式。行为规范基本上是一种对行为如何工作的简单语言描述,具有一些用于一致性和重点的正式结构。测试框架可以通过将步骤文本“粘合”到代码实现来轻松地自动化这些行为规范。下面是一个用Gherkin编写的行为规范示例:场景:基本DuckDuckGo搜索假设显示DuckDuckGo主页当用户搜索“panda”然后显示“panda”的结果快速浏览一下,行为是直观的。除了少数关键字外,该语言是自由形式的。场景简洁而意味深长。一个真实的例子说明了这种行为。步骤以声明的方式显示应该发生什么——而不会陷入如何操作的细节中。BDD的主要好处是良好的协作和自动化。每个人都可以为行为发展做出贡献,而不仅仅是程序员。从流程一开始就定义并理解预期的行为。测试可以与它们涵盖的功能一起自动化。每个测试都包含一个单一的、独特的行为以避免重复。最后,新的行为规范可以重用现有步骤,从而产生滚雪球效应。Python的behave框架behave是Python中最流行的BDD框架之一。它与其他基于Gherkin的Cucumber框架非常相似,尽管没有正式的Cucumber名称。behave有两个主要层:用Gherkin的.feature文件编写的行为规范用Python模块编写的步骤定义和挂钩以实现Gherkin步骤如上例所示,Gherkin场景具有三部分格式:给定一些初始状态每当(当)行为发生,然后(Then)验证结果当behave运行测试时,每个步骤都通过装饰器“粘合”到Python函数。安装作为先决条件,请确保您的计算机上安装了Python和pip。我强烈建议使用Python3。(我还建议使用pipenv,但以下示例命令使用更基本的pip。)behave框架只需要一个包:pipinstallbehave其他包也可能有用,例如:pipinstallrequests#用于调用RESTAPIpipinstallselenium#用于web浏览器交互GitHub上的behavior-driven-Python项目包含本文示例中使用的那些。Gherkin特性behave框架使用的Gherkin语法实际上符合官方的CucumberGherkin标准。.feature文件包含一个Feature部分,该部分又包含一个带有Given-When-Then步骤的Scenario部分。下面是一个例子:特征:黄瓜篮子作为一名园丁,我想在一个篮子里装很多黄瓜,这样我就不会把它们都掉了。@cucumber-basket场景:添加和移除黄瓜给定篮子是空的当“4”个黄瓜被添加到篮子中并且“6”个黄瓜被添加到篮子中但是“3”个黄瓜被从篮子中移除然后篮子包含“7”黄瓜以下是一些需要注意的重要事项:功能和场景部分两者都有简短的描述性标题。紧跟在功能标题之后的行是被行为框架忽略的注释。将功能描述放在那里是一种很好的做法。场景和功能可以有标签(注意@cucumber-basket标签)用于挂钩和过滤(如下所述)。这些步骤遵循严格的Given-When-Then顺序。可以使用And和But将附加步骤添加到任何类型。步骤可以用输入参数化——注意双引号中的值。场景也可以使用场景大纲编写为具有多个输入组合的模板:特征:黄瓜篮子@cucumber-basket场景大纲:添加黄瓜给定篮子有“”黄瓜当“”黄瓜被添加到thebasket然后篮子包含“”个黄瓜示例:CucumberCounts|initial|more|total||0|1|1||1|2|3||5|4|9|Scenario大纲总是有一个示例表,其中第一行给出列标题,随后的每一行给出一个输入组合。只要列标题出现在尖括号括起来的步骤中,就会替换行值。在上面的示例中,该场景将运行三次,因为有三种输入组合。场景大纲是避免重复场景的好方法。Gherkin语言还有其他元素,但这些是主要机制。有关更多信息,请阅读AutomationPanda文章GherkinbyExample和WritingGoodGher亲属。Python机制的每个Gherkin步骤都必须“粘合”到步骤定义——即提供实现的Python函数。每个函数都有一个带有匹配字符串的步骤类型装饰器。它还接收共享上下文和任何步骤参数。特征文件必须放在名为features/的目录中,步骤定义模块必须放在名为features/steps/的目录中。任何功能文件都可以使用来自任何模块的步骤定义——它们不需要具有相同的名称。下面是一个示例Python模块,其中包含黄瓜篮子功能的步骤定义。frombehaveimport*fromcucumbers.basketimportCucumberBasket@given('篮子里有“{initial:d}”黄瓜')defstep_impl(context,initial):context.basket=CucumberBasket(initial_count=initial)@when('"{some:d}"黄瓜被添加到篮子里')defstep_impl(context,some):context.basket.add(some)@then('篮子里有"{total:d}"黄瓜')defstep_impl(context,total):assertcontext.basket.count==total可以使用三步匹配器:parse、cfparse和re。默认且最简单的匹配器是parse,如上例所示。请注意参数化值是如何被解析并作为输入参数传递给函数的。常见的最佳做法是在步骤中用双引号将参数括起来。每个步骤定义函数还接收一个上下文变量,该变量保存当前运行场景的数据,例如特性、场景和标签字段。还可以添加自定义字段以在步骤之间共享数据。始终使用上下文来共享数据——永远不要使用全局变量!behave框架还支持挂钩来处理Gherkin步骤之外的自动化。挂钩是将在步骤、场景、功能或整个测试套件之前或之后运行的功能。钩子让人想起面向方面的编程。它们应该放在features/目录中的一个特殊的environment.py文件中。钩子函数还可以检查当前场景的标签,因此可以有选择地应用逻辑。以下示例显示了如何使用挂钩为任何标记为@web的场景生成和销毁SeleniumWebDriver实例。fromseleniumimportwebdriverdefbefore_scenario(context,scenario):如果'web'incontext.tags:context.browser=webdriver.Firefox()context.browser.implicitly_wait(10)defafter_scenario(context,scenario):如果'web'incontext.tags:context.browser.quit()注意:夹具也可用于构建和清理。要了解behave项目应该是什么样子,这里是示例项目的目录结构:任何Python包和自定义模块都可以与behave框架一起使用。使用良好的设计模式来构建可扩展的测试自动化解决方案。步骤定义代码应该简洁。运行测试要从命令行运行测试,请切换到项目的根目录并运行behave命令。使用-help选项查看所有可用选项。以下是一些常见的用例:#运行所有测试behave#运行功能文件中的场景behavefeatures/web.feature#运行所有具有@duckduckgo标签的测试behave--tags@duckduckgo#运行所有没有@unit的测试tagbehave--tags~@unit#运行所有具有@basket和@add或@removebehave的测试--tags@basket--tags@add,@remove为方便起见,选项可以保存在配置文件中。其他选项behave并不是Python中唯一的BDD测试框架。其他好的框架包括:pytest-bdd,pytest的一个插件,和behave一样,它使用Gherkin特性文件和步骤定义模块,但它也利用了pytest的所有特性和插件。例如,它可以使用pytest-xdist并行运行Gherkin场景。BDD和非BDD测试也可以使用相同的过滤器执行。pytest-bdd还提供了更灵活的目录布局。radish是一个“Gherkin-enhanced”框架——它为标准的Gherkin语言添加了场景循环和前提条件,这使得它对程序员更加友好。它还提供丰富的命令行选项,例如behave。lettuce是一个较旧的BDD框架,其行为非常相似,但在框架机制上存在细微差别。然而,GitHub最近对该项目的活动很少(截至2018年5月)。这些框架中的任何一个都是不错的选择。另外,请记住,Python测试框架可用于任何黑盒测试,即使是非Python产品!BDD框架非常适合Web和服务测试,因为它们的测试是声明式的,而Python是一种用于测试自动化的出色语言。