热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

python+selenium实现Web自动化:数据驱动框架,关键字驱动框架

Selenium之-数据驱动框架那么问题来了,什么是数据驱动呢?就是,数据的改变从而驱动自动化测试的执行,最终引起测试结

Selenium之-数据驱动框架
  那么问题来了,什么是数据驱动呢?就是,数据的改变从而驱动自动化测试的执行,最终引起测试结果的改变,也就是参数的应用化。
  这里对于数据驱动测试,总结起来就是,数据驱动绝非读取文件(excel、csv、xml)中数据进行参数的赋值测试,因为采用的这种方式的测试,工作重心反而变成了如何读写文件,而对于自动化测试中关心的执行结果统计、断言结果反而不是那么容易去实现。尤其是测试页面结构发生大的调整时,文件类的字段调整获取也要发生较大的修改,所以文件数据驱动测试也是可以的,但是并不是最优解。
  那么什么才是最优的数据驱动测试呢?是的,用单元测试 unittest 结合 ddt 库。使用单元测试可以很方便的解决两个问题:
  (1)断言。利用单元测试的断言机制,我们可以方便的进行预期结果和实际结果的对比;
  (2)数据统计。执行完测试用例后,一共执行了多少条用例,执行成功多少,失败多少,失败的用例错误在哪里?单元测试框架会帮我们统计展示。
  1.DDT 入门
  Python 的 unittest 没有自带数据驱动功能,如果使用 unittest, 同时又想使用数据驱动,就用 DDT 吧。

DDT 的使用方法:(1) ddt.ddt --- 装饰类,也就是继承自 TestCase 的类;(2) ddt.data --- 装饰测试方法,参数是一系列的值。(3) ddt.file_data --- 装饰测试方法,参数是文件名。文件可以是 json 或 yaml 类型,除.yaml结尾的文件,其他文件均会作为json文件处理。(4) ddt.unpack --- 传递的是复杂的数据结构是使用。如:元组或列表。添加到 unpack 上之后,ddt 会自动把元组或者列表对应到多个参数上。(5) 测试用例方法名生成规则 ---#!/usr/bin/env python# -*- encoding: utf-8 -*-"""[url=home.php?mod=space&uid=3428]@time[/url] : 2020/4/17[url=home.php?mod=space&uid=267564]@Author[/url] : @Contact : [url=home.php?mod=space&uid=312218]@license[/url] : (C)Copyright 2017-2019, Micro-Circle[url=home.php?mod=space&uid=278149]@desc[/url] : None"""import unittestimport ddt@ddt.ddtclass DDTExample(unittest.TestCase):@classmethoddef setUpClass(cls) -> None:print(cls.__name__)@classmethoddef tearDownClass(cls) -> None:print('...end...')@ddt.data([1, 2],[3, 4],[5, 6])@ddt.unpackdef test_add(self, a, b):print(a + b)if __name__ == "__main__":unittest.main()

2.实践应用
  将 ddt 引入到自动化测试中。

#!/usr/bin/env python# -*- encoding: utf-8 -*-"""@Time : 2020/4/17@Author : 公众号:软测之家 更多技术干货,软测视频,面试资料请关注!@Contact : 软件测试技术群:695458161@License : (C)Copyright 2017-2019, Micro-Circle@Desc : None"""import ddtfrom page_object_model.register_business import RegisterBusinessfrom selenium import webdriverimport unittestfrom time import sleep@ddt.ddtclass RegisterDdtCases(unittest.TestCase):@classmethoddef setUpClass(cls) -> None:cls.register_url = 'http://www.5itest.cn/register'cls.driver = webdriver.Chrome('../tools/chromedriver.exe')cls.driver.maximize_window()cls.driver.get(cls.register_url)sleep(3)cls.rb = RegisterBusiness(cls.driver)@classmethoddef tearDownClass(cls) -> None:sleep(2)cls.driver.close()# 邮箱错误测试的测试用例@ddt.data(# 顺序分别是:注册邮箱、用户昵称、注册密码、验证码、错误信息定位元素、错误提示信息['123', 'test01', 'test01abc', 'tyu9'],['@163.com', 'test01', 'test01abc', 'tyu9'],['@163', 'test01', 'test01abc', 'tyu9'])@ddt.unpackdef test_ddt_email_error(self, register_email, nickname, password, captcha):register_email_error = self.rb.register_email_error(register_email, nickname, password, captcha)print("register_email_error: ", register_email_error)self.assertFalse(register_email_error, '你输入的邮箱错误,但此条测试用例执行成功')if __name__ == "__main__":unittest.main()

