目录

行为驱动简介

Behave

关键字

使用示例

行为驱动开发case

行为驱动和PO模型结合

执行代码


行为驱动简介

BDD (Behavior-driven development),即行为驱动开发,是一种敏捷开发方法。

将此模型借鉴到自动化测试中称其为行为驱动测试模型,是一种通过使用自然描述语言确定自动化测试脚本的模型。

BDD目的:像说话一样写代码(case)。

Behave

Behave是一个BDD框架。

安装:

pip install behave

关键字

Feature:特性,将多个测试用例集合到一起,对应于unittest中的test suite.

Scenario:场景/情景,用于描述一个用例,对应于unittest中的test case.

Given:假设/如果,用例开始执行前的一个前置条件

When:当,用例开始执行时的一些关键操作步骤

And: 和,一个测试场景中存在多个测试步骤时使用

Then: 那么,验证结果,预期结果。

使用示例

项目简介:

基于框架 Behave+开发语言Python+工具Selenium+断言Pyhamcrest ,以百度搜索为例说明行为驱动测试模型。

Pyhamcrest 安装:

pip install pyhamcrest

行为驱动开发case

工程结构:

说明:

  • features目录:必须存在,且目录名不能修改。
  • search.feature :存放场景文件
  • environment.py: 环境配置文件,初始化环境,包含before_all和after_all两个方法。
  • setps->search.py  和.feature文件对应的描述行为的脚本文件

执行过程:先执行before_all方法,然后执行search.py文件,解析search.feature,最后执行after_all方法。

1. search.feature文件,包含打开百度网页和搜索两个场景。根据搜索的具体操作步骤,测试用例可写成如下形式:

#coding=utf-8
Feature: Baidu SearchThis is my first bdd projectScenario: open baidu websiteWhen I open baidu website "http://www.baidu.com"Then I expect that the page title is "百度"Scenario: search keywordWhen I input search keyword "python"And I click search buttonThen I expect that search result is displayed

2. environment.py文件主要用来定义一些测试执行前后的操作,比如启动和退出浏览器,类似于unittest的setUp和tearDown。

from selenium import webdriver
def before_all(context): #context上下文,承上启下的作用,可理解为一个全局变量context.driver=webdriver.Chrome()def after_all(context):context.driver.quit()

在函数中有一个参数context,用于存储信息以及在不同的step中分享信息,可以理解为超级全局变量。 context在given、when和then三个level中都会运行,并且由Behave自动管理。

3. 在steps目录下新建search.py文件,对应.feature文件中的描述实现代码。

所有的测试步骤都必须放在steps目录下。steps是通过修饰符来进行匹配的,如果feature文件中关键字和描述与steps中某一个修饰符和字符串一致,则执行对应的函数。

from behave import *
import timeuse_step_matcher('re')  #表示使用正则表达式@When('I open baidu website "([^"]*)"') #要跟feature文件中的测试步骤描述保持一致
def step_search(context,url):context.driver.get(url)@Then('I expect that the page title is "([^"]*)"')  #正则表达式:匹配任何字符
def step_search(context,title_name): #title_name对应正则表达式匹配到的字符串title=context.driver.titleassert title_name in title@When('I input search keyword "([^"]*)"')
def step_search(context,keyword):context.driver.find_element_by_id("kw").send_keys(keyword)@When('I click search button')
def step_search(context):context.driver.find_element_by_id('su').click()@Then('I expect that search result is displayed')
def step_search(context):time.sleep(5)element=context.driver.find_element_by_id("1")assert element

行为驱动和PO模型结合

工程结构,如图所示。

说明:

  • features目录:必须存在,且目录名不能修改。
  • search.feature :存放场景文件
  • environment.py: 环境配置文件,初始化环境
  • pases:PO模型封装,base_page.py 定位元素方法封装, search_page.py 操作元素方法封装
  • setps->search.py  和.feature文件对应的描述行为的脚本文件

1. search.features,environment.py文件跟上面一样,未作修改。

2. base_page文件。

class BasePage():def __init__(self,driver):self.driver = driver# 打开网页def get_url(self,url):self.driver.get(url)# 获取页面titledef get_title(self,):return self.driver.title# 定位元素def find_element(self,*loc):return self.driver.find_element(*loc)

3. search_page文件

from features.lib.pages.base_page import BasePage
from selenium.webdriver.common.by import By
class SearchPage(BasePage):def __init__(self,context):super(SearchPage,self).__init__(context.driver)def send_search_key(self,text):self.find_element(By.ID,'kw').send_keys(text)def click_search_btn(self):self.find_element(By.ID,'su').click()def get_search_result(self):return self.find_element(By.ID, '1')

4. search.py文件

from behave import *
import time
from features.lib.pages.search_page import SearchPageuse_step_matcher('re')  #表示使用正则表达式@When('I open baidu website "([^"]*)"') #要跟feature文件中的测试步骤描述保持一致
def step_search(context,url):SearchPage(context).get_url(url)@Then('I expect that the page title is "([^"]*)"')  #正则表达式:匹配任何字符
def step_search(context,title_name): #title_name对应正则表达式匹配到的字符串title=SearchPage(context).get_title()assert title_name in title@When('I input search keyword "([^"]*)"')
def step_search(context,keyword):SearchPage(context).send_search_key(keyword)@When('I click search button')
def step_search(context):SearchPage(context).click_search_btn()@Then('I expect that search result is displayed')
def step_search(context):time.sleep(5)element=SearchPage(context).get_search_result()assert element

执行代码

在命令行模式下进入项目所在目录,输入命令behave。

执行结果如下:

PS E:\selenium\SeleniumPythonBDD> behaveDevTools listening on ws://127.0.0.1:64932/devtools/browser/54feef5f-67be-4026-a485-1369db16ba4d
Feature: Baidu Search # features/search.feature:2This is my first bdd projectScenario: open baidu website                       # features/search.feature:5When I open baidu website "http://www.baidu.com" # features/steps/search.py:7Then I expect that the page title is "百度"        # features/steps/search.py:12Scenario: search keyword                        # features/search.feature:10When I input search keyword "python"          # features/steps/search.py:17And I click search button                     # features/steps/search.py:21Then I expect that search result is displayed # features/steps/search.py:251 feature passed, 0 failed, 0 skipped
2 scenarios passed, 0 failed, 0 skipped
5 steps passed, 0 failed, 0 skipped, 0 undefined
Took 0m9.396s

行为驱动测试模型Behave相关推荐

  1. 译——冠状病毒:这是全球离岸测试模型的终结吗?

    The global offshoring model has been very successful in the past. With a market greater than $50B in ...

  2. 软件测试、测试用例、开发模型和测试模型、瀑布模型和螺旋模型

    什么是测试用例? 王婆的九步连环计 通过重重方式测试潘金莲是否能上钩. 有具体步骤, 有预期结果, 有真实结果 步骤一:让潘金莲答应给王婆做寿衣.这是整个局的开始,不过这个步骤看似简单,用意却不小,让 ...

  3. 软件测试入门之测试模型

    1."V型"测试模型 主要特点:一种古老的瀑布模型,反映了实际和测试之间的关系. 局限:仅仅把测试过程作为编码之后的一个阶段,忽视了测试对需求分析,系统设计的验证,如果前面设计错误 ...

  4. 软件测试整理一:测试基础知识以及开发、测试模型、按照开发阶段进行测试

    文章目录 一.基础概念 1.什么是软件测试 2.软件测试的目的 3.软件测试的原则 4.软件测试的分类 4.1 按照开发阶段分类 4.2 按照软件特性分类 4.3 按照测试技术分类 4.4 按照测试运 ...

  5. 软件测试之第十一章 软件开发与测试模型

    第十一章 软件开发与测试模型 一. 软件开发模型 1 为什么学习软件开发模型 了解开发能够更好的有针对性的做好测试. 2 什么是软件开发模型 软件开发生命周期模型是软件产品从最初构思到退役的过程. 3 ...

  6. 软件测试入门之软件开发和测试模型(面试必考)

    说明:该篇博客是博主一字一码编写的,实属不易,请尊重原创,谢谢大家! 接着上一篇博客继续往下写 :https://blog.csdn.net/qq_41782425/article/details/1 ...

  7. Linux io模型及函数调用,Linux 网络编程的5种IO模型:信号驱动IO模型

    Linux 网络编程的5种IO模型:信号驱动IO模型 背景 这一讲我们来看 信号驱动IO 模型. 介绍 情景引入: 在信号驱动IO模型中,当用户线程发起一个IO请求操作,会给对应的socket注册一个 ...

  8. Linux IO模型漫谈(6)- 信号驱动IO模型

    Unix上有定义了许多信号.源自Berkeley的实现使用的是SIGIO信号来支持套接字和终端设备上的信号驱动IO. 信号驱动IO模型主要是在UDP套接字上使用,在TCP套接字上几乎是没有什么使用的. ...

  9. Windows的驱动开发模型

    在Windows的不同版本上开发的驱动程序"模型"(模型这个词语应该来源于单词"Mode".在Windows NT上,驱动程序被称为Kernel Driver ...

最新文章

  1. .NET/C#中对自定义对象集合进行自定义排序的方法
  2. 16S预测细菌组表型-bugbase:革兰氏阴阳、生物膜、致病力、移动元件、氧气消耗等
  3. WebCast听课录(10)
  4. Visual Studio 2010 概念型IDE
  5. 3DMAX 处理反面
  6. linux虚拟文件系统vfs
  7. 吴恩达《机器学习》课程总结(8)_神经网络参数的反向传播算法
  8. python数据分析-为什么Python对大数据分析那么很重要?
  9. [leetcode]90. 子集 II
  10. Keil V5.37.0.0 - 按 F12 无法跳转到定义
  11. 用于2D动画的实时嘴型同步技术
  12. 百度千言-中文文本相似度实战
  13. BCD码中的8421码 2421码 5421码和余3码的简单使用
  14. webservice 菜鸟探索之旅
  15. 什么硬件可以手游服务器,台湾服务器用来挂机手游要哪些硬件支持?
  16. 诛仙3网游:乾坤珠的获取与使用
  17. openstack连通性检查显示验证失败_SLEEP:睡眠周期和年龄中的EEG连通性
  18. #define 用法解析
  19. 谷歌灵魂拷问What If;加拿大团队实验公式相声;脸书启用Deepfake视频
  20. Solr之——配置中文分词IKAnalyzer和拼音分词pinyinAnalyzer

热门文章

  1. web课程设计网页规划与设计:中国风茶文化网站设计(6个页面) HTML+CSS+JavaScript...
  2. 多线程:如何合理地估算线程池大小?
  3. matlab 基于小波变换的图像压缩,matlab 基于小波变换的图像压缩
  4. linux内核percpu变量声明,Linux内核同步:per_cpu变量
  5. GTS 解密 —— GTS的原理、架构与特点
  6. 面向对象基础+构造方法+重载练习
  7. android linearlayout属性大全,Android中LinearLayout布局的常用属性总结读书笔记
  8. 重装战姬显示未连接到服务器,《重装战姬》常见问题FAQ大全 公测常见问题汇总解答...
  9. table如何设置边框
  10. 终于有人把量化投资讲明白了