BDD行为驱动简介及Pytest-bdd基础使用

运行环境: pip insall pytest pytest-bdd pytest-selenium
BDD介绍
BDD行为驱动是一种敏捷开发模式, 重点在于消除开发/测试对需求了解的歧义及用户场景的验证.
需求描述/用户场景
BDD提供一套标准的需求及用户场景表达语法, 一般为Feature(需求), Scenario(场景), Given(假设,预置条件), When(操作步骤), Then(验证及清理), 如下为一个需求描述(有的公司称为需求卡片):
文件名:
educa.feature需求使用专门的.feature作为后缀
Feature: educa在线课程网站需求
需求描述: 提供后台添加课程及课程内容, 前台学生浏览课程, 加入课程后可查看课程详情
Scenario: 通过educa后台添加课程
Given 用户:hanzhichao, 密码:hanzhichao123
And 分类:接口测试,标题:Python接口测试教程,描述:作者,临渊
When 登录educa后台
And 点击:Courses模块->点击新增按钮
And 作者选择当前<用户>,选择<分类>,输入<标题>,<描述>,点击保存
Then 页面中应存在名称为<标题>的链接
And 删除该课程
#Scenario: 学生选课
# ...
- 一个需求文件中只能有一个Feature字段, 可以包含多个Scenario(用户场景)
Given->When->Then类似与准备->执行->验证/清理的流程- Given: 一般可以用来做预置条件/数据准备, 下面第一个And也属于Given
- When下面的量And都属于When, 一般是操作步骤, <用户>等只是用来提醒使用的是Given中的数据, 也可以不使用<>
- Then: 一般用于验证结果(断言), 也可以进行清理数据
场景解析/实现
单有场景文件是不能执行的, 在BDD的初级使用中, 测试同学还需要将每个场景文件中的描述翻译成具体的页面操作, 每一句对应一个函数, 下面是使用pytest-bdd对上诉educt.feature的解析实现:
# file_name: scenario_steps.py
from pytest_bdd import given, when, then, parsers
from selenium.webdriver.support.select import Select
from selenium.webdriver.support import expected_conditions as EC
@given(parsers.parse("用户:{username}, 密码:{password}"))
def user(username, password): # 类似一个pytest的fixture方法, 其他步骤可以使用其返回值
return dict(username=username, password=password)
@given(parsers.parse("分类:{category},标题:{title},描述:{description}"))
def course(category, title, description):
return dict(category=category, title=title, description=description)
@when("登录educa后台") # 固定操作,不需要获取参数则不用parsers.parse()
def login(selenium, user): # 使用上面user函数的返回数据, selenium为浏览器driver(来着:pytest-selenium)
selenium.get("http://qaschool.cn:8000/admin/")
selenium.find_element_by_id("id_username").send_keys(user['username'])
selenium.find_element_by_id("id_password").send_keys(user['password'])
selenium.find_element_by_class_name("submit-row").click()
@when(parsers.parse("点击:{module}模块->点击新增按钮"))
def add_course(selenium, module):
selenium.find_element_by_link_text(module).click() # 点击'Courses'链接
selenium.find_element_by_class_name("addlink").click() # 点击'新增 COURSE'按钮
@when("作者选择当前<用户>,选择<分类>,输入<标题>,<描述>,点击保存") # 也可以不使用<>, 要与场景中一致, 使用<>只是提示是从Given的数据中获取
def edit_course(selenium, user, course): # 使用上面course函数的返回数据
Select(selenium.find_element_by_id("id_owner")).select_by_visible_text(user['username']) # 选择作者
Select(selenium.find_element_by_id("id_subject")).select_by_visible_text(course['category']) # 选择主题
selenium.find_element_by_id("id_title").send_keys(course['title']) # 输入文章标题
selenium.find_element_by_id("id_overview").send_keys(course['description']) # 输入描述
selenium.find_element_by_class_name("default").click() # 点击保存
@then("页面中应存在名称为<标题>的链接")
def check_course(course):
assert EC.presence_of_element_located(("link text", course['title']))
@then("删除该课程")
def delete_course(selenium, course):
selenium.find_element_by_link_text(course['title']).click()
selenium.find_element_by_class_name("deletelink").click()
selenium.find_element_by_css_selector("input[type='submit']").click()
parsers用于解析语句中的参数- 方法中的
selenium参数为使用pytest-selenium中的浏览器driver, 固定参数名 EC.presence_of_element_located用来验证可定位到元素
场景测试
# file_name: test_educa.py
from pytest_bdd import scenario
from scenario_steps import * # 导入场景解释/支持步骤
@scenario("educa.feature", "通过educa后台添加课程")
def test_add_course(): # 测试educa需求文件中名为"通过educa后台添加课程"的场景
pass # 可以不写内容, pass即可
- 场景测试也可以和场景实现写到一起
执行测试
使用pytest-selenium执行用例是需要指定浏览器
在test_educa.py所在目录命令行中执行:
pytest test_educa.py --driver Chrome
Pytest-bdd的参数化
待补充...
注: 上文提到BDD的初级使用,是因为这是一种被动的测试模式, 每一个不同的需求卡片的每一句都需要去进行解释实现, 其中有大量的重复性工作, 另外缺乏开发的参与与支持.
除了部分程度上, 消除测试同学需求理解的歧义性及让测试同学更注重用户场景的验证而不是开发(功能点)逻辑的验证外, 这基本上跟写selenium自动化脚本一样, 由于场景解释脚本的不稳定而耗费大量的工作却无法发现有价值的问题
BDD行为驱动的最佳实践,请见下回分解...
BDD行为驱动简介及Pytest-bdd基础使用的更多相关文章
- Linux内核分析(四)----进程管理|网络子系统|虚拟文件系统|驱动简介
原文:Linux内核分析(四)----进程管理|网络子系统|虚拟文件系统|驱动简介 Linux内核分析(四) 两天没有更新了,上次博文我们分析了linux的内存管理子系统,本来我不想对接下来的进程管理 ...
- Ansible - 简介和应用自动化基础实践
installAnsible简介和应用自动化基础实践 一.引入: 1.1 如官方定义,Ansible is The simplest way to automate apps and IT infr ...
- 【嵌入式开发】 Linux Kernel 下载 配置 编译 安装 及 驱动简介
作者 : 韩曙亮 转载请出名出处 : http://blog.csdn.net/shulianghan/article/details/38636827 一. Linux 内核简介 1. 内核功能简介 ...
- ASP.NET Core 简介 - ASP.NET Core 基础教程 - 简单教程,简单编程
原文:ASP.NET Core 简介 - ASP.NET Core 基础教程 - 简单教程,简单编程 ← ASP.NET Core 基础教程 ASP.NET Core Windows 环境配置 → A ...
- 【在 Nervos CKB 上做开发】Nervos CKB脚本编程简介[2]:脚本基础
CKB脚本编程简介[2]:脚本基础 原文作者:Xuejie 原文链接:Introduction to CKB Script Programming 2: Script 本文译者:Shooter,Jas ...
- 行为驱动开发BDD和Cucunber简介
测试驱动开发(TDD) 1.测试驱动开发,即Test-Driven Development(TDD),测试驱动开发是敏捷开发中的一项核心实践和技术,也是一种设计方法论.TDD的原理是在开发功能代码之前 ...
- [翻译]Behavior-Driven Development (BDD)行为驱动开发(二)
测试驱动开发体现了开发人员对软件产品各部分运作方式的理解,而行为驱动开发则关注于开发人员对软件产品最终表现的行为的预期. 行为驱动开发 TDD更像是一种范式而不是一个过程.它描述了一种先编写测试,然后 ...
- [翻译]Behavior-Driven Development (BDD)行为驱动开发(一)
简单而言,BDD是一系列基于TDD的工具和方法集发展而来的开发模式,一般不认为是一种新的开发模式,而是作为TDD的补充.因此,首先对TDD的概念进行进行. 测试驱动开发(TDD) TDD模式采取的是迭 ...
- 【翻译稿】Behavior Driven Development (BDD)行为驱动开发
这是一篇翻译稿,方便给不知道BDD的同学扫盲.原文链接:What is BDD (Behavior Driven Development)? | Agile Alliance Definition定义 ...
随机推荐
- 【leetcode】287. 寻找重复数
题目链接:传送门 题目描述: 给定一个数组 nums 包含 n + 1 个整数,每个整数在 1 到 n 之间,包括 1 和 n.现在假设数组中存在一个重复的数字,找到该重复的数字. 注意 不能修改数组 ...
- StorageClass-动态PVC
StorageClass 之前我们部署了PV 和 PVC 的使用方法,但是前面的 PV 都是静态的,什么意思?就是我要使用的一个 PVC 的话就必须手动去创建一个 PV,我们也说过这种方式在很大程度上 ...
- hdu 3549 初试最大流问题
Flow Problem Time Limit: 5000/5000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Tota ...
- Springboot 使用pageHelper实现分页查询
本文链接:https://blog.csdn.net/qq_35387940/article/details/91530234
- 解决 Oracle TNSListener 服务启动找不到路径问题
TNSListener服务无法启动,提示从系统无法找到指定路径! 解决方法: 在控制面板/管理工具/服务中双击打开OracleOraHome92TNSListener的服务看到其 “可执行文件的路径” ...
- VBA学习资料分享-2
想利用VBA自动创建/发送OUTLOOK邮件,可以借助MailItem的Body属性或HTMLBody属性,代码模板如下: Dim objOutlook As Outlook.Application ...
- SIP协议入门:初学者必须明白的几个重要概念
SIP协议初学者必须明白的几个重要概念 http://blog.sina.com.cn/s/blog_60e1d7bb0100f6er.html 一. SIP协议的分层结构 SIP是一个分层结构协议, ...
- JS — 事件的相关概念和DOM
JS是以事件驱动为核心的一门语言. 事件的三要素:事件源.事件.事件驱动程序. 例如: <body> <div id="box1"></div> ...
- liunx pip安装
方法一 wget https://bootstrap.pypa.io/get-pip.py python get-pip.py 方法二 wget https://pypi.python.org/pac ...
- go语言入门(8)异常处理
1,error接口 Go语言引入了一个关于错误处理的标准模式,即error接口,它是Go语言内建的接口类型,该接口的定义如下: type error interface { Error() strin ...