关键字驱动框架
  关键字简单来说就是,把我们的执行操作每一个关键步骤当成一个关键字来对待,用来驱动程序的设计开发。例如:进行web自动化我们的首要是打开浏览器,是的 “打开浏览器” 我们就可以作为一个关键字来对待它,关键字就是来驱动我们程序设计的关键步骤。通过关键字的改变从而驱动自动化测试的执行,最终引起测试结果的改变。
  ??对于测试一个注册页面,我们来梳理下看有哪些关键词,更深层次了解下关键词模型:
  (1) 打开浏览器 —> 打开浏览器
  (2) 输入注册页面的url —> 输入测试地址
  (3) 页面加载等待 —> 页面加载等待
  (4) 输入(注册邮箱、用户名、密码、验证码)—> 输入元素
  (5) 点击注册按钮 —> 点击元素
  (6) 退出浏览器
  1.构建关键词类

#!/usr/bin/env python# -*- encoding: utf-8 -*-"""@Time : 2020/4/17@Author : 公众号:软测之家 更多技术干货,软测视频,面试资料请关注!@Contact : 软件测试技术群:695458161@License : (C)Copyright 2017-2019, Micro-Circle@Desc : None"""class RegisterKeyword(object):def __init__(self, driver):self.fe = FindElement(driver)# 打开浏览器def open_browser(self, browser):if browser == 'chrome':self.driver = webdriver.Chrome('../tools/chromedriver.exe')elif browser == 'firefox':self.driver = webdriver.Firefox()else:self.driver = webdriver.Edge()# 输入测试地址def get_url(self, url):self.driver.get(url)# 定位元素def get_element(self, key):return self.fe.get_element(key)# 输入元素def send_element_key(self, key, value):get_element = self.get_element(key)get_element.send_keys(value)# 点击元素def click_element(self, key):self.fe.get_element(key).click()# 页面等待@staticmethoddef wait_loading():sleep(3)# 关闭浏览器def close_browser(self):self.driver.close()if __name__ == "__main__":register_url = 'http://www.5itest.cn/register'driver = webdriver.Chrome('../tools/chromedriver.exe')driver.get(register_url)rk = RegisterKeyword(driver)print(rk.get_element('register_email'))driver.close()

2.关键词模型测试用例
  我们关键词方法直接从 register_keyword 中读取即可,但是测试数据从哪获取到从而传给相应的关键词方法呢?为了方便测试数据方便管理,我们可以将其存储到 Excel中去并获取。
  2.1 读取Excel

#!/usr/bin/env python# -*- encoding: utf-8 -*-"""@Time : 2020/4/17@Author : 公众号:软测之家 更多技术干货,软测视频,面试资料请关注!@Contact : 软件测试技术群:695458161@License : (C)Copyright 2017-2019, Micro-Circle@Desc : None"""import xlrdfrom xlutils.copy import copyclass ReadExcel(object):def __init__(self, excel_path=None, index=None):if excel_path is None:self.excel_path = '../data/register_keyword_testdata.xls'self.index = 0else:self.excel_path = excel_pathself.index = index# 打开 excel 文件,获取数据列表self.data = xlrd.open_workbook(self.excel_path)# 读取第一 sheet 页的数据self.table = self.data.sheets()[0]def get_data(self):result = []rows = self.get_lines()if rows != '':for i in range(rows):col = self.table.row_values(i)result.append(col)return resultreturn None# 获取 excel 行数def get_lines(self):rows = self.table.nrowsif rows >= 1:return rowsreturn None# 获取单元格的值def get_cell(self, row, col):if self.get_lines() > row:data = self.table.cell(row, col).valuereturn datareturn Nonedef write_data(self, row, col, value):read_data = xlrd.open_workbook(self.excel_path)write_data = copy(read_data)write_data.get_sheet(self.index).write(row, col, value)write_data.save("../data/register_keyword_testdata.xls")write_data.save(self.excel_path)if __name__ == "__main__":re = ReadExcel()print(re.get_data())print(re.get_lines())print(re.get_cell(0, 0))re.write_data(11, 0, 123456)

2.2 测试用例实践
  前面将测试测数据存在到excel中了,接下来怎么写关键字对应的测试用例。

