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的组件。
![](https://img.kancloud.cn/a1/93/a193d093f7958332eccbbfffa47c460a_1387x709.png)
基于Python的BDD框架很多, 到目前使用比较多的应该是pytest-bdd和Behave, pytest-bdd的优势是基于 pytest,可以整合单元测试和功能测试。关于pytest-bdd的介绍可以参考:
[pytest-bdd快速示例和问题解决](https://blog.csdn.net/oscar999/article/details/134388175)
## 环境准备:安装 behave 和 selenium
本篇的示例需要安装两个模块 behave 和 selenium,其中selenium是用于Web端自动化测试的,因为本篇使用behave和selenium进行一个百度页面搜索的测试。
### 关于Selenium
Selenium是一个自动化测试工具,可以用于测试Web应用程序,支持多种语言(Java、C#、Python等)。Selenium可以模拟用户在网页上的行为,如点击、填写表单等操作,自动化地进行测试,从而提高测试效率和准确性。Selenium的核心是WebDriver,它可以驱动各种浏览器进行测试,并提供了丰富的API接口,方便管理和执行测试用例。Selenium还支持分布式测试、并行测试和测试结果的自动化分析等功能,可用于单元测试、集成测试和系统测试等场景。由于Selenium的开源和广泛应用,有很多社区和第三方库支持,可方便地应用于不同的项目和环境。
### 安装扩展
可以使用 `pip show behave` 和 `pip 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 关键词 behave
When 打开百度页面
And 输入关键词
And 点击百度一下按钮
Then 页面标题中应包含关键词
```
2. 场景步骤 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 测试框架来执行测试用例并输出结果
3. 命名行切换到 features目录, 运行 `behave `命令。
测试的时候会新开一个Chrome窗口, 打开baidu的网址,在搜索框自动输入 behave, 严重完成关闭窗口, 在控制台会打印测试的步骤以及测试的结果。
![](https://img.kancloud.cn/64/97/6497824f01db51a0cf3f3e6e59ed2676_593x119.png)
在执行 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](https://github.com/behave/behave)
* Allure官方文档 :[https://docs.qameta.io/allure/#_behave](https://docs.qameta.io/allure/#_behave)
* [https://cucumber.io/docs/installation/?sbsearch=python](https://cucumber.io/docs/installation/?sbsearch=python)
*****
*****
- 前言
- 1.入门篇
- Python介绍
- 安装与使用
- Python开发利器之VS Code
- 模块安装
- 命令行
- 一次Python无法安装模块的问题探索与解决之旅
- 命令运行
- Conda
- 下载地址
- 2.基础篇
- 基础语法
- 输入与输出
- with as的用法
- 注释
- Python命令行参数
- 编码
- 变量类型
- 列表遍历
- 运算符
- 表达式语句
- 条件
- 循环
- 日期和时间
- 函数
- 高级语法
- @符号-装饰器
- 模块和包
- name
- init.py
- 错误和异常
- 面向对象
- 3.专题篇
- 常用功能
- Python 字符串连接
- python web
- Python CGI编程
- Python OAuth2
- 认证 Flask-HTTPAuth
- 常用命令
- 内置函数
- dir()
- print(f)
- 标准模块
- sys
- pickle-数据序列化
- os
- IO(输入输出)
- 键盘输入
- 文件读写
- 测试
- Python测试框架之pytest快速入门
- pytest-bdd快速示例和问题解决
- 基于pytest-bdd的项目目录结构和命名规范
- python BDD 的相关概念
- Behave介绍和快速示例
- Python BDD之Behave测试报告
- Python BDD 框架比较之 pytest-bdd vs behave
- pytest进阶
- Flask + pytest测试
- 参考网址
- pytest-bdd进阶
- hehave进阶
- 测试路径
- python + selunium
- HTML 根据多层CSS 查找元素
- 等待执行
- 使用text 查找 span
- pytest如何在控制台输出
- 4.问题篇
- pip pip3 及区别
- TypeError: can only concatenate str (not "NoneType") to str
- 5.实战篇
- matplotlib-绘图包
- 导入类
- 命名规范
- 模块查找
- 6.进阶篇
- Flask
- Flask介绍
- Flask扩展模块
- Flask-Login
- 问题
- Jinja2
- Flask-RESTful
- Flask-JWT-Extended
- WSGI
- Flask-SQLAlchemy
- 部署
- Flask VS Django
- Flask Web
- Flask + Vue
- Flask实战
- Flask 标准目录结构
- Blueprints
- 参考
- FastAPI 测试
- https 证书 Caused by SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate