http://pythonhosted.org/lettuce/

介绍                                                                                                     

  亲们!看到TDD/BDD 一定会感觉高端大气上档次,不是我们普通吊民玩的,最的近在一直在摸索自动化测试。也想体验并引入BDD 低调奢华的内涵。于是,在网络上搜索资料;话说这玩艺儿真的不太好理解,尤其对于没有丰富编程的经验的同学。

  学习BDD ruby 的cucumber  是个不错的选择,但我是python 流的,自然找了来它的兄弟lettuce ,从官方版本(v0.1rc11)来看确实够年轻的,不过由ruby 的cucumber 在前面开路,lettuce 应该会发展的很顺利。

  lettuce 除了官方文档外,几乎找不到其它资料,为了理解lettuce  ,我们不妨多去看看cucumber 的资料。

  lettuce是一个非常有用的和迷人的BDD(行为驱动开发)工具。Python项目的自动化测试,它可以执行纯文本的功能描述,就像ruby语言的cucumber。

  lettuce,使开发和测试过程变得很容易,可扩展性,可读性和-什么是最好的-它允许我们用自然语言去描述个一个系统的行为,你不能想象这些描述可以自动测试你的系统。

安装                                                                                                        

请确认你已经安装了python 以及pip安装包管理工具。

不管是windows 还是linux 环境,进入pip目录,只需下面一个命令就可以安装lettuce .

user@machine:~$ [sudo] pip install lettuce

例子(阶乘)

下面就通过官网的例子来领略lettuce的风骚。

什么阶乘?

0!=1

1!=1

2!=2×1=2

3!=3×2×1=6

....

10!=10×9×8×7×6×5×4×3×2×1=3628800

.....

下面是用python 语言的两种阶乘实现:

#coding=utf-8

#循环实现
def f(n):
c = 1
for i in range(n):
i=i+1
c=c*i
return c #递归实现
def f2(n):
if n > 1:
return n*f2(n-1)
else:
return 1 #调用方法
print f(10)
print f2(10)

OK!介于我们理解上面阶乘的基础上,来看看BDD是如何实现的。

lettuce 解析                                                                                         

创建以下目录结构:

.../tests/features/zero.feature

/steps.py

现在我们来编写zero.feature 文件的内容

Feature: Compute factorial
In order to play with Lettuce
As beginners
We'll implement factorial Scenario: Factorial of
Given I have the number
When I compute its factorial
Then I see the number

基于E文不好的同学,我这里简单翻译一下:

功能:计算阶乘
为了使用lettuce
作为初学者
我们将实现阶乘 场景:0的阶乘
假定我有数字0
当我计算它的阶乘
然后,我看到了1

  是不是很自然的描述?!第一段功能介绍,我要实现什么功能;第二段场景,也可以看做是一条测试用例,当我输入什么数据时,程序应该返回给我什么数据。

  虽然是自然语言,但还是有语法规则的,不然一千个人有一千中描述,程序以什么样的规则去匹配呢?

其实它的语法规则非常简单就几个关键字,记住他们的含义及作用即可。

----------------------------------------------

  • Feature(功能)
  • Scenario(情景)
  • Given(给定)
  • And(和)
  • When(当)
  • Then(则)

----------------------------------------------

他们的含义与原有自动化测试框架的概念相似,类比如下:

关于feature文件的作用,执行以及语法规则将在下一节中详细介绍,这一节主要先来体验luttuce的风骚。

有了上面zero.feature文件的行为做指导,下面打开steps.py 文件来编写我们的程序。

from lettuce import *

@step('I have the number (\d+)')
def have_the_number(step, number):
world.number = int(number) @step('I compute its factorial')
def compute_its_fatorial(step):
world.number = factorial(world.number) @step('I see the number (\d+)')
def check_number(step, expected):
expected = int(expected)
assert world.number == expected, \
"Got %d" % world.number def factorial(number):
number = int(number)
if (number == 0) or (number == 1):
return 1
else:
return number

  我擦!咋一看怎么跟我上面实现阶乘的代码相差甚远呀!不知道你和你的小伙伴有没有惊呆!?好吧,以我拙劣的python语言水平试着来分析一下,这是啥?这是啥?这又是啥?

