Behave介绍和快速示例

Behave是一个用于行为驱动开发 (Behavior-Driven Development, BDD) 的 Python 库。使用 Behave,可以编写自然语言格式的使用场景来描述软件的行为,然后用 Python 实现这些场景下的步骤,形成可直接运行的测试。

Behave的目标是帮助用户、开发人员和QA人员通过让他们写出更易于理解的测试用例来更好地理解和构建软件产品。Behave使用Gherkin语言来编写测试用例,该语言是一种自然语言,易于理解,并且可以很好地与非技术人员共享和交流测试结果。

Behave提供了一种将业务逻辑和测试逻辑分离的方法,因此它可以使测试代码更加可读,可维护和可重用。Behave支持多种输出格式,包括HTML,JSON和JUnit XML,并且可以与Selenium等其他Python测试框架结合使用。

Behave在Python BDD中的地位

BDD的框架中最流行的当属 Cucumber 了,作为描述BDD的领域特定语言(DSL)Gherkin ,一开始就是开发给Cucumber使用的,Cucumber官方提供了很多语言的支持,包括Java,Node.js , Ruby 等。
Cucumber没有直接提供Python语言的库,官方推荐使用半官方的库 Behave, 所谓半官方就是不是 Cucumber官方开发和维护, 但是使用了Cucumber的组件。
在这里插入图片描述

基于Python的BDD框架很多, 到目前使用比较多的应该是pytest-bdd和Behave, pytest-bdd的优势是基于 pytest,可以整合单元测试和功能测试。关于pytest-bdd的介绍可以参考:
pytest-bdd快速示例和问题解决

环境准备:安装 behave 和 selenium

本篇的示例需要安装两个模块 behave 和 selenium,其中selenium是用于Web端自动化测试的,因为本篇使用behave和selenium进行一个百度页面搜索的测试。

关于Selenium

