• 10
  • 10
分享

       行为驱动开发英文名为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 / Slovaksr-Cy
rl: Српски / Serbiansr-La
tn: 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.搭建工程结构

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

 1.png

       说明:

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 timefrom 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"和密码"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 输入邮箱地址"tynam@test.com"和密码"123"并且登录 # steps/login_steps.py:19 3.408s
    Then 登录成功                               # steps/login_steps.py:34 1.008s1 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 -fallure_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所示。

2.png

        使用命令将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所示。

3.png

       打开index.html查看生成的测试报告,如图11-5所示。

4.png


作者:Tynam.Yang

原文链接:https://www.cnblogs.com/tynam/p/13441495.html

  • 【留下美好印记】
    赞赏支持
登录 后发表评论
+ 关注

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          •   从手工测试到自动化测试,是一个人的兵荒马乱,也是人生的新起点!  以前做软件测试感觉很枯燥无聊,就像流水线一样按照流程要求去做,传统软件测试行业也是以“点点点”的手工测试为主,加上国内软件公司不注重测试,受制于大环境影响等也就给了大众一种测试人员虽然身处IT行业,却是毫无技术可言的工种。到了如今,时代真的变了,最直观的表现莫过于大厂测试人员占比越来越高,甚至测试人员已经超过了开发人员,其次就是招聘要求的提高,越来越要求测试人员拥有七十二变的能力。而在这其中,自动化测试能力是现在手工测试迈向更高技术岗位的必经之路。  大家好,我是狼图腾,我又来了,从3月初到现在,我从视频会议转岗到智能驾驶已...
            0 0 898
            分享
          • 使用说明:http://quan.51testing.com/pcQuan/lecture/97开源项目地址: https://gitee.com/samllpig/SafeTool-51testing (谢谢大家点亮star)安全测试工具架构:安全测试工具v1.2版本更新内容:请求拦截功能,支持多个请求拦截   2. 响应拦截功能动图比较大,可以再git上看说明文档 https://gitee.com/samllpig/SafeTool-51testing
            3 3 3359
            分享
          • 前言有位同事曾经很认真地问过我一个问题。他说他现在从事软件测试工作已经4年了,但是他不知道现在的工作和自己在工作3年时有什么不同,此外他还想知道他做软件测试工作到第5年或第6年会怎么样。后来他在工作到第5年的时候转岗了。虽然他已经转岗了,后来联系时他又问了我这个问题,似乎这个问题困惑他很深、很久了。这件事情对我的触动很大,我相信这个问题是带有一定普遍性的。软件测试是一个缺乏发展空间、做到一定阶段后只能通过 “转岗” 来寻找发展机会的职业吗?肯定不是。Martin Pol, 欧洲业界公认的“ Test Guru” (大佬,精神领袖),1998 年欧洲第一届杰出测试贡献奖获得者,并获得英国骑士勋章...
            12 12 1474
            分享
          • 背景与问题接口,解决了从协议发起,到后台业务逻辑的测试,但是忽略了重要的部分:前端展现和交互。我们需要通过自动化回归测试,来解决端到端测试的问题,即从客户端发起到服务端完成,整个业务落成,而不仅仅是服务端的功能。界面自动化,聚焦于界面业务逻辑和交互测试,对于海量的数据组合测试,不是重点目标。当前端界面、业务逻辑发生改变,就需要通过界面自动化回归测试,来解决系统回归和覆盖的问题。自动化测试是未来发展的趋势录制回放工具与测试脚本通过录制来生成自动化的测试脚本:对象库:基于脚本与对象库分离参数化:对脚本进行参数化,可以实现相同的脚本执行不同的数据和测试用例测试脚本:定义了整个的测试过程。使用关键字视...
            14 14 1498
            分享
          • 说到测试计划相信很多小伙伴进入这行的时候对这个并不陌生,但是要针对一个项目做一个完整的测试计划却不是那么简单,因为我们在测试之前我们首先要针对一个项目的了解,还有项目每个需求的分析,还要进行评审等等一系列的准备工作,所以在测试之前,我们要做好很多前奏工作,确保在测试过程中不会遗漏掉本该要发现的问题,所以本次编辑这篇文章主要是针对测试计划做的一套流程讲解,希望对同行的小伙伴有一定的帮助。一、测试计划的目的(1)为测试各项活动制定一个现实可行的、综合的计划,包括每项测试活动的对象、范围、方法、进度和预期结果。(2)为项目实施建立一个组织模型,并定义测试项目中每个角色的责任和工作内容。(3)开发有效...
            15 15 1417
            分享
      • 51testing软件测试圈微信