(1) 拿到操作值,是否执行(2) 拿到执行方法(3) 拿到输入数据(4) 是否有输入数据执行方法(输入数据,操作元素)没有输入数据执行方法(操作元素)(5) 对比预期结果和实际结果的值对比结果一样,测试结论为pass;否则为fail#!/usr/bin/env python# -*- encoding: utf-8 -*-"""@Time : 2020/4/17@Author : 公众号:软测之家 更多技术干货,软测视频,面试资料请关注!@Contact : 软件测试技术群:695458161@License : (C)Copyright 2017-2019, Micro-Circle@Desc : None"""from util.read_excel import ReadExcelfrom keyword_model.register_keyword import RegisterKeywordfrom selenium import webdriverclass RegisterKeywordCases(object):def __init__(self):self.rk = RegisterKeyword()self.excel_path = '../data/register_keyword_testdata.xls'# 执行关键字测试方法def run_keyword_method(self, keyword_method, operator_element='', send_value=''):print('keyword_method ---> ', keyword_method)print("operator_element ---> ", operator_element)print("send_value ---> ", send_value)execute_method = getattr(self.rk, keyword_method)print(execute_method)if operator_element is '' and send_value is not '':result = execute_method(send_value)elif operator_element is not '' and send_value is '':result = execute_method(operator_element)elif operator_element is '' and send_value is '':result = execute_method()else:result = execute_method(operator_element, send_value)return result# 执行关键词测试用例def run_keyword_excel_cases(self):handle_excel = ReadExcel(self.excel_path)# 获取 excel 关键词测试用例的条数cases_numbers = handle_excel.get_lines()print("注册页获取到的关键词测试的测试用例条数为:%s" % cases_numbers)# 循环遍历测试用例if cases_numbers:# 第 0 行是标题行不作为用例执行for i in range(1, cases_numbers):# 获取测试用例的名称testcase_name = handle_excel.get_cell(i, 0)# 获取用例是否执行is_run = handle_excel.get_cell(i, 1)if is_run == 'yes':keyword_method = handle_excel.get_cell(i, 2)operator_element = handle_excel.get_cell(i, 3)send_value = handle_excel.get_cell(i, 4)except_result = handle_excel.get_cell(i, 5)actual_result = handle_excel.get_cell(i, 6)# 反射self.run_keyword_method(keyword_method, operator_element, send_value)# if except_result is not '':# except_value = self.run_keyword_method(keyword_method)else:print('第 %s 条用例不执行,用例名称是: [%s],无预期结果' % (i, testcase_name))else:print("略略略~,请检查你是否有写测试用例!")if __name__ == "__main__":rkc = RegisterKeywordCases()# rkc.run_keyword_method('open_browser', '', 'chrome')# rkc.run_keyword_method('get_url', '', 'http://www.5itest.cn/register')rkc.run_keyword_excel_cases()

五、行为驱动模型
  什么是行为驱动测试呢?行为驱动(Behave Driven Development)测试,是一种敏捷的开发方法,通常应用在自动化测试中,通过使用自然描述语言确定自动化脚本。不喜欢这种方式用在自动化脚本里。

技能提升

最后感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走
在这里插入图片描述
这些资料,对于做【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!凡事要趁早,特别是技术行业,一定要提升技术功底。希望对大家有所帮助…….
在这里插入图片描述


