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

tech2022-08-11  120

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 unittest   import ddt   @ddt.ddt   class DDTExample(unittest.TestCase):   @classmethod   def setUpClass(cls) -> None:   print(cls.__name__)   @classmethod   def tearDownClass(cls) -> None:   print('...end...')   @ddt.data(   [1, 2],   [3, 4],   [5, 6]   )   @ddt.unpack   def 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 ddt   from page_object_model.register_business import RegisterBusiness   from selenium import webdriver   import unittest   from time import sleep   @ddt.ddt   class RegisterDdtCases(unittest.TestCase):   @classmethod   def 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)   @classmethod   def tearDownClass(cls) -> None:   sleep(2)   cls.driver.close()   # 邮箱错误测试的测试用例   @ddt.data(   # 顺序分别是:注册邮箱、用户昵称、注册密码、验证码、错误信息定位元素、错误提示信息   ['123', 'test01', 'test01abc', 'tyu9'],   ['@163.com', 'test01', 'test01abc', 'tyu9'],   ['@163', 'test01', 'test01abc', 'tyu9']   )   @ddt.unpack   def 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()   # 页面等待   @staticmethod   def 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 xlrd   from xlutils.copy import copy   class 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 = 0   else:   self.excel_path = excel_path   self.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 result   return None   # 获取 excel 行数   def get_lines(self):   rows = self.table.nrows   if rows >= 1:   return rows   return None   # 获取单元格的值   def get_cell(self, row, col):   if self.get_lines() > row:   data = self.table.cell(row, col).value   return data   return None   def 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 ReadExcel   from keyword_model.register_keyword import RegisterKeyword   from selenium import webdriver   class 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)测试,是一种敏捷的开发方法,通常应用在自动化测试中,通过使用自然描述语言确定自动化脚本。不喜欢这种方式用在自动化脚本里。   

上面是我收集的一些视频资源,在这个过程中帮到了我很多。如果你不想再体验一次自学时找不到资料,没人解答问题,坚持几天便放弃的感受的话,可以加入我们群【902061117】,里面有各种软件测试资源和技术讨论。

当然还有面试,面试一般分为技术面和hr面,形式的话很少有群面,少部分企业可能会有一个交叉面,不过总的来说,技术面基本就是考察你的专业技术水平的,hr面的话主要是看这个人的综合素质以及家庭情况符不符合公司要求,一般来讲,技术的话只要通过了技术面hr面基本上是没有问题(也有少数企业hr面会刷很多人) 我们主要来说技术面,技术面的话主要是考察专业技术知识和水平,上面也是我整理好的精选面试题。 加油吧,测试人!如果你需要提升规划,那就行动吧,在路上总比在起点观望的要好。事必有法,然后有成。 资源不错就给个推荐吧~

最新回复(0)