51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 2015|回复: 1
打印 上一主题 下一主题

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

[复制链接]
  • TA的每日心情
    无聊
    6 小时前
  • 签到天数: 1051 天

    连续签到: 1 天

    [LV.10]测试总司令

    跳转到指定楼层
    1#
    发表于 2020-8-11 10:16:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    Selenium之-数据驱动框架
      那么问题来了,什么是数据驱动呢?就是,数据的改变从而驱动自动化测试的执行,最终引起测试结果的改变,也就是参数的应用化。
      这里对于数据驱动测试,总结起来就是,数据驱动绝非读取文件(excel、csv、xml)中数据进行参数的赋值测试,因为采用的这种方式的测试,工作重心反而变成了如何读写文件,而对于自动化测试中关心的执行结果统计、断言结果反而不是那么容易去实现。尤其是测试页面结构发生大的调整时,文件类的字段调整获取也要发生较大的修改,所以文件数据驱动测试也是可以的,但是并不是最优解。
      那么什么才是最优的数据驱动测试呢?是的,用单元测试 unittest 结合 ddt 库。使用单元测试可以很方便的解决两个问题:
      (1)断言。利用单元测试的断言机制,我们可以方便的进行预期结果和实际结果的对比;
      (2)数据统计。执行完测试用例后,一共执行了多少条用例,执行成功多少,失败多少,失败的用例错误在哪里?单元测试框架会帮我们统计展示。
      1.DDT 入门
      Python 的 unittest 没有自带数据驱动功能,如果使用 unittest, 同时又想使用数据驱动,就用 DDT 吧。
    1. DDT 的使用方法:
    2.   (1) ddt.ddt --- 装饰类,也就是继承自 TestCase 的类;
    3.   (2) ddt.data --- 装饰测试方法,参数是一系列的值。
    4.   (3) ddt.file_data --- 装饰测试方法,参数是文件名。文件可以是 json 或 yaml 类型,除.yaml结尾的文件,其他文件均会作为json文件处理。
    5.   (4) ddt.unpack --- 传递的是复杂的数据结构是使用。如:元组或列表。添加到 unpack 上之后,ddt 会自动把元组或者列表对应到多个参数上。
    6.   (5) 测试用例方法名生成规则 ---
    7.   #!/usr/bin/env python
    8.   # -*- encoding: utf-8 -*-
    9.   """
    10.   [url=home.php?mod=space&uid=3428]@time[/url]    :   2020/4/17
    11.   [url=home.php?mod=space&uid=267564]@Author[/url]  :   
    12.   @Contact :   
    13.   [url=home.php?mod=space&uid=312218]@license[/url] :   (C)Copyright 2017-2019, Micro-Circle
    14.   [url=home.php?mod=space&uid=278149]@desc[/url]    :   None
    15.   """
    16.   import unittest
    17.   import ddt
    18.   @ddt.ddt
    19.   class DDTExample(unittest.TestCase):
    20.   @classmethod
    21.   def setUpClass(cls) -> None:
    22.   print(cls.__name__)
    23.   @classmethod
    24.   def tearDownClass(cls) -> None:
    25.   print('...end...')
    26.   @ddt.data(
    27.   [1, 2],
    28.   [3, 4],
    29.   [5, 6]
    30.   )
    31.   @ddt.unpack
    32.   def test_add(self, a, b):
    33.   print(a + b)
    34.   if __name__ == "__main__":
    35.   unittest.main()
    复制代码
    2.实践应用
      将 ddt 引入到自动化测试中。
    1. #!/usr/bin/env python
    2.   # -*- encoding: utf-8 -*-
    3.   """
    4.   @Time    :   2020/4/17
    5.   @Author  :   公众号:软测之家  更多技术干货,软测视频,面试资料请关注!
    6.   @Contact :   软件测试技术群:695458161
    7.   @License :   (C)Copyright 2017-2019, Micro-Circle
    8.   @Desc    :   None
    9.   """
    10.   import ddt
    11.   from page_object_model.register_business import RegisterBusiness
    12.   from selenium import webdriver
    13.   import unittest
    14.   from time import sleep
    15.   @ddt.ddt
    16.   class RegisterDdtCases(unittest.TestCase):
    17.   @classmethod
    18.   def setUpClass(cls) -> None:
    19.   cls.register_url = 'http://www.5itest.cn/register'
    20.   cls.driver = webdriver.Chrome('../tools/chromedriver.exe')
    21.   cls.driver.maximize_window()
    22.   cls.driver.get(cls.register_url)
    23.   sleep(3)
    24.   cls.rb = RegisterBusiness(cls.driver)
    25.   @classmethod
    26.   def tearDownClass(cls) -> None:
    27.   sleep(2)
    28.   cls.driver.close()
    29.   # 邮箱错误测试的测试用例
    30.   @ddt.data(
    31.   # 顺序分别是:注册邮箱、用户昵称、注册密码、验证码、错误信息定位元素、错误提示信息
    32.   ['123', 'test01', 'test01abc', 'tyu9'],
    33.   ['@163.com', 'test01', 'test01abc', 'tyu9'],
    34.   ['@163', 'test01', 'test01abc', 'tyu9']
    35.   )
    36.   @ddt.unpack
    37.   def test_ddt_email_error(self, register_email, nickname, password, captcha):
    38.   register_email_error = self.rb.register_email_error(register_email, nickname, password, captcha)
    39.   print("register_email_error: ", register_email_error)
    40.   self.assertFalse(register_email_error, '你输入的邮箱错误,但此条测试用例执行成功')
    41.   if __name__ == "__main__":
    42.   unittest.main()
    复制代码
     四、关键字驱动框架
      关键字简单来说就是,把我们的执行操作每一个关键步骤当成一个关键字来对待,用来驱动程序的设计开发。例如:进行web自动化我们的首要是打开浏览器,是的 “打开浏览器” 我们就可以作为一个关键字来对待它,关键字就是来驱动我们程序设计的关键步骤。通过关键字的改变从而驱动自动化测试的执行,最终引起测试结果的改变。
      ??对于测试一个注册页面,我们来梳理下看有哪些关键词,更深层次了解下关键词模型:
      (1) 打开浏览器 --->  打开浏览器
      (2) 输入注册页面的url --->  输入测试地址
      (3) 页面加载等待 ---> 页面加载等待
      (4) 输入(注册邮箱、用户名、密码、验证码)--->  输入元素
      (5) 点击注册按钮 ---> 点击元素
      (6) 退出浏览器
      1.构建关键词类
    1.   #!/usr/bin/env python
    2.   # -*- encoding: utf-8 -*-
    3.   """
    4.   @Time    :   2020/4/17
    5.   @Author  :   公众号:软测之家  更多技术干货,软测视频,面试资料请关注!
    6.   @Contact :   软件测试技术群:695458161
    7.   @License :   (C)Copyright 2017-2019, Micro-Circle
    8.   @Desc    :   None
    9.   """
    10.   class RegisterKeyword(object):
    11.   def __init__(self, driver):
    12.   self.fe = FindElement(driver)
    13.   # 打开浏览器
    14.   def open_browser(self, browser):
    15.   if browser == 'chrome':
    16.   self.driver = webdriver.Chrome('../tools/chromedriver.exe')
    17.   elif browser == 'firefox':
    18.   self.driver = webdriver.Firefox()
    19.   else:
    20.   self.driver = webdriver.Edge()
    21.   # 输入测试地址
    22.   def get_url(self, url):
    23.   self.driver.get(url)
    24.   # 定位元素
    25.   def get_element(self, key):
    26.   return self.fe.get_element(key)
    27.   # 输入元素
    28.   def send_element_key(self, key, value):
    29.   get_element = self.get_element(key)
    30.   get_element.send_keys(value)
    31.   # 点击元素
    32.   def click_element(self, key):
    33.   self.fe.get_element(key).click()
    34.   # 页面等待
    35.   @staticmethod
    36.   def wait_loading():
    37.   sleep(3)
    38.   # 关闭浏览器
    39.   def close_browser(self):
    40.   self.driver.close()
    41.   if __name__ == "__main__":
    42.   register_url = 'http://www.5itest.cn/register'
    43.   driver = webdriver.Chrome('../tools/chromedriver.exe')
    44.   driver.get(register_url)
    45.   rk = RegisterKeyword(driver)
    46.   print(rk.get_element('register_email'))
    47.   driver.close()
    复制代码
    2.关键词模型测试用例
      我们关键词方法直接从 register_keyword 中读取即可,但是测试数据从哪获取到从而传给相应的关键词方法呢?为了方便测试数据方便管理,我们可以将其存储到 Excel中去并获取。
      2.1 读取Excel
    1. #!/usr/bin/env python
    2.   # -*- encoding: utf-8 -*-
    3.   """
    4.   @Time    :   2020/4/17
    5.   @Author  :   公众号:软测之家  更多技术干货,软测视频,面试资料请关注!
    6.   @Contact :   软件测试技术群:695458161
    7.   @License :   (C)Copyright 2017-2019, Micro-Circle
    8.   @Desc    :   None
    9.   """
    10.   import xlrd
    11.   from xlutils.copy import copy
    12.   class ReadExcel(object):
    13.   def __init__(self, excel_path=None, index=None):
    14.   if excel_path is None:
    15.   self.excel_path = '../data/register_keyword_testdata.xls'
    16.   self.index = 0
    17.   else:
    18.   self.excel_path = excel_path
    19.   self.index = index
    20.   # 打开 excel 文件,获取数据列表
    21.   self.data = xlrd.open_workbook(self.excel_path)
    22.   # 读取第一 sheet 页的数据
    23.   self.table = self.data.sheets()[0]
    24.   def get_data(self):
    25.   result = []
    26.   rows = self.get_lines()
    27.   if rows != '':
    28.   for i in range(rows):
    29.   col = self.table.row_values(i)
    30.   result.append(col)
    31.   return result
    32.   return None
    33.   # 获取 excel 行数
    34.   def get_lines(self):
    35.   rows = self.table.nrows
    36.   if rows >= 1:
    37.   return rows
    38.   return None
    39.   # 获取单元格的值
    40.   def get_cell(self, row, col):
    41.   if self.get_lines() > row:
    42.   data = self.table.cell(row, col).value
    43.   return data
    44.   return None
    45.   def write_data(self, row, col, value):
    46.   read_data = xlrd.open_workbook(self.excel_path)
    47.   write_data = copy(read_data)
    48.   write_data.get_sheet(self.index).write(row, col, value)
    49.   write_data.save("../data/register_keyword_testdata.xls")
    50.   write_data.save(self.excel_path)
    51.   if __name__ == "__main__":
    52.   re = ReadExcel()
    53.   print(re.get_data())
    54.   print(re.get_lines())
    55.   print(re.get_cell(0, 0))
    56.   re.write_data(11, 0, 123456)
    复制代码
    2.2 测试用例实践
      前面将测试测数据存在到excel中了,接下来怎么写关键字对应的测试用例。
    1. (1) 拿到操作值,是否执行
    2.   (2) 拿到执行方法
    3.   (3) 拿到输入数据
    4.   (4) 是否有输入数据
    5.   执行方法(输入数据,操作元素)
    6.   没有输入数据
    7.   执行方法(操作元素)
    8.   (5) 对比预期结果和实际结果的值
    9.   对比结果一样,测试结论为pass;否则为fail
    10.   #!/usr/bin/env python
    11.   # -*- encoding: utf-8 -*-
    12.   """
    13.   @Time    :   2020/4/17
    14.   @Author  :   公众号:软测之家  更多技术干货,软测视频,面试资料请关注!
    15.   @Contact :   软件测试技术群:695458161
    16.   @License :   (C)Copyright 2017-2019, Micro-Circle
    17.   @Desc    :   None
    18.   """
    19.   from util.read_excel import ReadExcel
    20.   from keyword_model.register_keyword import RegisterKeyword
    21.   from selenium import webdriver
    22.   class RegisterKeywordCases(object):
    23.   def __init__(self):
    24.   self.rk = RegisterKeyword()
    25.   self.excel_path = '../data/register_keyword_testdata.xls'
    26.   # 执行关键字测试方法
    27.   def run_keyword_method(self, keyword_method, operator_element='', send_value=''):
    28.   print('keyword_method ---> ', keyword_method)
    29.   print("operator_element ---> ", operator_element)
    30.   print("send_value ---> ", send_value)
    31.   execute_method = getattr(self.rk, keyword_method)
    32.   print(execute_method)
    33.   if operator_element is '' and send_value is not '':
    34.   result = execute_method(send_value)
    35.   elif operator_element is not '' and send_value is '':
    36.   result = execute_method(operator_element)
    37.   elif operator_element is '' and send_value is '':
    38.   result = execute_method()
    39.   else:
    40.   result = execute_method(operator_element, send_value)
    41.   return result
    42.   # 执行关键词测试用例
    43.   def run_keyword_excel_cases(self):
    44.   handle_excel = ReadExcel(self.excel_path)
    45.   # 获取 excel 关键词测试用例的条数
    46.   cases_numbers = handle_excel.get_lines()
    47.   print("注册页获取到的关键词测试的测试用例条数为:%s" % cases_numbers)
    48.   # 循环遍历测试用例
    49.   if cases_numbers:
    50.   # 第 0 行是标题行不作为用例执行
    51.   for i in range(1, cases_numbers):
    52.   # 获取测试用例的名称
    53.   testcase_name = handle_excel.get_cell(i, 0)
    54.   # 获取用例是否执行
    55.   is_run = handle_excel.get_cell(i, 1)
    56.   if is_run == 'yes':
    57.   keyword_method = handle_excel.get_cell(i, 2)
    58.   operator_element = handle_excel.get_cell(i, 3)
    59.   send_value = handle_excel.get_cell(i, 4)
    60.   except_result = handle_excel.get_cell(i, 5)
    61.   actual_result = handle_excel.get_cell(i, 6)
    62.   # 反射
    63.   self.run_keyword_method(keyword_method, operator_element, send_value)
    64.   # if except_result is not '':
    65.   #     except_value = self.run_keyword_method(keyword_method)
    66.   else:
    67.   print('第 %s 条用例不执行,用例名称是: [%s],无预期结果' % (i, testcase_name))
    68.   else:
    69.   print("略略略~,请检查你是否有写测试用例!")
    70.   if __name__ == "__main__":
    71.   rkc = RegisterKeywordCases()
    72.   # rkc.run_keyword_method('open_browser', '', 'chrome')
    73.   # rkc.run_keyword_method('get_url', '', 'http://www.5itest.cn/register')
    74.   rkc.run_keyword_excel_cases()
    复制代码
    五、行为驱动模型
      什么是行为驱动测试呢?行为驱动(Behave Driven Development)测试,是一种敏捷的开发方法,通常应用在自动化测试中,通过使用自然描述语言确定自动化脚本。不喜欢这种方式用在自动化脚本里。






    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-11-26 15:49 , Processed in 0.065011 second(s), 22 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表