[BDD in Python]使用behave框架在Python中实践行为驱动开发

诞生于上世纪末的测试驱动开发(TDD)已经算是很深入人心了,一定程度上来说它通过既有的约定(测试)减少了开发人员间的沟通成本。但这些测试也只是开发人员自己对需求的理解,有时候开发人员、业务人员、市场部门和用户对需求的理解是有分歧的,传统的方案是厚厚的需求说明书,从测试驱动开发引申来的行为驱动开发BDD(Behavior Driven Development)可以有效的解决这个问题。

本文也不对行为驱动开发多做赘述,那是一个很大的话题,而是向大家介绍一下Python的BDD框架behave,其中会大致讲一下行为驱动开发的各个关键概念。

Behave

Behave是一个基于Python的BDD框架,它提供一个命令行工具来进行功能的管理和测试,功能文件(feature)的语法基于Gherkin语言。

安装

简单的pip安装

pip install behave

Gherkin

Gherkin是知名的Ruby的BDD框架Cucumber的功能描述语言,能够以自然语言描述一个需求,例如实现两个数字相加的需求用Gherkin语法描述为

Feature: Adding
    Scenario: Adding two numbers
    Given the input "2+2"
    When the calculator is run
    Then output should be "4"

Gherkin支持多种语言,上述的功能描述用中文表示就是

功能: 加法
    场景:两个数字相加
    加入输入"2+2"
    当计算器运行
    那么结果应该是"4"

需求描述的很详尽了。接下来我们看一下如何用behave构建这个需求的测试。

使用Behave

描述功能

在工作目录新建文件夹features,在文件夹中新建adding.feature

Feature: Adding
    Scenario: Adding two numbers
        Given the input "2+2"
        When the calculator is run
        Then output should be "4"

编写测试

然后在features目录下建立文件夹steps,在steps目录下新建adding_steps.py

from behave import given, when, then, step_matcher

@given(u'the input "{a:d}+{b:d}"')
def step_given(context, a, b):
    context.a = a
    context.b = b


@when(u'the calculator is run')
def step_when(context):
    pass


@then(u'output should be "{c:d}"')
def step_then(context, c):
    assert context.a + context.b == c

注意可以通过大括号指定变量名和类型,context是一个全局的字典,可以用来保存之前步骤的变量。

运行测试

features同级目录下运行

behave

可以看到结果

测试多组条件

Gherkin语言提供一个场景大纲的语法,可以指定多组测试条件。

Feature: Adding
    Scenario Outline: Adding two numbers
        Given the input "<a>+<b>"
        When the calculator is run
        Then output should be "<c>"
    Examples:
    |   a   |   b   |   c   |
    |   1   |   2   |   3   |
    |   5   | -6    |   -1  |

此时的测试结果也把每一组条件都罗列出来了。

使用中文描述需求

其实只是关键词的一一对应。

功能: 展示用中文描述需求的样例
    场景大纲: 用中文写一个简单的需求
        假如我们已经安装好behave框架
            当给出一个数字 <number>
            那么这个数字的后继是 <next>
        例子:
            |   number  |   next    |
            |   1       |   2       |
            |   2       |   3       |
            |   4       |   5       |

测试代码也要稍加调整。

from behave import given, when, then, step_matcher

@given(u'我们已经安装好behave框架')
def step_given(context):
    pass


@when(u'给出一个数字 {number:d}')
def step_when(context, number):
    assert number > 0
    context.number = number


@then(u'这个数字的后继是 {next:d}')
def step_impl(context, next):
    assert next > 0
    assert context.failed is False
    assert next == context.number + 1

运行时要指定语言。

behave框架还有很多功能,大家可以从官方文档里获取相关的知识。

结语

下次当你和项目经理或用户对某个需求有很大分歧时,不妨考虑一下使用行为驱动开发。

最后祝大家享受生活,享受代码。

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏BestSDK

不知道这21 款插件,别说你用过Eclipse

Darkest Dark 如果你也是那种讨厌白色背景的人,那么肯定不会问我为什么黑屏更好,也不会觉得使用“darkest”修改“dark”是多余的。我相信你一旦...

45210
来自专栏大数据挖掘DT机器学习

如何用R语言从网上读取多样格式数据

第一部分:数据信息 生活中,我们面临着各种各样的数据:比如你的成绩单,比如公司的财务报表,比如朋友圈的一些状态,比如微信里的一段语音……我们生活的大数据时代的一...

3817
来自专栏SDNLAB

OpenDaylight碳版本如何增强稳定性、安全性和网络可编程性?

OpenDaylight的终端用户现在可以放心的是,OpenDaylight早起版本中的数以千计的功能支持不足的现象一去不复返了。OpenDaylight最新的...

3986
来自专栏Python中文社区

用Python玩转微信的正确姿势!

0. itchat 最近研究了一些微信的玩法,我们可以通过网页版的微信微信网页版,扫码登录后去抓包爬取信息,还可以post去发送信息。 然后发现了itchat这...

5618
来自专栏小文博客

用Python画一个中国地图【转】

1843
来自专栏大数据和云计算技术

数据组织核心技术

要高效地使用数据,就必须要有组织,因此业界对数据的结构化组织有很多探索。 1)Cube技术概念 OLAP的目标是满足决策支持或者满足在多维环境下特定的查询和报表...

3087
来自专栏灯塔大数据

教程 | 中国酷炫地图,大神教你用Python一边爬一边画

先来聊聊为什么做数据分析一定要用Python或R语言。编程语言这么多种,Java, PHP都很成熟,但是为什么在最近热火的数据分析领域,很多人选择用Python...

3073
来自专栏xingoo, 一个梦想做发明家的程序员

C++库大全

基础类 1、 Dinkumware C++ Library 参考站点:http://www.dinkumware.com P.J. Plauger编写的高品质...

3406
来自专栏nimomeng的自我进阶

Kiwi上手体验

听说Kiwi,是来自于我在进行模块化构建的时候,执行 pod lib create xxxPods 的时候会有一个问题:

1112
来自专栏木可大大

漫谈计算机架构

一说到计算机架构(Computer Architecture),大家可能会有疑问:计算机架构到底是个什么东西?引用维基百科对计算机架构的定义:

1011

扫码关注云+社区

领取腾讯云代金券