lettuce行为驱动框架实例
练习:
一:e1_MyFirstBDD 使用方法的方式实现阶乘的计算
zero.feature:
Feature: Compute factorial
In order to play with Lettuce
As beginners
We'll implement factorial Scenario: Factorial of 0
Given I have the number 0
When I compute its factorial
Then I see the number 1 Scenario: Factorial of 1
Given I have the number 1
When I compute its factorial
Then I see the number 1 Scenario: Factorial of 2
Given I have the number 2
When I compute its factorial
Then I see the number 2 Scenario: Factorial of 3
Given I have the number 3
When I compute its factorial
Then I see the number 6 steps.py:
#encoding=utf-8
from lettuce import * # 用于计算整数的阶乘函数
def factorial(number):
number = int(number)
if (number == 0) or (number == 1):
return 1
else:
return reduce(lambda x, y: x * y, range(1, number + 1)) #取出数据
@step('I have the number (\d+)')
def have_the_number(step, number):
# 将通过正则表达式匹配的数字存于全局变量world中
#world是公用的,不能变
#step对应的是I have the number,number参数名字是自定义的
world.number = int(number) #用测试数据调用测试方法
@step('I compute its factorial')
def compute_its_factorial(step):
# 从全局变量world中取出匹配的数字,
# 计算其阶乘,并将结果再存回world中
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
二:e2_MyFirstBDD 使用类的方式实现阶乘的计算
steps.py:
#encoding=utf-8
#这个例子是通过类的方式实现的
from lettuce import world, steps def factorial(number):
number = int(number)
if (number == 0) or (number == 1):
return 1
else:
return reduce(lambda x, y: x * y, range(1, number + 1)) @steps
class FactorialSteps(object):
"""Methods in exclude or starting with _ will not be considered as step"""
#定义哪些方法不需要执行,排除
exclude = ['set_number', 'get_number'] def __init__(self, environs):
# 初始全局变量
self.environs = environs def set_number(self, value):
# 设置全局变量中的number变量的值
# 实际上self.environs=world
self.environs.number = int(value) def get_number(self):
# 从全局变量中取出number的值
return self.environs.number #私有方法默认也不是测试步骤
def _assert_number_is(self, expected, msg="Got %d"):
number = self.get_number()
# 断言
assert number == expected, msg % number def have_the_number(self, step, number):
'''I have the number (\d+)'''
# 上面的三引号引起的代码必须写,并且必须是三引号引起
# 表示从场景步骤中获取需要的数据
# 并将获得数据存到环境变量number中
self.set_number(number) def i_compute_its_factorial(self, step):
"""When I compute its factorial"""
number = self.get_number()
# 调用factorial方法进行阶乘结算,
# 并将结算结果存于全局变量中的number中
self.set_number(factorial(number)) def check_number(self, step, expected):
'''I see the number (\d+)'''
# 上面的三引号引起的代码必须写,并且必须是三引号引起
# 表示从场景步骤中获取需要的数据以便断言测试结果
self._assert_number_is(int(expected)) #world可以理解为一个类,存全局共享变量的对象
FactorialSteps(world)
三:e3_StepDataTables 基于表格的方式实现查找出名字以"G"开头的学生
student.feature
Feature: bill students alphabetically
In order to bill students properly
As a financial specialist
I want to bill those which name starts with some letter Scenario: Bill students which name starts with "G"
Given I have the following students in my database:
| name | monthly_due | billed |
| Anton | $ 500 | no |
| Jack | $ 400 | no |
| Gabriel | $ 300 | no |
| Gloria | $ 442.65 | no |
| Ken | $ 907.86 | no |
| Leonard | $ 742.84 | no |
When I bill names starting with "G"
Then I see those billed students:
| name | monthly_due | billed |
| Gabriel | $ 300 | no |
| Gloria | $ 442.65 | no |
And those that weren't:
| name | monthly_due | billed |
| Anton | $ 500 | no |
| Jack | $ 400 | no |
| Ken | $ 907.86 | no |
| Leonard | $ 742.84 | no | step.py:
#encoding=utf-8
from lettuce import * #基于表格数据来做测试
@step('I have the following students in my database:')
def students_in_database(step):
#获取自然语言写的表格数据,用哈希的方法,返回的是个列表
if step.hashes:
# 如果存在步骤表格数据,则继续后续步骤
print type(step.hashes)
assert step.hashes == [
{
'name': 'Anton',
'monthly_due': '$ 500',
'billed': 'no'
},
{
'name': 'Jack',
'monthly_due': '$ 400',
'billed': 'no'
},
{
'name': 'Gabriel',
'monthly_due': '$ 300',
'billed': 'no'
},
{
'name': 'Gloria',
'monthly_due': '$ 442.65',
'billed': 'no'
},
{
'name': 'Ken',
'monthly_due': '$ 907.86',
'billed': 'no'
},
{
'name': 'Leonard',
'monthly_due': '$ 742.84',
'billed': 'no'
},
] #通过正则获取到的(.*)这个分组,给参数startAlpha
@step('I bill names starting with "(.*)"')
def match_starting(step, startAlpha):
# 将通过正则表达式匹配步骤中最后一个字母,
# 并存于全局变量startAlpha中
world.startAlpha = startAlpha
print "no data exist:",step.hashes
print "" @step('I see those billed students:')
def get_starting_with_G_student(step):
#遍历步骤数据表中的数据
for i in step.hashes:
# 断言学生的名字是否以world.startAlpha变量存取的字母开头ͷ
assert i["name"].startswith(world.startAlpha) @step("those that weren't:")
def result(step):
for j in step.hashes:
# 断言学生名字不以world.startAlpha变量存取的的字母开头ͷ
assert world.startAlpha not in j["name"][0]
四:e4_English_example 英文模板
sogou.feature
Feature: Search in Sogou website
In order to Search in Sogou website
As a visitor
We'll search the NBA best player Scenario: Search NBA player
Given I have the english name "<search_name>"
When I search it in Sogou website
Then I see the entire name "<search_result>" Examples:
| search_name | search_result |
| Jordan | Michael |
| Curry | Stephen |
| Kobe | Bryant | sogou.py:
#encoding=utf-8
from lettuce import *
from selenium import webdriver
import time @step('I have the english name "(.*)"')
def have_the_searchWord(step, searchWord):
world.searchWord = str(searchWord)
print world.searchWord @step('I search it in Sogou website')
def search_in_sogou_website(step):
world.driver = webdriver.Ie(executable_path = "c:\\IEDriverServer")
world.driver.get("http://www.sogou.com")
world.driver.find_element_by_id("query").send_keys(world.searchWord)
world.driver.find_element_by_id("stb").click()
time.sleep(3) @step('I see the entire name "(.*)"')
def check_result_in_sogou(step, searchResult):
assert searchResult in world.driver.page_source, "got word:%s" %searchResult
world.driver.quit() 五:e5_Chinese_example 中文模板
baidu.feature:
#encoding=utf-8
# language: zh-CN 特性: 在百度网址搜索IT相关书籍
能够搜索到书的作者,比如吴晓华 场景: 在百度网站搜索IT相关书籍
如果将搜索词设定为书的名字"<书名>"
当打开百度网站
和在搜索输入框中输入搜索的关键词,并点击搜索按钮后
那么在搜索结果中可以看到书的作者"<作者>" 例如:
| 书名 | 作者 |
| Selenium WebDriver实战宝典 | 吴晓华 |
| HTTP权威指南 | 协议 |
| Python核心编程 | Python | baidu.py:
#encoding=utf-8
# language: zh-CN
from lettuce import *
from selenium import webdriver
import time @step(u'将搜索词设定为书的名字"(.*)"')
def have_the_searchWord(step, searchWord):
world.searchWord = searchWord
print world.searchWord @step(u'打开百度网站')
def visit_baidu_website(step):
world.driver = webdriver.Ie(executable_path = "c:\\IEDriverServer")
world.driver.get("http://www.baidu.com") @step(u'在搜索输入框中输入搜索的关键词,并点击搜索按钮后')
def search_in_sogou_website(step):
world.driver.find_element_by_id("kw").send_keys(world.searchWord)
world.driver.find_element_by_id("su").click()
time.sleep(3) @step(u'在搜索结果中可以看到书的作者"(.*)"')
def check_result_in_sogou(step, searchResult):
assert searchResult in world.driver.page_source, "got word:%s" %searchResult
world.driver.quit() 六:e6_executed_by_batch 批量执行
Login_Chinese.feature:
#encoding=utf-8
# language: zh-CN 特性: 登录126邮箱和退出126邮箱登录 场景: 成功登录126邮箱
假如启动一个浏览器
当用户访问http://mail.126.com网址
当用户输入输入用户名“testman1980”和密码“wulaoshi1978”
那么页面会出现“未读邮件”关键字 场景: 成功退出126邮箱
当用户从页面单击退出链接
那么页面显示“您已成功退出网易邮箱”关键内容 Login_Chinese.py:
#encoding=utf-8
# language: zh-CN
from lettuce import *
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time @step(u'启动一个浏览器')
def open_browser(step):
try:
# 创建Chrome浏览器的driver实例,并存于全局对象world中,
# 供后续场景或步骤函数使用
world.driver = webdriver.Ie(executable_path = "c:\\IEDriverServer")
except Exception, e:
raise e @step(u'用户访问(.*)网址')
def visit_url(step, url):
print url
world.driver.get(url) @step(u'用户输入输入用户名“(.*)”和密码“(.*)”')
def user_enters_UserName_and_Password(step, username, password):
print username, password
# 浏览器窗口最大化
world.driver.maximize_window()
time.sleep(3)
# 切换进frame控件
world.driver.switch_to.frame("x-URS-iframe")
# 获取用户名输入框
userName = world.driver.find_element_by_xpath('//input[@name="email"]')
userName.clear()
# 输入用户名
userName.send_keys(username)
# 获取密码输入框
pwd = world.driver.find_element_by_xpath("//input[@name='password']")
# 输入密码
pwd.send_keys(password)
# 发送一个回车键
pwd.send_keys(Keys.RETURN)
# 等待15秒,以便登录后成功进入登录后的页面
time.sleep(15) @step(u'页面会出现“(.*)”关键字')
def message_displayed_Login_Successfully(step, keywords):
# print world.driver.page_source.encode('utf-8')
# 断言登录成功后,页面是否出现预期的关键字
assert keywords in world.driver.page_source
# 断言成功后,打印登录成功信息
print "Login Success" @step(u'用户从页面单击退出链接')
def LogOut_from_the_Application(step):
print "====",world.driver
# time.sleep(5)
# 点击退出按钮,退出登录
world.driver.find_element_by_link_text(u"退出").click()
time.sleep(8) @step(u'页面显示“(.*)”关键内容')
def displayed_LogOut_Successfully(step, keywords):
# 断言退出登录后,页面是否出现退出成功关键内容
assert keywords in world.driver.page_source
print u"Logout Success"
# 退出浏览器
world.driver.quit() 七:e7_example 行为驱动实现1+2=3
zero.feature:
Feature: Compute factorial
In order to play with Lettuce
As beginners
We'll implement factorial Scenario: Factorial of 1
Given I have the number 1,2
When I compute its factorial
Then I see the number 3 step.py:
#encoding=utf-8
from lettuce import * # 用于计算整数的和函数
def sum(number1,number2):
return int(number1+number2) @step('I have the number (\d),(\d+)')
def have_the_number(step, number1,number2):
# 将通过正则表达式匹配的数字存于全局变量world中
world.number1 = int(number1)
world.number2 = int(number2) @step('I compute its factorial')
def compute_its_factorial(step):
# 从全局变量world中取出匹配的数字,
# 计算其阶乘,并将结果再存回world中
world.sum = sum(world.number1,world.number2) @step('I see the number (\d+)')
def check_number(step, expected):
# 通过正则匹配到预期数字
expected = int(expected)
# 断言计算阶乘结果是否等于预期
assert world.sum == expected, "Got %d" %world.number
lettuce行为驱动框架实例的更多相关文章
- 基于Mongodb的轻量级领域驱动框架(序)
混园子也有些年头了,从各个大牛那儿学了很多东西.技术这东西和中国的料理一样,其中技巧和经验,代代相传(这不是舌尖上的中国广告).转身回头一望,几年来自己也积累了一些东西,五花八门涉猎到各种方向,今日开 ...
- Linux设备驱动框架设计
引子 Linux操作系统的一大优势就是支持数以万计的芯片设备,大大小小的芯片厂商工程师都在积极地向Linux kernel提交设备驱动代码.能让这个目标得以实现,这背后隐藏着一个看不见的技术优势:Li ...
- I2C子系统驱动框架及应用 (转)
I2C子系统驱动框架: 应用程序层(app层) ——————————————————————————————————– i2c driver层: 从设备驱动层(TS Sensor等) 1. ...
- spi驱动框架全面分析,从master驱动到设备驱动
内核版本:linux2.6.32.2 硬件资源:s3c2440 参考: 韦东山SPI视频教程 内容概括: 1.I2C 驱动框架回顾 2.SPI 框架简单介绍 3.maste ...
- 宋宝华:Linux设备驱动框架里的设计模式之——模板方法(Template Method)
本文系转载,著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 作者: 宋宝华 来源: 微信公众号linux阅码场(id: linuxdev) 前言 <设计模式>这本经典 ...
- Linux 驱动框架---dm9000分析
前面学习了下Linux下的网络设备驱动程序的框架inux 驱动框架---net驱动框架,感觉知道了一个机器的大致结构还是不太清楚具体的细节处是怎么处理的,所以今天就来以dm9000这个网上教程最多的驱 ...
- Linux 驱动框架---net驱动框架
这一篇主要是学习网络设备驱动框架性的东西具体的实例分析可以参考Linux 驱动框架---dm9000分析 .Linux 对于网络设备的驱动的定义分了四层分别是网络接口层对上是IP,ARP等网络协议,因 ...
- Linux 驱动框架---linux 设备
Linux 设备 Linux驱动中的三大主要基础成员主要是设备,总线和驱动.今天先来从设备开始分析先把设备相关的数据结构放到这里方便后面看到来查,其中有些进行了简单的注释. struct device ...
- Linux 驱动框架---i2c驱动框架
i2c驱动在Linux通过一个周的学习后发现i2c总线的驱动框架还是和Linux整体的驱动框架是相同的,思想并不特殊比较复杂的内容如i2c核心的内容都是内核驱动框架实现完成的,今天我们暂时只分析驱动开 ...
随机推荐
- 各种数据库连接字符串 -- c#
sqlite : connectionString="Data Source=|DataDirectory|\databasename.db;Pooling=true;FailIfMissi ...
- windows下python操作mysql模块安装
百度教程说安装 pip install mysqldb 这在我的电脑上安装失败: Could not find a version that satisfies the requirement mys ...
- Docker Macvlan 应用部署
Docker Macvlan 应用部署 MacVLAN有两种桥接模式 Bridge模式:不创建子接口的情况下直接去桥接物理接口.直接桥接到与宿主级的同网段. VLAN Bridge模式:创建子接口去桥 ...
- Python sqlalchemy orm 常用操作
增add # 创建表1 # 注:高级封装 import sqlalchemy # 调用链接数据库 from sqlalchemy import create_engine # 调用基类Base fro ...
- Mybaties 实现批量修改
通常我们在做批量更新的时候都会用in 去操作,但in的数据量一上来,就变的缓慢了 修改方案: <update id="updateShufflingSeq" paramete ...
- Spring IOC 注入方式详解 附代码
引言 Spring框架作为优秀的开源框架之一,深受各大Java开发者的追捧,相信对于大家来说并不陌生,Spring之所以这么流行,少不了他的两大核心技术IOC和IOP.我们这里重点讲述Spring框架 ...
- java基础语法2.
第二章 2.1 class文件的生成 java文件为源代码文件 class为程序. class文件实时修改. eclipse自动生成. project下面clean. 2.2 jar文件 如何将有用的 ...
- Windows Server 2008 R2 下载地址
以下资源均来自微软 MSDN,是原汁原味的原版系统资源,值得系统爱好者收藏.以下多数链接是 ed2k 链接,推荐使用国外开源的 eMule 下载,亦可使用迅雷,但使用 eMule 更有利于共享资源. ...
- 解决github访问及上传慢的问题
在本地host文件中添加映射 http://tool.chinaz.com/dns , 查询 github.global.ssl.fastly.net 和 assets-cdn.github.com ...
- Codeforces 147 B. Smile House
题目链接:http://codeforces.com/contest/147/problem/B 求有向图的最小正权环的大小 ${n<=300}$ 非常显然的有${n^{3}log^2}$的 ...