Python BDD自动化测试框架初探
1. 什么是BDD
BDD全称Behavior Driven Development,译作"行为驱动开发",是基于TDD (Test Driven Development 测试驱动开发)的软件开发过程和方法。
BDD可以让项目成员(甚至是不懂编程的)使用自然语言来描述系统功能和场景,从而根据这些描述步骤进行系统自动化的测试。(详见附录4.1)
2. 常用BDD框架介绍
目前常用的BDD测试框架有Ruby中的Cucumber,Python中的Behave、Lettuce及Freshen等。
基本的流程如下图所示(Lettuce官方图):

简单来说就是"写用例->跑测试->看结果->写实现->看结果"这样的一个循环。
Behave网站列出了上面提到的几个自动化测试框架的对比(详见附录4.2),基于此原因,本文选择behave来介绍Python BDD自动化测试框架。
3. Behave示例
3.1 Behave安装
pip install behave # 全新安装
pip install -U behave # 更新
3.2 基础知识
3.2.1 Gherkin语法
上文提到的几种BDD框架均使用Gherkin语法,这是一种简单易懂的语言,使用关键字来定义系统特征和测试。
使用Gherkin语法编写的feature文件基本结构如下:
Title (one line describing the story/feature)
    As a     [role]
    I want   [feature]
    So that  [benefit]
    Scenario: Title1 (for Behaviour 1)
        Given  [context or setup]
        And   [some more context]...
        When  [event occurs]
        Then  [expected outcome]
        And   [another outcome]...
    Scenario: Title2 (for Behaviour 2)
        ...
3.2.2 断言模块
使用BDD测试框架前,需要选择一个好用的断言模块。Python有很多可用的断言模块(下表),本文我们选择hamcrest模块为例。
| Matcher Library | Description | 
| Native assert | Starting point, but not enough information when assert fails. | 
| hamcrest | First assertion matcher library, now part of JUnit4. Supports several programming languages: http://code.google.com/p/hamcrest/ | 
| nose.tools | Part of the nose test framework | 
| should-dsl | An interesting small matcher library, http://www.should-dsl.info/ | 
| sure | Provided by the maker of lettuce, github:/gabrielfalcao/sure | 
| compare | http://pypi.python.org/pypi/compare | 
| describe | http://pypi.python.org/pypi/describe | 
3.2.3 目录结构
Behave项目的目录格式如下:
$PROJECT/
+-- features/ -- Contains all feature files.
| +-- steps/
| | +-- step_*.py -- Step definitions for features.
| +-- environment.py -- Environment for global setup...
| +-- tutorial*.feature -- Feature files.
3.3 Behave示例
我们以fibnacci数列计算为例,来了解下behave框架结构及如何使用(网上基本都是以阶乘或WEB页面为例,为显示本文的原创性,我们以fib数列为例)
首先,比较pythonic的实现fib数列的代码如下:
# -*- coding:utf-8 -*-
def fibs(num):
a=b=1
for i in range(num):
yield a
a,b=b,a+b print list(fibs(10))
使用behave进行自动化测试的详细步骤如下:
1. 新建目录fib,在此目录下新建文件fib.feature,内容如下
Feature:Calc Fib
In order to introduce Behave
We calc fib as example Scenario: Calc fib number
Given we have the number 10
when we calc the fib
then we get the fib number 55
2. 新建目录fib/steps,在此目录下新建文件fib.py,内容如下
from behave import *
from hamcrest import * def fibs(num):
a=b=1
for i in range(num):
yield a
a,b=b,a+b @given('we have the number {number}')
def have_number(context,number):
context.fib_number = int(number) @when('we calc the fib')
def calc_fib(context):
context.fib_number=list(fibs(context.fib_number))[-1] @then('we get the fib number {number}')
def get_number(context,number):
context.expected_number = int(number)
assert_that(context.fib_number, equal_to(context.expected_number),"Calc fib number: %d" %context.fib_number)
这段Python代码主要分为三部分:
@given部分将输入的number=10转为整形并存入变量中
@when部分调用fib函数,计算fib数列值
@then 部分将计算出的fib值与预期值进行断言比较,判断结果是否相等
3. 切换到fib目录,执行behave命令,结果如下

4. Scenario Outlines场景大纲
有时相同的一个Scenario需要在很多不同的参数情况下运行,为了避免写过多重复的Scenario ,我们需要使用Scenario Outlines,如fib.feature文件内容可以修改如下:
Feature:Calc Fib
In order to introduce Behave
We calc fib as example Scenario Outline: Calc fib number
Given we have the number <number>
when we calc the fib
then we get the fib number <fib_number> Examples: Some Numbers
| number | fib_number |
| 1 | 1 |
| 2 | 2 |
| 10 | 55 |
执行结果如下:

5. 更多的beahve示例可以参考附录4.4
4. 附录
本文只对Python BDD自动化测试框架进行了简单入门级介绍,若想更深入了解BDD,可参考如下资料:
4.1 BDD详细介绍:https://pythonhosted.org/behave/philosophy.html
4.2 常用测试框架对比:https://pythonhosted.org/behave/comparison.html
4.3 Hamcrest断言模块:https://github.com/hamcrest/PyHamcrest
4.4 Behave示例:http://jenisys.github.io/behave.example/
Python BDD自动化测试框架初探的更多相关文章
- Python接口自动化测试框架实战 从设计到开发
		第1章 课程介绍(不要错过)本章主要讲解课程的详细安排.课程学习要求.课程面向用户等,让大家很直观的对课程有整体认知! 第2章 接口测试工具Fiddler的运用本章重点讲解如何抓app\web的htt ... 
- 基于Python接口自动化测试框架+数据与代码分离(进阶篇)附源码
		引言 在上一篇<基于Python接口自动化测试框架(初级篇)附源码>讲过了接口自动化测试框架的搭建,最核心的模块功能就是测试数据库初始化,再来看看之前的框架结构: 可以看出testcase ... 
- BDD自动化测试框架cucumber(1): 最基本的demo
		BDD(Behavior Driven Development),行为驱动开发, 对应自动化测试框架,python有behave,java有cucumber, 这次记录cucumber+springb ... 
- Robot Framework自动化测试框架初探
		Robot Framework是一款python语言编写,通用的功能自动化测试框架.它使用了比较易用的表格数据语法,基于关键字驱动测试,主要用来验收测试和验收测试驱动开发(ATDD). 本文主要介绍R ... 
- 从零开始到设计Python+Selenium自动化测试框架-如何开始
		如何开始学习web ui自动化测试?如何选择一门脚本语言?选择什么自动化测试工具? 本人已经做测试快5年,很惭愧,感觉积累不够,很多测试都不会,三年多功能测试,最近两年才开始接触和学习自动化测试.打算 ... 
- Python selenium自动化测试框架入门实战--登录测试案例
		本文为Python自动化测试框架基础入门篇,主要帮助会写基本selenium测试代码又没有规划的同仁.本文应用到POM模型.selenium.unittest框架.configparser配置文件.s ... 
- python web自动化测试框架搭建(功能&接口)——接口用例实现
		测试用例基类: # coding=utf-8 import unittest import Logger log = Logger.Loger() class BaseCase(unittest.Te ... 
- python web自动化测试框架搭建(功能&接口)——接口公共方法
		接口公共方法有:数据引擎.http引擎.Excel引擎 1.数据引擎:获取用例.结果检查.结果统计 # -*- coding:utf-8 -*- from XlsEngine import XlsEn ... 
- python web自动化测试框架搭建(功能&接口)——接口测试模块
		Python接口测试采用python读取excel的方法,通过requests库发送请求和接收响应.模块有: Data:用于存放excel用例的,用例格式: iutil: 接口公共方法,数据引擎.ht ... 
随机推荐
- Spring第三篇【Core模块之对象依赖】
			前言 在Spring的第二篇中主要讲解了Spring Core模块的使用IOC容器创建对象的问题,Spring Core模块主要是解决对象的创建和对象之间的依赖关系,因此本博文主要讲解如何使用IOC容 ... 
- [5] 微信公众号开发 - 微信支付功能开发(网页JSAPI调用)
			1.微信支付的流程 如下三张手机截图,我们在微信网页端看到的支付,表面上看到的是 "点击支付按钮 - 弹出支付框 - 支付成功后出现提示页面",实际上的核心处理过程是: 点击支付按 ... 
- 利用ADO让普通人用excel读取oracle数据库表的通用办法
			Ref:http://blog.csdn.net/iamlaosong/article/details/8465177 Excel通过ADO方式连接到Oracle并操作Oracle给那些编程能力不强的 ... 
- 过度拟合(overfilting)
			过拟合概念:是指分类器能够百分之百的正确分类样本数据(训练集中的样本数据),对训练集以外的数据却不能够正确分类. 原因:1:模型(算法)太过复杂,比如神经网络,算法太过精细复杂,规则太过严格,以至于任 ... 
- Java连接数据库完整代码 查找和插入
			package test; import java.io.InputStream; import java.sql.Connection; import java.sql.DriverManager; ... 
- Select的option事件问题
			一开始看你们会觉得没问题,我也就是觉得没问题所以才找不到错误所在. 问题出在option本身是没有事件的说法的,只能在select里添加事件,再获取option的属性值 这是我的写法 select设置 ... 
- OpenVPN server端配置文件详细说明(转)
			本文将介绍如何配置OpenVPN服务器端的配置文件.在Windows系统中,该配置文件一般叫做server.ovpn:在Linux/BSD系统中,该配置文件一般叫做server.conf.虽然配置文件 ... 
- AMD、CMD、CommonJs规范
			AMD.CMD.CommonJs规范 将js代码分割成不同功能的小块进行模块化的概念是在一些三方规范中流行起来的,比如CommonJS.AMD和CMD.接下来我们看一下这几种规范. 一.模块化规范 C ... 
- PHP通过访客来路获取搜索关键词的方法
			<?php class keyword{ public function getKeyword($referer){ if(strpos($referer,"http://www.ba ... 
- FPGA与PCI-E
			从并行到串行: PCI Express(又称PCIe)是一种高性能.高带宽串行通讯互连标准,取代了基于总线的通信架构,如:PCI.PCI Extended (PCI-X) 以及加速图形端口(AGP). ... 
