Python自动化测试的五种模型

发表于:2023-9-05 09:24

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:Meng    来源:网络

  1、前言
  在自动化测试中,我们往往将自动化脚本都归纳属于哪种框架模型,比如关键字驱动模型等。
  本篇将列举实际自动化测试中,Python 自动化测试的五种模型:线性模型、模块化驱动模型、数据驱动模型、关键字驱动模型、行为驱动模型。
  2、线性模型
  通过录制或编写脚本,一个脚本完成一个场景(一组完整功能操作),通过对脚本的回放进行自动化测试。
  脚本代码:
  #!/usr/bin/env python
  # -*- coding: utf-8 -*-
  # 公众号:AllTests软件测试
  import time
  from selenium import webdriver
  driver = webdriver.Chrome()
  driver.maximize_window()
  driver.implicitly_wait(30)
  driver.get('https://www.baidu.com/')
  time.sleep(1)
  driver.find_element_by_id('kw').send_keys('自动化测试')
  time.sleep(1)
  driver.find_element_by_id('su').click()
  time.sleep(1)
  driver.quit()
  3、模块化驱动模型
  将脚本中重复可复用的部分拿出来写成一个公共的模块,需要的时候就调用它,这样可以大幅提高测试人员编写脚本的效率。
  框架目录:
  config 存放配置文件。
  例如 base_data.json 文件,存放测试地址。
  {
    "url": "https://www.baidu.com/"
  }
  data 存放测试数据。
  drivers 存放浏览器驱动文件。
  report 存放执行完成后的测试报告。
  test 存放测试用例
  case 测试用例步骤。
  例如 testSearch.py:
  #!/usr/bin/env python
  # -*- coding: utf-8 -*-
  # 公众号:AllTests软件测试
  import time
  import os
  import unittest
  from selenium import webdriver
  from AutomatedTestModel.ModularDriverModel.utils.ReadConfig import ReadConfig
  from AutomatedTestModel.ModularDriverModel.test.pages.searchPage import SearchPage
  class TestSearch(unittest.TestCase):
      def setUp(self):
          self.driver = webdriver.Chrome()
          self.driver.maximize_window()
          self.driver.implicitly_wait(30)
      def tearDown(self):
          self.driver.quit()
      def get_url(self):
          current_path = os.path.abspath((os.path.dirname(__file__)))
          data = ReadConfig().read_json(current_path + "/../../config/base_data.json")
          return data['url']
      def test_search(self):
          url = self.get_url()
          self.driver.get(url)
          time.sleep(1)
          search = SearchPage(self.driver)
          search.search('自动化测试')
  if __name__ == '__main__':
      unittest.main()
  common 存放公共的方法等。
  pages 存放页面元素与页面操作。
  例如 searchPage.py:
  #!/usr/bin/env python
  # -*- coding: utf-8 -*-
  # 公众号:AllTests软件测试
  import time
  class SearchPage:
      def __init__(self, driver):
          self.driver = driver
      def search_element(self):
          self.kw = self.driver.find_element_by_id('kw')
          self.su = self.driver.find_element_by_id('su')
      def search(self, data):
          self.search_element()
          self.kw.send_keys(data)
          time.sleep(1)
          self.su.click()
  runner 存放运行脚本。
  例如 main.py:
  #!/usr/bin/env python
  # -*- coding: utf-8 -*-
  # 公众号:AllTests软件测试
  import os
  import time
  import unittest
  from AutomatedTestModel.ModularDriverModel.utils.HwTestReport import HTMLTestReport
  class Main:
      def get_all_case(self):
          current_path = os.path.abspath(os.path.dirname(__file__))
          case_path = current_path + '/../case/'
          discover = unittest.defaultTestLoader.discover(case_path, pattern="test*.py")
          print(discover)
          return discover
      def set_report(self, all_case, report_path=None):
          if report_path is None:
              current_path = os.path.abspath(os.path.dirname(__file__))
              report_path = current_path + '/../../report/'
          else:
              report_path = report_path
          # 获取当前时间
          now = time.strftime('%Y{y}%m{m}%d{d}%H{h}%M{M}%S{s}').format(y="年", m="月", d="日", h="时", M="分", s="秒")
          # 标题
          title = u"搜索测试"
          # 设置报告存放路径和命名
          report_abspath = os.path.join(report_path, title + now + ".html")
          # 测试报告写入
          with open(report_abspath, 'wb') as report:
              runner = HTMLTestReport(stream=report,
                                      verbosity=2,
                                      images=True,
                                      title=title,
                                      tester='Meng')
              runner.run(all_case)
      def run_case(self, report_path=None):
          all_case = self.get_all_case()
          self.set_report(all_case, report_path)
  if __name__ == '__main__':
      Main().run_case()
  utils 存放公共方法。
  例如导出报告样式、读取配置文件等。
  run.py 运行脚本。
  #!/usr/bin/env python
  # -*- coding: utf-8 -*-
  # 公众号:AllTests软件测试
  from AutomatedTestModel.ModularDriverModel.test.runner.main import Main
  if __name__ == '__main__':
      Main().run_case()
  运行后的测试报告。
  4、数据驱动模型
  该模型会根据数据的变化而引起测试结果的改变,这显然是一个非常高级的概念和想法。简单地说,该模型是一种数据的参数化呈现,即通过输入不同的参数来驱动程序执行,输出不同的测试结果。
  框架目录:
  case 存放测试用例步骤。
  common 存放公共的方法等。
  如读取 Excel 方法、生成报告等样式。
  data 存放测试数据与预期结果。
  report 存放执行完成后的测试报告。
  打开报告效果。
  RunMain.py 运行脚本。
  #!/usr/bin/env python
  # -*- coding: utf-8 -*-
  # 公众号:AllTests软件测试
  import os, time, unittest
  from AutomatedTestModel.DataDrivenModeling.common.HwTestReport import HTMLTestReport
  class RunMain:
      def get_all_case(self):
          case_path = os.getcwd()
          discover = unittest.defaultTestLoader.discover(case_path,
                                                         pattern="Test*.py")
          print(discover)
          return discover
      def set_report(self, all_case, report_path=None):
          if report_path is None:
              current_path = os.path.abspath(os.path.dirname(__file__))
              report_path = current_path + '/report/'
          else:
              report_path = report_path
          # 获取当前时间
          now = time.strftime('%Y{y}%m{m}%d{d}%H{h}%M{M}%S{s}').format(y="年", m="月", d="日", h="时", M="分", s="秒")
          # 标题
          title = u"搜索测试"
          # 设置报告存放路径和命名
          report_abspath = os.path.join(report_path, title + now + ".html")
          # 测试报告写入
          with open(report_abspath, 'wb') as report:
              runner = HTMLTestReport(stream=report,
                                      verbosity=2,
                                      images=True,
                                      title=title,
                                      tester='Meng')
              runner.run(all_case)
      def run_case(self, report_path=None):
          all_case = self.get_all_case()
          self.set_report(all_case, report_path)
  if __name__ == "__main__":
      RunMain().run_case()
  5、关键字驱动模型
  这是一种通过关键字的改变而引起测试结果改变的功能自动化测试模型。QTP(UFT)、Robot Framework 等都是以关键字驱动为主的自动化测试工具,这类工具典型的特征就是具备一套易用的可视化界面,测试人员需要做的就是将测试脚本按照“填表格”的方式填入,并考虑三个问题就可以了:我要做什么?对谁做?怎么做?
  框架目录:
  action 主要存放动作事件、元素操作。
  Action.py:
  #!/usr/bin/env python
  # -*- coding: utf-8 -*-
  # 公众号:AllTests软件测试
  from AutomatedTestModel.KeywordDrivenModel.common.ExcelUtil import ExcelUtil
  from AutomatedTestModel.KeywordDrivenModel.action.ElementOperation import ElementOperation
  class Action:
      def __init__(self):
          self.element = ElementOperation()
      def set_value(self, element, action, parameter=None):
          if element == "browser":
              return self.element.browser_operate(action, parameter)
          elif element == "time":
              return self.element.time_operate(action, parameter)
          elif element is None or element == "":
              return
          else: # 如果不是其他的关键字,则默认为定位的元素
              return self.element.element_operate(element, action, parameter)
      def case_operate(self, excel, sheet):
          all_case = ExcelUtil(excel_path=excel, sheet_name=sheet).get_case()
          for case in all_case:
              self.set_value(case[0], case[1], case[2])
  if __name__ == '__main__':
      excel = '../case/casedata.xlsx'
      Action().case_operate(excel=excel, sheet='搜索')
  ElementOperation.py:
  case 存放测试用例步骤。
  common 存放公共的方法等。
  如读取 Excel 方法等。
  RunMain.py 运行脚本。
  #!/usr/bin/env python
  # -*- coding: utf-8 -*-
  # 公众号:AllTests软件测试
  from AutomatedTestModel.KeywordDrivenModel.action.Action import Action
  if __name__ == '__main__':
      excel = 'case/casedata.xlsx'
      a = Action().case_operate(excel=excel, sheet='搜索')
  6、行为驱动模型
  行为驱动开发(Behave Driven Development,简称BDD),即从用户的需求出发强调系统行为。通过将BDD借鉴到自动化测试中,便产生了行为驱动测试模型,这种模型通过使用自然描述语言确定自动化测试脚本,其优点是可使用自然语言编写测试用例。
  框架目录:
  features 存放用例。
  steps 存放步骤:
  #!/usr/bin/env python
  # -*- coding: utf-8 -*-
  # 公众号:AllTests软件测试
  import time
  from behave import *
  @When('打开访问的网页 "{url}"')
  def step_open(context, url):
      context.driver.get(url)
      time.sleep(5)
  @Then('进入百度网站成功')
  def step_assert_open(context):
      title = context.driver.title
      assert title == "百度一下,你就知道"
  @When('输入 "{searchdata}"')
  def step_search(context, searchdata):
      searchdata_element = context.driver.find_element_by_id('kw')
      searchdata_element.send_keys(searchdata)
      time.sleep(1)
      submit_btn = context.driver.find_element_by_id('su')
      submit_btn.click()
  @Then('获取标题')
  def step_assert_search(context):
      success_message = context.driver.title
      assert success_message == "自动化测试_百度搜索"
  environment.py 存放变量。
  search.feature 存放行为。
  report、result 存放报告。
  本文内容不用于商业目的,如涉及知识产权问题,请权利人联系51Testing小编(021-64471599-8017),我们将立即处理
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号