Selenium是一个自动化测试工具,可以用于测试Web应用程序,支持多种语言(Java、C#、Python等)。Selenium可以模拟用户在网页上的行为,如点击、填写表单等操作,自动化地进行测试,从而提高测试效率和准确性。Selenium的核心是WebDriver,它可以驱动各种浏览器进行测试,并提供了丰富的API接口,方便管理和执行测试用例。Selenium还支持分布式测试、并行测试和测试结果的自动化分析等功能,可用于单元测试、集成测试和系统测试等场景。由于Selenium的开源和广泛应用,有很多社区和第三方库支持,可方便地应用于不同的项目和环境。

安装扩展

可以使用 pip show behavepip show selenium 查看是否安装了这两个模块,如果没有安装,使用如下命令进行安装:

pip install behave
pip install selenium

测试示例和目录结构

目录结构其实没有特别的要求,这里遵循易于管理的原则,定义目录结构如下:

├────features/   # 用户场景│    ├────baidu.feature # 用户规格
│    ├────steps│    │    ├────test_baidu.py  # 步骤函数

步骤

这里的步骤很简单,包括三步:

  1. 编写场景文件。在“features”的目录下创建后缀名为.feature文件,描述测试情景。
  2. 编写场景步骤。
  3. 测试。

测试场景与代码文件

这里测试在百度上进行搜索的功能, 各文件的内容如下:

  1. 场景文件 baidu.feature
Feature: 百度搜索Scenario: 搜索关键词Given 关键词 behaveWhen 打开百度页面And  输入关键词And  点击百度一下按钮Then 页面标题中应包含关键词
  1. 场景步骤 test_baidu.py
from behave import given, when, then
from selenium import webdriver
from time import sleep@given('关键词 {keyword}')    # 对应步骤  Given 关键词 behave, 参数放在{}中
def step_impl(context, keyword):   # context是上下文对象,有参数的话,加上对应参数context.keyword = keyword  # 将参数绑定上下文对象,以便其他步骤使用@when('打开百度页面')
def step_impl(context):context.driver = driver = webdriver.Chrome()  # 同样绑定上下文对象driver.implicitly_wait(10)driver.get('https://www.baidu.com')@when('输入关键词')
def step_impl(context):context.driver.find_element('id', 'kw').send_keys(context.keyword)@when('点击百度一下按钮')
def step_impl(context):context.driver.find_element('id', 'su').click()sleep(0.5)@then('页面标题中应包含关键词')
def step_impl(context):assert context.keyword in context.driver.title

整个测试用例包含四个步骤:

  1. 给定关键词:用 @given 装饰器定义了一个关键词的步骤,传入一个参数 keyword,将其保存到 context 对象中,以便后续步骤可以使用。

  2. 打开百度页面:用 @when 装饰器定义了一个打开页面的步骤,创建了一个 Chrome 浏览器并打开百度首页。

  3. 输入关键词:用 @when 装饰器定义了一个输入关键词的步骤,找到页面上的搜索框并输入之前给定的关键词。

  4. 点击百度一下按钮,用 @when 装饰器定义了一个点击按钮的步骤,找到页面上的搜索按钮并点击。

  5. 页面标题中应包含关键词:用 @then 装饰器定义了一个标题验证的步骤,验证页面标题是否包含之前给定的关键词。

在 Behave 中,“given-when-then”是常用的测试步骤流程模式,用来描述测试场景和测试步骤,其中 given 表示给定前置条件,when 表示触发动作,then 表示验证结果。整个测试用例包含了完整的测试步骤和断言,可通过运行 Behave 测试框架来执行测试用例并输出结果

  1. 命名行切换到 features目录, 运行 behave 命令。

测试的时候会新开一个Chrome窗口, 打开baidu的网址,在搜索框自动输入 behave, 严重完成关闭窗口, 在控制台会打印测试的步骤以及测试的结果。
在这里插入图片描述

在执行 Behave 测试用例后,Behave 会自动输出测试结果,结果包括了测试用例总数、通过数和失败数等信息。一个典型的 Behave 测试结果如下所示:

 复制插入1 feature passed, 0 failed, 0 skipped
1 scenario passed, 0 failed, 0 skipped
4 steps passed, 0 failed, 0 skipped, 0 undefined
Took 0m3.204s
复制插入

其中,feature 表示测试用例模块数量,scenario 表示测试用例数量,steps 表示测试步骤数量,未定义的步骤表示测试用例中定义了但未实现或未完成的步骤。如果测试用例执行失败,会在结果中输出失败信息,包括具体的失败原因和错误堆栈等。在 Behave 中,测试结果可通过各种格式的报告来生成,如HTML、JSON、XML等。比如结合allure 生成更易阅读的测试报告,报告的格式可以是JSON 格式,也可以是在线的Web网页。

参考

  • https://github.com/behave/behave
  • Allure官方文档 :https://docs.qameta.io/allure/#_behave
  • https://cucumber.io/docs/installation/?sbsearch=python


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/144409.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【入门Flink】- 09Flink水位线Watermark

在窗口的处理过程中,基于数据的时间戳,自定义一个“逻辑时钟”。这个时钟的时间不会自动流逝;它的时间进展,就是靠着新到数据的时间戳来推动的。 什么是水位线 用来衡量事件时间进展的标记,就被称作“水位线”&#x…

你不懂API接口是什么?怎么和程序员做朋友

说到开发平台就一定离不开接口,作为PM,我们不需要对接口了解的特别细。只需要知道接口是什么,有什么用,有哪些要素就行。 1. 接口是什么 (1) 硬件接口 生活中我们经常会接触接口,最常见的就是HDMI接口和USB接口&…

计算机毕业设计选题推荐-公共浴池微信小程序/安卓APP-项目实战

✨作者主页:IT毕设梦工厂✨ 个人简介:曾从事计算机专业培训教学,擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…

我这些年对于自动化测试的理解

📢专注于分享软件测试干货内容,欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!📢交流讨论:欢迎加入我们一起学习!📢资源分享:耗时200小时精选的「软件测试」资…

环境配置 | Git的安装及配置[图文详情]

Git是一个开源的分布式版本控制系统,可以有效、高速地处理从小到大的项目版本管理。下面介绍了基础概念及详细的用图文形式介绍一下git安装过程. 目录 1.Git基础概念 2.Git的下载及安装 3.常见的git命令 Git高级技巧 Git与团队协作 1.Git基础概念 仓库&#…

沉浸式航天vr科普馆VR太空主题馆展示

科普教育从小做起,现在我们的很多地方小孩子游乐体验不单单只有草坪玩耍体验,还有很多科普知识的体验馆和游玩馆。虽然现在我们还不能真实的上太空或者潜入海底,但是这些现在已经可以逼真的展示在我们面前。通过一种虚拟现实技术手段。人们带…

在3+1的方向上展开结构加法4a3+4a14

4a3 4a14 - - 1 - - - - - - - - - - - - - 1 1 1 - 1 1 - 1 - - 1 - - - 要求得到的图片只能有4个点,并且需要最大限度的保留4a3和4a14两张图片的内在结构特征。 4个点的结构总可以认为是3个点的结构1合成的 - - 1 - - …

只使用JS怎么给静态页面网站添加站内全局搜索功能?

💂 个人网站:【 海拥】【神级代码资源网站】【办公神器】🤟 基于Web端打造的:👉轻量化工具创作平台💅 想寻找共同学习交流的小伙伴,请点击【全栈技术交流群】 背景 静态页面通常由HTML、CSS 和 JavaScript…

酷开系统 酷开科技,将家庭娱乐推向新高潮

在当今数字化时代,家庭娱乐已经成为人们日常生活中不可或缺的一部分。如果你厌倦了传统的家庭娱乐方式,想要一种全新的、充满惊喜的娱乐体验,那么,不妨进入到酷开科技的世界,作为智能电视行业领军企业,酷开…

销售管道管理软件推荐:提升销售业绩与效率

在企业中销售部门扮演着锐意进取的尖刀部队的角色,肩负着拓展公司发展领土的重要责任。销售管理是一个漫长而复杂的过程,需要经历潜在的商机、联系跟进、签订合同以及赢得订单等关键里程碑,无论是面向C端用户的销售还是面向企业复杂产品的销售…

使用jmeter+ant进行接口自动化测试(数据驱动)

本次接着介绍如何利用apache-ant执行测试用例并生成HTML格式测试报告 ①下载安装 apache-ant-1.9.9,配置环境变量 如下方式检验安装成功 ②安装好ant后,把jmeter中extras目录下的ant-jmeter-1.1.1.jar 文件copy到ant安装目录下的lib文件夹中 ③配置ant…

【cfeng-work】架构演进和漫谈

架构漫谈和入门 内容管理 intro分层架构MVC模式分层架构大数据时代的复杂架构 前端架构后端架构运维端架构持续演进变化 本文主要是自己接触架构的一些输出漫谈 cfeng 在work中某次负责了后端一个服务的上线,多个模块一起上,结果上线失败,幸运…

【MySQL】数据库——库操作

文章目录 1. 创建数据库[IF NOT EXISTS] 的使用 2. 删除库3. 数据库的编码问题查看系统默认支持的字符集查看系统默认支持的校验集只查看 database的校验集指定编码创建数据库修改字符集修改校验集验证规则对数据库的影响utf8_general_ci ——不区分大小写utf8_bin ——区分大小…

什么是会话固定以及如何在 Node.js 中防止它

什么是会话固定以及如何在 Node.js 中防止它 在深入讨论之前,我们需要了解会话是什么以及会话身份验证如何工作。 什么是会话? 正如我们所知,HTTP 请求是无状态的,这意味着当我们发送登录请求时,并且我们有有效的用…

智能售货柜:小本投资的不二之选

智能售货柜:小本投资的不二之选 智能售货柜的运营优势在于:一是降低运营成本,不需要大量员工;二是具备自动识别和智能结算功能,提高运营效率;三是提供数据分析,优化产品和服务。相比传统零售店&…

教育案例分享 | 安全狗云安全体系为高校提升立体化纵深防御能力

一、客户情况 某高校有服务器500台,对外站点200个,核心交换流量20G。 二、客户痛点 校园网系统分类较多,并且每类网站中安全级重要程度又各不相同,同时有多个网络出口(如:教育网、电信网、移动网等),二级学…

论文阅读——RetNet

transformer的问题:计算量大,占用内存大,不好部署。 所以大家在找能解决办法,既能和transformer表现一样好,又能在推理阶段计算复杂度很低。 这些方法大概分类三类:一是代替transformer非线性注意力机制的…

【Linux】文件系统中inode与软硬链接以及读写权限问题

文章目录 前言一、 简单理解文件系统二、文件操作具体步骤1.新建文件2.删除文件3.查找文件 三、目录的重新理解1.目录下没有w权限,无法对其下的文件进行创建与删除2.目录下没有r权限,无法对其下的文件进行查看3.目录下没有x权限,无法进入这个…

内网Jenkins 部署.net(dotnet)项目

一、前置条件 内网部署Jenkins,并安装好所需插件 此篇内容需承接内网搭建Jenkins自动化远程部署项目到Windows服务器_jenkins内网安装-CSDN博客 ,才更好操作与理解 二、在Jenkins中创建项目 三、配置项目 General Source Code Management Build Envi…

Docker - 容器数据卷

Docker - 容器数据卷 什么是容器数据卷 等同于挂载,将容器内的目录地址指向于宿主机文件系统中 直接使用命令来挂载 -v docker run -it -v 主机目录:容器内目录# 测试 docker run -it -v /root:/home centos /bin/bash [rootiZ2zeg7mctvft5renx1qvbZ ~]# docker …