行为驱动的概念(Behavior-Drivern Development,简称BDD)在国内测试领域还不怎么流行,应用面也不是特别广泛。在行为驱动中运用结构化的自然语言描述测试场景 ,然后将这些结构化的自然语言转化为可执行的测试脚本或者其他形式。BDD的一种优势是它建立了一种“通用语言”,而这种通用的语言可以同时被客户和开发者拿来使用,因此建立在同一种语言之后的沟通就会避免很多不一致的问题。
1、环境安装:
兵马未动,粮草先行。需要把BDD的环境准备好。需要安装模块behave,安装步骤和在Python环境中安装其他模块方式一样,可以执行命令
#pip install behave
安装好之后可以执行命令“pip list”用以查看behave是否在已安装列表中。
2、示例:
在开始了解具体BDD案例代码之前,可以先熟悉下BDD的一些关键字。具体如下。
- Given,表示“假设”,可以在此处设置一些前置条件之类,如在BDD之前,假设behave模块已经安装等等。也可以理解成用户或者外部系统等对应用在进行交互(操作)前,需要将系统处于一个已知状态(如系统已安装behave模块等)。
- When表示“当”,从字面意思上理解是对条件判断之意。此时或者某种条件满足时用户或者外部系统所采取的与被测系统的交互步骤。交互步骤能改变系统的状态(与系统真实地产生了交互)。
- And表示“和”,是和When关键字搭配使用的。
- Then表示“那么”,待观察的结果或者期望结果。
通过以上对behave的Scenario(测试场景)中关键字的描述,可能有和自然语言很像的感觉。这样的场景描述可读性较强,文件名为“example.feature”。
1)、场景描述,其功能点(Feature)表示此脚本是为了展示behave的用法;场景目的是“Run a simple test”;假设为“we have behave installed”;当“we implement 5 tests”
时;那么“behave will test them for us!”。以上对场景中用到的关键字的解释加上对具体场景的分析
2)、对以上类似自然语言一样的场景描述进行代码实现,让其转换成可以运行的基于行为驱动的测试脚本。文件名为“example_steps.py”,其位置在steps包下。代码中的函数用到了assert语句用作断言。其中有一点需要注意的是,里面用到了参数context,它是全局变量,其可以被程序中的所有对象或者函数调用,在行为驱动有承上启下的作用。其次是需要导入behave模块中的given,when,then,step等功能。
#coding=utf-8
from behave import given, when, then, step
@given('we have behave installed')
def step_impl(context):
pass
# 数字类型number将会转换成整数类型
#以下函数是为了获取在场景文件中设置的数字 5,然后做出判断等操作。
@when('we implement {number:d} tests')
def step_impl(context, number):
assert number > 1 or number == 0
context.tests_count = number
@then('behave will test them for us!')
def step_impl(context):
assert context.failed is False
assert context.tests_count >= 0
3)、执行脚本。首先在命令行模式下切换到项目主目录下,然后执行命令“behave”即可。最后查看执行结果如图12.3所示,在测试结果中发现:1个功能通过;1个场景通过;3个步骤测试通过。
4),以上步骤可以理解成为一个正向测试用例。现在以一个反向测试用例来验证behave的测试输出结果如何。首先更改step实现中的断言条件,使其判断为失败。在代码文件“example_steps.py”中将断言部分的“assert number > 1”改为“assert number > 10”更改之后的代码文件内容如下,执行结果如下所示:
#coding=utf-8
from behave import given, when, then, step
@given('we have behave installed')
def step_impl(context):
pass
#注意,以下的实现函数在校验语句中将>1改成>10
@when('we implement {number:d} tests')
def step_impl(context, number):
assert number > 10 or number == 0
context.tests_count = number
@then('behave will test them for us!')
def step_impl(context):
assert context.failed is False
assert context.tests_count >= 0