行为驱动开发英文名为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 输入邮箱地址"[email protected]"和密码"123"并且登录 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 输入邮箱地址"[email protected]"和密码"123"并且登录 # 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通过、失败及跳过。
4、生成测试报告
Behave库可以很好地与Allure结合生成测试报告,操作也很简单,在本书6.6 Allure测试报告一节中有过详细说明,使用方法都是相同的,在此就不做详细说明。
生成测试报告时需要导入allure-behave,使用pip命令:
pip install allure-behave
使用命令生成JSON格式的测试数据并保存在result目录下,即behave -f allure_behave.formatter:AllureFormatter -o result ./features。
C:\Users\TynamYang\BddTest>behave -f allure_behave.formatter:AllureFormatter -o result ./features 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.876s C:\Users\TynamYang\BddTest>
在result目录下生成JSON数据文件,如图11-3所示。
使用命令将result目录下的JSON格式的测试数据转换成测试报告并且保存在report目录下:allure generate ./result/ -o ./report/ --clean
C:\Users\TynamYang\BddTest>allure generate ./result/ -o ./report/ --clean Report successfully generated to ./report C:\Users\TynamYang\BddTest>
在report目录下生成测试报告文件,如图11-4所示。
打开index.html查看生成的测试报告,如图11-5所示。
以上内容来源于《Python Web自动化测试入门与实战,从入门到入行》第11章第七节
读书购买地址::https://item.jd.com/12656245.html