行为驱动开发英文名为Behave Driven Development,简称BDD,是一种敏捷开发方法,主要是从用户的需求出发强调系统行为。将此模型借鉴到自动化测试中称其为行为驱动测试模型,它是一种通过使用自然描述语言确定自动化测试脚本的模型。也就是说,用例的写法基本和功能测试用例的写法类似,具有良好协作的益处。这种测试模型使每个人都可以参与到行为开发中,而不仅仅是程序员。每个测试场景都是一个独立的行为,以避免重复,并且已有的行为可以重复使用。

目前在Python中最流行的 BDD 框架是Behave(这也是我们本节要讲解的重点),它与其他基于 Gherkin 的 Cucumber 框架非常相似,当然还有其他BDD框架,比如pytest-bdd和radish等。

1、安装Behave

Behave是Python语言的一个库,在使用时需要导入行为库Behave,可以使用Python的导入第三方库命令安装Behave,即pip install behave。

C:\Users\TynamYang>pip install behave
Collecting behave
Downloading https://files.pythonhosted.org/packages/a8/6c/ec9169548b6c4cb877aaa6773408ca08ae2a282805b958dbc163cb19822d/behave-1.2.6-py2.py3-none-any.whl (136kB)
100% |██████████████████████████████████| 143kB 139kB/s
Requirement already satisfied: six>=1.11 in c:\users\tynamyang\appdata\local\programs\python\python37-32\lib\site-packages (from behave) (1.13.0)
Collecting parse-type>=0.4.2
Downloading https://files.pythonhosted.org/packages/1b/81/2a168b41acb57f1ea8e1e09937f585a0b9105557b13562ff8655fea81c09/parse_type-0.5.2-py2.py3-none-any.whl
Collecting parse>=1.8.2
Downloading https://files.pythonhosted.org/packages/4a/ea/9a16ff916752241aa80f1a5ec56dc6c6defc5d0e70af2d16904a9573367f/parse-1.14.0.tar.gz
Installing collected packages: parse, parse-type, behave
Running setup.py install for parse ... done
Successfully installed behave-1.2.6 parse-1.14.0 parse-type-0.5.2 C:\Users\TynamYang>

安装完成后可以使用命令behave --lang-list查看支持的语言:

C:\Users\TyanmYang>behave --lang-list
Languages available:
ar: العربية / Arabic
bg: български / Bulgarian
ca: català / Catalan
cs: Česky / Czech
cy-GB: Cymraeg / Welsh
da: dansk / Danish
de: Deutsch / German
en: English / English
en-Scouse: Scouse / Scouse
en-au: Australian / Australian
en-lol: LOLCAT / LOLCAT
en-pirate: Pirate / Pirate
en-tx: Texan / Texan
eo: Esperanto / Esperanto
es: español / Spanish
et: eesti keel / Estonian
fi: suomi / Finnish
fr: français / French
gl: galego / Galician
he: עברית / Hebrew
hr: hrvatski / Croatian
hu: magyar / Hungarian
id: Bahasa Indonesia / Indonesian
is: Íslenska / Icelandic
it: italiano / Italian
ja: 日本語 / Japanese
ko: 한국어 / Korean
lt: lietuvių kalba / Lithuanian
lu: Lëtzebuergesch / Luxemburgish
lv: latviešu / Latvian
nl: Nederlands / Dutch
no: norsk / Norwegian
pl: polski / Polish
pt: português / Portuguese
ro: română / Romanian
ru: русский / Russian
sk: Slovensky / Slovak
sr-Cyrl: Српски / Serbian
sr-Latn: Srpski (Latinica) / Serbian (Latin)
sv: Svenska / Swedish
tr: Türkçe / Turkish
uk: Українська / Ukrainian
uz: Узбекча / Uzbek
vi: Tiếng Việt / Vietnamese
zh-CN: 简体中文 / Chinese simplified
zh-TW: 繁體中文 / Chinese traditional
C:\Users\TyanmYang>