推荐阅读
  • 第六章:枚举类型与switch结构的应用分析
    第六章深入探讨了枚举类型与 `switch` 结构在编程中的应用。枚举类型(`enum`)是一种将一组相关常量组织在一起的数据类型,广泛存在于多种编程语言中。例如,在 Cocoa 框架中,处理文本对齐时常用 `NSTextAlignment` 枚举来表示不同的对齐方式。通过结合 `switch` 结构,可以更清晰、高效地实现基于枚举值的逻辑分支,提高代码的可读性和维护性。 ... [详细]
  • Objective-C 中的委托模式详解与应用 ... [详细]
  • 本文探讨了如何利用 jQuery 的 JSONP 技术实现跨域调用外部 Web 服务。通过详细解析 JSONP 的工作原理及其在 jQuery 中的应用,本文提供了实用的代码示例和最佳实践,帮助开发者解决跨域请求中的常见问题。 ... [详细]
  • JavaScript XML操作实用工具类:XmlUtilsJS技巧与应用 ... [详细]
  • Python 伦理黑客技术:深入探讨后门攻击(第三部分)
    在《Python 伦理黑客技术:深入探讨后门攻击(第三部分)》中,作者详细分析了后门攻击中的Socket问题。由于TCP协议基于流,难以确定消息批次的结束点,这给后门攻击的实现带来了挑战。为了解决这一问题,文章提出了一系列有效的技术方案,包括使用特定的分隔符和长度前缀,以确保数据包的准确传输和解析。这些方法不仅提高了攻击的隐蔽性和可靠性,还为安全研究人员提供了宝贵的参考。 ... [详细]
  • 本文介绍了如何利用 Delphi 中的 IdTCPServer 和 IdTCPClient 控件实现高效的文件传输。这些控件在默认情况下采用阻塞模式,并且服务器端已经集成了多线程处理,能够支持任意大小的文件传输,无需担心数据包大小的限制。与传统的 ClientSocket 相比,Indy 控件提供了更为简洁和可靠的解决方案,特别适用于开发高性能的网络文件传输应用程序。 ... [详细]
  • 在当前的软件开发领域,Lua 作为一种轻量级脚本语言,在 .NET 生态系统中的应用逐渐受到关注。本文探讨了 Lua 在 .NET 环境下的集成方法及其面临的挑战,包括性能优化、互操作性和生态支持等方面。尽管存在一定的技术障碍,但通过不断的学习和实践,开发者能够克服这些困难,拓展 Lua 在 .NET 中的应用场景。 ... [详细]
  • SQL 查询实体优化与实战技巧分享 ... [详细]
  • 本文介绍了如何利用ObjectMapper实现JSON与JavaBean之间的高效转换。ObjectMapper是Jackson库的核心组件,能够便捷地将Java对象序列化为JSON格式,并支持从JSON、XML以及文件等多种数据源反序列化为Java对象。此外,还探讨了在实际应用中如何优化转换性能,以提升系统整体效率。 ... [详细]
  • 技术日志:使用 Ruby 爬虫抓取拉勾网职位数据并生成词云分析报告
    技术日志:使用 Ruby 爬虫抓取拉勾网职位数据并生成词云分析报告 ... [详细]
  • REST与RPC:选择哪种API架构风格?
    在探讨REST与RPC这两种API架构风格的选择时,本文首先介绍了RPC(远程过程调用)的概念。RPC允许客户端通过网络调用远程服务器上的函数或方法,从而实现分布式系统的功能调用。相比之下,REST(Representational State Transfer)则基于资源的交互模型,通过HTTP协议进行数据传输和操作。本文将详细分析两种架构风格的特点、适用场景及其优缺点,帮助开发者根据具体需求做出合适的选择。 ... [详细]
  • 本文探讨了利用JavaScript实现集合的对称差集算法的方法。该算法旨在处理多个数组作为输入参数,同时保留每个数组中元素的原始顺序。算法不会移除单个数组内的重复元素,但会删除在不同数组之间出现的重复项。通过这种方式,能够有效地计算出多个数组的对称差集。 ... [详细]
  • 如何使用mysql_nd:Python连接MySQL数据库的优雅指南
    无论是进行机器学习、Web开发还是爬虫项目,数据库操作都是必不可少的一环。本文将详细介绍如何使用Python通过 `mysql_nd` 库与 MySQL 数据库进行高效连接和数据交互。内容涵盖以下几个方面: ... [详细]
  • 蓝桥杯物联网基础教程:通过GPIO输入控制LED5的点亮与熄灭
    本教程详细介绍了如何利用STM32的GPIO接口通过输入信号控制LED5的点亮与熄灭。内容涵盖GPIO的基本配置、按键检测及LED驱动方法,适合具有STM32基础的读者学习和实践。 ... [详细]
  • Java解析YAML文件并转换为JSON格式(支持JSON与XML的结构化查询)
    本文探讨了如何利用Java解析YAML文件并将其转换为JSON格式,同时支持JSON和XML的结构化查询。YAML、JSON和XML这三种数据格式通过其名称作为文件扩展名,便于区分和使用。文章详细介绍了这些格式的层次结构和数据表示方法,并重点讨论了在数据传输过程中,XML的特性和优势。此外,还提供了具体的代码示例和实现步骤,帮助开发者高效地进行数据格式转换和查询操作。 ... [详细]
author-avatar
成长的人走在路上_774
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有