from lettuce import *

引入lettuce 下面的所有包

@step('I have the number (\d+)')

@step 字面意思是步骤

I have the number (\d+) 对应的就是zero.feature文件中的第六句:Given I have the number 0

(\d+) 是一个正则表达式,\d 表示匹配一个数字,+ 表示匹配的数字至少有一个或多个。关于这个可以参考其他python 正则表达式的资料。

第一步:

@step('I have the number (\d+)')
def have_the_number(step, number):
world.number = int(number)

定义一个方法have_the_number,把假设的输入(0)转换成整型放入world.number中。

第二步:

@step('I compute its factorial')
def compute_its_fatorial(step):
world.number = factorial(world.number)

把have_the_number方法中world.number的变量值(0)放入 factorial() 方法中,并把结果返再赋值给world.number变量。

I compute its factorial  对应的就是zero.feature文件中的第七句:When I compute its factorial

第三步:

def factorial(number):
number = int(number)
if (number == 0) or (number == 1):
return 1
else:
return number

这个是factorial()方法被调用时的处理过程,对参数的内容转换成整数,判断如果等于0或1的话就直接返回1,否则返回具体的数。(处理结果给了第三步的world.number)

第四步:

@step('I see the number (\d+)')
def check_number(step, expected):
expected = int(expected)
assert world.number == expected, \
"Got %d" % world.number

expected 获取的是zero.feature文件中预期结果, 与第三步处理的实际结果(world.number)进行比较;assert 函数进行断言结果是否正确。

I see the number (\d+)对应的就是zero.feature文件中的第八句:Then I see the number 1

运行                                                                                                        

切换到tests目录下,运行lettuce 命令:

fnngj@fnngj-H24X:~/python/lettuce/tests$ lettuce

运行结果如下:

运行结果很清晰,首先是zero.feature文件里功能描述(feature),然后场景(scenario)每一步所对应steps.py 文件里的哪一行代码。

最后给出运行结果:

Feature(1 passed)   一个功能通过

Scenario(1 passed)   一个场景通过

Steps(3 passed)      三个步骤通过

完善                                                                                                         

下面我们可以在zero.feature 中多加几个场景(测试用例):

Feature: Compute factorial
In order to play with Lettuce
As beginners
We'll implement factorial Scenario: Factorial of
Given I have the number
When I compute its factorial
Then I see the number Scenario: Factorial of
Given I have the number
When I compute its factorial
Then I see the number Scenario: Factorial of
Given I have the number
When I compute its factorial
Then I see the number Scenario: Factorial of
Given I have the number
When I compute its factorial
Then I see the number

运行结果:

  嗯??第四场景没通过,3!=3*2*1=6 这个预期结果肯定是正确的,那就是代码的逻辑有问题吧!如果你细心的话一定发现了setup.py中的代码并未真正实现阶乘,我们需要对它进行修改:

#coding=utf-8
from lettuce import * @step('I have the number (\d+)')
def have_the_number(step, number):
world.number = int(number)
print world.number @step('I compute its factorial')
def compute_its_fatorial(step):
world.number = factorial(world.number)
print world.number @step('I see the number (\d+)')
def check_number(step, expected):
expected = int(expected)
assert world.number == expected, \
"Got %d" % world.number def factorial(number):
number = int(number)
if (number == 0) or (number == 1):
return 1
else:
return number*factorial(number-1)

代码修改部分:

def factorial(number):
number = int(number)
if (number == 0) or (number == 1):
return 1
else:
return number*factorial(number-1)

参照本文开头,通过递归的方式实现阶乘的代码,现在才算完整的实现阶乘。OK !再来运行以下脚本吧!全绿了有木有!!

这应该是目前讲解BDD 最通俗易懂的文章了,没有之一,给个赞吧!

