Behave 基础
在你使用behave或其他BDD框架之前, 你应该选择一个断言库。 python有很多这方面的第三方库。例如: hamcrest,nose.tools, should-dsl, sure, compare, describe等。选择一个自己喜欢的。
参数化step
# file:features/tutorial03_step_parameters.feature
Feature: Step Parameters (tutorial03) Scenario: Blenders
Given I put "apples" in a blender
When I switch the blender on
Then it should transform into "apple juice"
#每个step中都包含一部分参数,这些参数可以传入不同的值
from behave import given, when, then
from hamcrest import assert_that, equal_to
from blender import Blender @given('I put "{thing}" in a blender')
def step_given_put_thing_into_blender(context, thing): #参数名字可以随便定义
context.blender = Blender()
context.blender.add(thing) @when('I switch the blender on')
def step_when_switch_blender_on(context):
context.blender.switch_on() @then('it should transform into "{other_thing}"')
def step_then_should_transform_into(context, other_thing):
assert_that(context.blender.result, equal_to(other_thing))场景概要(scenario outline)
Feature: Scenario Outline (tutorial04) Scenario Outline: Use Blender with <thing>
Given I put "<thing>" in a blender
When I switch the blender on
Then it should transform into "<other thing>" Examples: Amphibians
| thing | other thing |
| Red Tree Frog | mush |
| apples | apple juice | Examples: Consumer Electronics
| thing | other thing |
| iPhone | toxic waste |
| Galaxy Nexus | toxic waste | #这个类型也可以叫做场景模板, template的概念, 相同的场景传入不同的参数, 参数名字是table的第一行, 可以在step中引用
from behave import given, when, then
from hamcrest import assert_that, equal_to
from blender import Blender @given('I put "{thing}" in a blender')
def step_given_put_thing_into_blender(context, thing):
context.blender = Blender()
context.blender.add(thing) @when('I switch the blender on')
def step_when_switch_blender_on(context):
context.blender.switch_on() @then('it should transform into "{other_thing}"')
def step_then_should_transform_into(context, other_thing):
assert_that(context.blender.result, equal_to(other_thing))多行text(step data)
Scenario: Some scenario
Given a sample text loaded into the frobulator:
"""
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do
eiusmod tempor incididunt ut labore et dolore magna aliqua.
"""
#step data在step_impl中可以直接用context.text引用 from behave import given, when, then
from hamcrest import assert_that, equal_to @given('a sample text loaded into the frobulator')
def step_impl(context):
frobulator = getattr(context, "frobulator", None)
if not frobulator:
context.frobulator = Frobulator()
context.frobulator.text = context.textsetup table
# file:features/tutorial06_step_setup_table.feature
Feature: Step Setup Table (tutorial06) Scenario: Setup Table
Given a set of specific users:
| name | department |
| Barry | Beer Cans |
| Pudey | Silly Walks |
| Two-Lumps | Silly Walks | #步骤中的table,在step_impl中使用context.table引用, 是由dict组成的数组 @given('a set of specific users')
def step_impl(context):
model = getattr(context, "model", None)
if not model:
context.model = CompanyModel()
for row in context.table:
context.model.add_user(row["name"], deparment=row["department"])Result table 和stepup的用法相似
在step中使用其他step
# context.execute_steps函数, 不赘述
@when('I do the same thing as before')
def step_impl(context):
context.execute_steps(u"""
when I press the big {button_color} button
and I duck
""".format(button_color="red"))background
# file:features/tutorial09_background.feature
Feature: Using Background -- Fight or Flight (Natural Language Part2, tutorial09) Background: Ninja fight setup
Given the ninja encounters another opponent Scenario: Weaker opponent
Given the ninja has a third level black-belt #Background下面的step会在该feature中所有scenario执行之前执行自定义数据类型
在参数化的step中, 参数默认是按string解析的. 如果用户想按照其他类型处理,可自定义参数类型
Scenario Outline: Calculator
Given I have a calculator
When I add "<x>" and "<y>"
Then the calculator returns "<sum>" Examples:
| x | y | sum |
| 1 | 1 | 2 | #写一个转换函数,并注册
from behave import register_type def parse_number(text):
"""
Convert parsed text into a number.
:param text: Parsed text, called by :py:meth:`parse.Parser.parse()`.
:return: Number instance (integer), created from parsed text.
"""
return int(text)
# -- REGISTER: User-defined type converter (parse_type).
register_type(Number=parse_number) #step_impl
@when('I add "{x:Number}" and "{y:Number}"')
def step_impl(context, x, y):
assert isinstance(x, int)
assert isinstance(y, int)
context.calculator.add2(x, y)tag
设置tag来规划自己的测试集合
select/enable --tags=@one Only items with this tag.
not (tilde/minus) --tags=-@one Only items without this tag.
logical-or --tags=@one,@two If @one or @two is present.
logical-and --tags=@one --tags=@two If both @one and @two are present.
Behave 基础的更多相关文章
- python 模块基础介绍
从逻辑上组织代码,将一些有联系,完成特定功能相关的代码组织在一起,这些自我包含并且有组织的代码片段就是模块,将其他模块中属性附加到你的模块的操作叫做导入. 那些一个或多个.py文件组成的代码集合就称为 ...
- Lucene基础(2)
上一篇:Lucene基础(1) 一.Lucene术语 Document, Field, Term, Query, Analyzer相信在其中大多数在之前已经理解了...对其中部分概念详细说明 Docu ...
- 自动化测试:behave
*:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...
- RunLoop总结:RunLoop基础知识
没有实际应用场景,很难理解一些抽象空洞的东西,所以前面几篇文章先介绍了RunLoop的几个使用场景. 另外AsyncDisplayKit中也有大量使用RunLoop的示例. 关于实际的使用RunLoo ...
- Redis(REmote DIctionary Server)基础
Redis(REmote DIctionary Server)基础 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. Redis是一个开放源代码(BSD许可)的内存数据结构存储,用作数 ...
- 【Android开发日记】之基础篇(一)——TextView+SpannableStringBuilder
TextView是控件中最最基础的一个控件,也是最简单的一个控件.但如果仅此,我不会专门为TextView写一篇文章.最近发现了Android中有趣的一个类,那就是标题上写的SpannableStri ...
- Webpack探索【15】--- 基础构建原理详解(模块如何被组建&如何加载)&源码解读
本文主要说明Webpack模块构建和加载的原理,对构建后的源码进行分析. 一 说明 本文以一个简单的示例,通过对构建好的bundle.js源码进行分析,说明Webpack的基础构建原理. 本文使用的W ...
- python 基础网络编程2
python 基础网络编程2 前一篇讲了socketserver.py中BaseServer类, 下面介绍下TCPServer和UDPServer class TCPServer(BaseServer ...
- SWIG 3 中文手册——5. SWIG 基础知识
目录 5 SWIG 基础知识 5.1 运行 SWIG 5.1.1 输入格式 5.1.2 SWIG 输出 5.1.3 注释 5.1.4 C 预处理器 5.1.5 SWIG 指令 5.1.6 解析限制 5 ...
随机推荐
- C#判断本地文件,网络文件是否存在是否存在
File.Exists 方法 (String) 确定指定的文件是否存在. 命名空间: System.IO程序集: mscorlib(位于 mscorlib.dll) 参数 path Type: ...
- npm安装和Vue运行
一.开始: 下载地址:http://nodejs.cn/download/ 下载安装: 直到 二.打开CMD,检查是否正常 在安装目录里新增两个文件夹 然后运行命令:如下图: npm config s ...
- C# InDepth 第一章
深入理解C#第一部分,第一章介绍了C#开发得进化史. 1 从数据类型定义引入c#1到4中得改变 c#2:强类型集合(泛型) c#3:自动实现得属性和简化得初始化 c#4:命名实参 2 排序和过滤 排序 ...
- SQL 2012新分页方式
--2012的OFFSET分页方式 (推荐使用 - 较为方便) select number from spt_values where type='p' order by number offset ...
- Http请求基本方法
1.Http请求基本方法 /// <summary> /// Http请求基本方法 /// </summary> /// <param name="conten ...
- 如何在centos下配置redis开机自启动
2014/11/10补充:其实在redis的下载包中就包含了官方自带的启动脚本,路径在/redis-stable/utils/redis_init_script.在utils目录下也有安装redis- ...
- django项目中使用项目环境制作脚本 通过终端命令运行脚本文件
在实际的django项目开发中,有时候需要制作一些脚本文件对项目数据进行处理,然后通过终端命令运行脚本. 完整的实现流程如下: 1.在一个应用目录下(app, 必须是在应用目录下,可以专门创建一个应用 ...
- hdoj1045 Fire Net(二分图最大匹配)
题意:给出一个图,其中有 . 和 X 两种,. 为通路,X表示墙,在其中放炸弹,然后炸弹不能穿过墙,问你最多在图中可以放多少个炸弹? 这个题建图有点复杂orz. 建图,首先把每一行中的可以放一个炸弹的 ...
- nginx并发连接控制模块ngx_http_limit_conn_module
模块: ngx_http_limit_conn_module 作用: 根据定义的key限制并发连接数 配置示例: http { limit_conn_zone $binary_remote_addr ...
- JS-DOM Element方法和属性
JS-DOM Element方法和属性 S-DOM Element方法和属性一,获取html元素1.getElementByID(id)通过对元素的ID访问,这是DOM一个基础的访问页面元素的方法.e ...