在编写测试用例时需要依靠这些关键字,下面会做具体说明。

2、Behave的使用

我们以登录页面为例说明Behave的使用。因为行为驱动模型主要在国外运用,国内使用的还比较少,所以本节只做成功登录测试的示例演示。

1.搭建工程结构

首先,搭建一个基本的行为驱动工程结构,如图所示。

说明:

l  features:存放场景文件。

l  steps:features目录下场景 .feature文件对应的执行文件。

l  environment.py:环境配置文件。

l  report:存放测试报告文件。

l  result:存放测试数据JSON文件。

工程中各个目录的作用将会在下文做具体说明。

2.编写feature文件

在features目录下新建login. feature文件,作为登录场景测试用例,在文件中编写测试用例。

根据登录的操作步骤,测试用例可写成如下的形式:

Feature: 登录功能测试

    Scenario: 进入登录页面
When 打开登录页面【url】
Then 进入登录页面 Scenario: 用户成功登录
When 输入邮箱地址【邮箱地址】和密码【密码】并且登录
Then 登录成功

上面示例中用到的关键字说明如下:

l  Feature:功能测试名称

l  Scenario:场景名称

l  When:可以理解为测试步骤

l  Then:预期结果

在测试场景中经常还会用到given(测试前提条件)和and(测试步骤和when类似)关键字。上面示例中的【url】、【邮箱地址】和【密码】是动态变化的,所以需要以参数的形式传入。

3.配置enviroment.py文件

environment.py文件主要用来定义一些测试执行前后的操作,比如启动和退出浏览器,类似于单元测试框架里的测试前置条件setUp和测试销毁tearDown。例如,before_step(context, step) 和after_step(context, step) 是在每一个测试步骤之前和之后执行一次;before_scenario(context, scenario)和after_scenario(context, scenario) 是在每一个测试场景之前和之后执行一次;before_feature(context, feature)和after_feature(context, feature)是在每一个测试feature文件之前和之后执行一次;before_all(context) 和after_all(context) 是在所有的测试之前和之后执行一次。

针对本示例,在测试feature文件之前和之后添加预置条件和测试销毁内容。使用方法before_feature(context, feature) 添加测试用例执行前的操作,使用方法after_feature(context, feature) 添加测试用例执行后的操作。

# -*- coding: utf-8 -*-

from selenium import webdriver

def before_feature(context, feature):
context.driver = webdriver.Chrome()
context.driver.maximize_window() def after_feature(context, feature):
context.driver.quit()

上述代码,将浏览器启动并且最大化放在测试用例执行前的方法before_featrue中,将退出浏览器放在测试用例执行后的方法after_featrue中。在函数中有一个参数context,用于存储信息以及在不同的step中分享信息,可以理解为超级全局变量。 context在given、when和then三个level中都会运行,并且由Behave自动管理。

4.编写steps

在steps目录下新建login_steps.py文件,用于存放登录页面的操作,且所有的测试steps都必须放在steps目录下,命名没有要求。steps是通过修饰符来进行匹配的,修饰符是一串字符串,如果feature文件中scenario下使用的关键字和字符串与steps中某一个step关键字和字符串一致,则执行对应的step下的函数。

如下代码定义了打开登录页面{url}、进入登录页面、输入邮箱地址{email}和密码{password}并且登录,登录成功4个step,与feature文件中操作步骤的语言字符串相匹配。

# -*- coding: utf-8 -*-