python BDD 框架之lettuce的更多相关文章

  1. 虫师Selenium2+Python_12、BDD框架之Lettuce入门

    http://www.cnblogs.com/fnng/p/3415609.html P293--简介: TDD(Test-Drivern-Development)测试驱动开发 ATDD(Accept ...

  2. python自动化之BDD框架之lettuce初识问题集

    最近在学习虫师老师编写的python自动化的书.其中讲到了BDD结构lettuce入门一章. 因为是小白,按部就班地进行操作,先不谈执行操作如何,先来讲讲遇到的几个坑,和怎么解决的: 第一坑:pyth ...

  3. bdd框架之lettuce

    安装 执行 :lettuce  (需要在特定的文件夹下) 结果指定到文件中

  4. python BDD&TDD

    教程一:行为驱动开发(BDD) 基于Python的行为驱动开发实战: http://python.jobbole.com/81303/ 基于Python的行为驱动开发实战 英语原文地址: http:/ ...

  5. BDD框架之lettuce---python3.+安装报错

    跟虫师学习python,学到BDD框架之lettuce( http://www.cnblogs.com/fnng/p/3415609.html),发现python3.5环境下安装lettuce后无法正 ...

  6. Python BDD自动化测试框架初探

    1. 什么是BDD BDD全称Behavior Driven Development,译作"行为驱动开发",是基于TDD (Test Driven Development 测试驱动 ...

  7. 收藏清单: python测试框架最全资源汇总

    xUnit frameworks 单元测试框架 frameworks 框架 unittest - python自带的单元测试库,开箱即用 unittest2 - 加强版的单元测试框架,适用于Pytho ...

  8. 转 python测试框架最全资源汇总

    转自: http://www.testclass.net/list/python_list_1/ xUnit frameworks(单元测试框架) frameworks 框架 unittest - p ...

  9. python测试框架&&数据生成&&工具最全资源汇总

    xUnit frameworks 单元测试框架frameworks 框架unittest - python自带的单元测试库,开箱即用unittest2 - 加强版的单元测试框架,适用于Python 2 ...

随机推荐

  1. [推荐]DDOS攻击与防范知识介绍

    [推荐]DDOS攻击与防范知识介绍 DDOS攻防体系建设v0.2(淘宝-林晓曦)     http://wenku.baidu.com/view/39549a11a8114431b90dd866.ht ...

  2. PHP 7問世,2億網站效能翻倍有望

    經過10年的漫長等待,PHP 7終於正式問世了.這個影響全球8成網站的開發語言,一舉從5.0版,跳過了功敗垂成的6.0版,一舉進入了7.0時代. 20年前初夏,1995年6月8日,一位愛解決問題的C語 ...

  3. Python:字符编码详解

    相关文章 Python中文编码问题:为何在控制台下输出中文会乱码及其原理 1. 字符编码简介 1.1. ASCII ASCII(American Standard Code for Informati ...

  4. int android.graphics.Bitmap.getRowBytes()

    int android.graphics.Bitmap.getRowBytes() Return the number of bytes between rows in the bitmap's pi ...

  5. Android 的EditText实现不可编辑

    android:editable is deprecated: Use an <EditText> to make it editable android:editable is depr ...

  6. Selenium 3 -how to locate the chromedriver and geckodriver place?

    Maybe you met these exceptions sometimes: 1. Chrome Driver The path to the driver executable must be ...

  7. SAP 系统管理内容

    SAP 系统管理内容包含非常广泛,从底层硬件起到各种操作系统及各种系统软件及SAP软件组件等都会涉及到.SAP系统支持主流的IBM AIX.HP UNIX.Windows.Linux平台及Oracle ...

  8. OpenStack云计算(二)——OpenStack 计算

    http://www.ibm.com/developerworks/cn/cloud/library/cl-openstack-nova-glance/

  9. 一个winform带你玩转rabbitMQ

    源码已放出 https://github.com/dubing/MaoyaRabbit 本章分3部分 一.安装部署初探 二.进阶 三.api相关 安装 部署 初探 先上图 一. 安装部署 下载 rab ...

  10. Android表情功能

    Android表情功能 标签(空格分隔): 未分类 转载自:android edittext插入表情(基于socket方式),并对文中不正确的内容进行整理和修正 [TOC] 涉及知识点: Androi ...