lettuce行为驱动框架实例
Posted jingsheng99
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 "1" @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行为驱动框架实例的主要内容,如果未能解决你的问题,请参考以下文章