import time
from behave import * @When('打开登录页面"{url}"')
def step_open(context, url):
context.driver.get(url)
time.sleep(10) @Then('进入登录页面')
def step_assert_open(context):
title = context.driver.title
assert title == "第一个项目" @When('输入邮箱地址"{email}"和密码"{password}"并且登录')
def step_login(context, email, password):
time.sleep(1)
email_element = context.driver.find_element_by_id('email')
email_element.send_keys(email) time.sleep(1)
password_element = context.driver.find_element_by_name('password')
password_element.send_keys(password) time.sleep(1)
login_button_element = context.driver.find_element_by_id('btn-login')
login_button_element.click() @Then('登录成功')
def step_assert_login(context):
time.sleep(1)
login_text = context.driver.switch_to.alert.text
assert login_text == "登录成功"

修饰符@given、@when、@then下的方法名以step_xxx命名方式实现,传递参数以大括号{参数名}来表示,当然还可以使用正则表达式来匹配。

根据steps的操作修改feature文件,给对应的参数赋值,结果如下:

Feature: 登录功能测试

    Scenario: 进入登录页面
When 打开登录页面" http://localhost:63342/projectAutoTest/projectHtml/chapter1/period2/index.html"
Then 进入登录页面 Scenario: 用户成功登录
When 输入邮箱地址"tynam@test.com"和密码""并且登录
Then 登录成功

3、运行

在命令行模式下进入到BddTest目录,直接运行behave命令,结果如下:

C:\Users\TynamYang\BddTest>behave
Feature: 登录功能测试 # login.feature:1 Scenario: 进入登录页面 # login.feature:3
When 打开登录页面"http://localhost:63342/projectAutoTest/projectHtml/chapter1/period2/index.html" # steps/login_steps.py:7 10.403s
Then 进入登录页面 # steps/login_steps.py:13 0.011s Scenario: 用户成功登录 # login.feature:7
When 输入邮箱地址"tynam@test.com"和密码""并且登录 # steps/login_steps.py:19 3.408s
Then 登录成功 # steps/login_steps.py:34 1.008s 1 feature passed, 0 failed, 0 skipped
2 scenarios passed, 0 failed, 0 skipped
4 steps passed, 0 failed, 0 skipped, 0 undefined
Took 0m14.830s
C:\Users\TynamYang\BddTest>

从运行结果中可以看出:

(1)测试功能Feature以及测试场景Scenario和测试步骤When、Then。

(2)测试每一步骤的耗时时间,总的耗时时间。

(3)每一个行代码在哪个文件中的哪一行。

(4)测试结果统计,即feature、scenarios、steps通过、失败及跳过。

以上内容来源于《Python Web自动化测试入门与实战,从入门到入行》第11章第七节

读书购买地址:https://item.jd.com/12656245.html

