python做behave test

behave test用的python的behave软件

安装使用pip install behave

使用时主要有两个部分。一个是根目录下的.feature,另一个是step文件夹下的.py

1
2
3
4
5
6
---project_home
---|---1.feature
---|---2.feature
---|---steps
---|---|---1.py
---|---|---2.py

每个feature和steps的py是对应的。

先讲一下feature。先给个例子:

1
2
3
4
5
6
7
8
9
Feature: raw api behavior Test
Scenario Outline: check raw/get_property query result
Given raw/get_property <para1>, <para2> and <para3>
Then check raw/get_property
Examples: Queries with keywords
| para1 | para2|para3|
|111|2222|333|
 |333|4444|555|

他内容包括5行:

  • Feature行: 介绍这个feature用来干什么的;
  • Scenario行:介绍这个scenario用来干什么的;
  • Given: 一般数据的初始化在这里执行;
  • When:执行操作;
  • Then:验证结果

其中尖括号<>指的是参数,在下面example中第一行是参数的列名,第二行开始是参数,会传给.py。如果在examples中没有这个参数,则直接会传带尖括号的参数名给py文件

对于py文件,我们现在用到的主要是@give和@then两个annotation:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# -*- coding: utf-8 -*-
from behave import given, when, then
import apibase, hashlib
import json
import urllib
@given("raw/get_property {para1},{para2} and {para3}")
def step_impl(context, **kwargs):
context.api = 'http://path'
for name in kwargs.keys():
if not kwargs[name].startswith('<'):
context.api += name + "=" + kwargs[name] + "&"
context.api = context.api[0:len(context.api)-1]
@then("check raw/get_property")
def step_impl(context, **kwargs):
resp = apibase.get_json_api(context.api)
assert "ans" in resp

@given里的内容需要和feature的GAVEN一样,因为behave会把它注册成一个step。下面的函数参数可以直接写参数名,也可以写kwargs拿到所有参数。context参数会和then中的函数共享,可以当做全局的。

@then类似,是做具体事情的。在其中写下assert用来判断。assert为True则成功,反之则会验证不通过。如果需要print东西,要注意只有在验证不通过时才会打出来。

疑惑

这里遇到的一个坑就是他注册step的判断不知道哪里有bug,明明given里两个不一样,但是死活注册不上,只好改了given的内容。源代码的话在behave/reporter/step_registry.py的add_step_definition

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
def add_step_definition(self, keyword, step_text, func):
step_location = Match.make_location(func)
step_type = keyword.lower()
step_text = _text(step_text)
step_definitions = self.steps[step_type]
for existing in step_definitions:
if self.same_step_definition(existing, step_text, step_location):
# -- EXACT-STEP: Same step function is already registered.
# This may occur when a step module imports another one.
return
elif existing.match(step_text):
message = u"%s has already been defined in\n existing step %s"
new_step = u"@%s('%s')" % (step_type, step_text)
existing.step_type = step_type
existing_step = existing.describe()
existing_step += u" at %s" % existing.location
raise AmbiguousStep(message % (new_step, existing_step))
step_definitions.append(get_matcher(func, step_text))

讲道理的话step_type是given这个annotation,step_text是内容,然而不知道为啥就是判断exist。python不太熟,就没往下追

参考文献


本文采用创作共用保留署名-非商业-禁止演绎4.0国际许可证,欢迎转载,但转载请注明来自http://thousandhu.github.io,并保持转载后文章内容的完整。本人保留所有版权相关权利。

本文链接:http://thousandhu.github.io/2016/03/02/python做behave-test/