行为驱动模型-Behave的更多相关文章

  1. 【tornado】系列项目(二)基于领域驱动模型的区域后台管理+前端easyui实现

    本项目是一个系列项目,最终的目的是开发出一个类似京东商城的网站.本文主要介绍后台管理中的区域管理,以及前端基于easyui插件的使用.本次增删改查因数据量少,因此采用模态对话框方式进行,关于数据量大采 ...

  2. Linux中总线设备驱动模型及平台设备驱动实例

    本文将简要地介绍Linux总线设备驱动模型及其实现方式,并不会过多地涉及其在内核中的具体实现,最后,本文将会以平台总线为例介绍设备和驱动程序的实现过程. 目录: 一.总线设备驱动模型总体介绍及其实现方 ...

  3. 【tornado】系列项目(一)之基于领域驱动模型架构设计的京东用户管理后台

    本博文将一步步揭秘京东等大型网站的领域驱动模型,致力于让读者完全掌握这种网络架构中的“高富帅”. 一.预备知识: 1.接口: python中并没有类似java等其它语言中的接口类型,但是python中 ...

  4. usb驱动开发4之总线设备驱动模型

    在上文说usb_init函数,却给我们留下了很多岔路口.这次就来好好聊聊关于总线设备驱动模型.这节只讲理论,不讲其中的函数方法,关于函数方法使用参考其他资料. 总线.设备.驱动对应内核结构体分别为bu ...

  5. linux驱动模型<输入子系统>

    在linux中提供一种输入子系统的驱动模型,其主要是实现在input.c中. 在输入子系统这套模型中,他把驱动分层分类.首先分为上下两层,上层为input.c .下层为驱动的实现,下层分为两部分,一部 ...

  6. linux RTC 驱动模型分析【转】

    转自:http://blog.csdn.net/yaozhenguo2006/article/details/6824970 RTC(real time clock)实时时钟,主要作用是给Linux系 ...

  7. linux 2.6up的设备和设备驱动模型

    在linux2.6 的设备和设备驱动模型构架中,所有的外部设备和驱动程序都挂在总线上 ,总线分为(usb   -- USB设备,PCI  -- PCI 设备 platform --   直接和处理器进 ...

  8. Linux 字符设备驱动模型

    一.使用字符设备驱动程序 1. 编译/安装驱动 在Linux系统中,驱动程序通常采用内核模块的程序结构来进行编码.因此,编译/安装一个驱动程序,其实质就是编译/安装一个内核模块 2. 创建设备文件 通 ...

  9. linux设备驱动模型

    尽管LDD3中说对多数程序员掌握设备驱动模型不是必要的,但对于嵌入式Linux的底层程序员而言,对设备驱动模型的学习非常重要. Linux设备模型的目的:为内核建立一个统一的设备模型,从而又一个对系统 ...

随机推荐

  1. python 装饰器(六):装饰器实例(三)内置装饰器

    内置的装饰器和普通的装饰器原理是一样的,只不过返回的不是函数,而是类对象,所以更难理解一些. @property 在了解这个装饰器前,你需要知道在不使用装饰器怎么写一个属性. def getx(sel ...

  2. C# Dictionary的底层实现解析

    引用: https://www.cnblogs.com/InCerry/p/10325290.html 字典原理分析: 1.用数组存元素,元素的结构体存hashCode.next.key.value. ...

  3. 用CBrother脚本实现smtp协议发送一份邮件

    用CBrother脚本实现smtp协议发送一份邮件 之前用CBrother脚本写了一个拯救“小霸王服务器”的程序,公司人用着都挺好用,但是有时候谁重启了服务器其他人不知道,造成了多人多次重启,每个人都 ...

  4. Ethical Hacking - Web Penetration Testing(9)

    SQL INJECTION Discovering SQLi in GET Inject by browser URL. Selecting Data From Database Change the ...

  5. three.js 数学方法之Vector3

    今天郭先生来说一说three.js的Vector3,该类表示的是一个三维向量(3D vector). 一个三维向量表示的是一个有顺序的.三个为一组的数字组合(标记为x.y和z),可被用来表示很多事物, ...

  6. 线上CUP负载过高排查方法

      1.top命令查看线程占据的CPU 注意:上面行的cpu是多个内核的平均CPU,不可能超过100% 下面的cpu是每个进程实际占用的cpu,可能超过100% 备注:查看多个内核cpu,只需要在输入 ...

  7. Cypress系列(41)- Cypress 的测试报告

    如果想从头学起Cypress,可以看下面的系列文章哦 https://www.cnblogs.com/poloyy/category/1768839.html 注意 51 testting 有一篇文章 ...

  8. springcloud之Eureka注册中心

    参考博客:https://www.cnblogs.com/ityouknow/p/6854805.html 背景: Eureka是Netflix开源的一款提供服务注册和发现的产品,它提供了完整的Ser ...

  9. 3分钟看懂Python后端必须知道的Django的信号机制!

    概念 django自带一套信号机制来帮助我们在框架的不同位置之间传递信息.也就是说,当某一事件发生时,信号系统可以允许一个或多个发送者(senders)将通知或信号(signals)发送给一组接受者( ...

  10. 完成的设备扫描项目的几个关键程序,包括activity之间的转换

    module 的 gradle.build最后三行的compile 是关键dependencies { implementation fileTree(dir: 'libs', include: [' ...