关闭

GuardianAutoTest自动化测试框架介绍

发表于:2024-9-04 09:19

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

 作者:davisl    来源:51CTO博客

  一、selenium
  selenium是一个开源的web ui自动化测试工具,详细就不再过多介绍了。
  二、环境搭建
  关于环境搭建,非常简单,可以参考我之前的博客。selenium新手入门
  三、po设计
  po(pom)模式:页面对象模型,把项目中的页面,封装成一个一个类,一个页面对应一个类。再通过实例化这个类的对象,去调用类里面的属性和方法。
  好处:
  提高代码维护
  代码重复利用
  3.1 po分层
  3.1.1 基础层:
  基础层:放封装的selenium基础方法
  代码实现:
  class BasePage:
      def __init__(self,driver):
          self.driver=driver
      # 打开页面
      def into_testin(self,url):
          self.driver.get(url)
      # 定位元素
      def locate_element(self,args):
          return self.driver.find_element(*args)
      #定位一组元素
      def locate_eles(self,args):
          return self.driver.find_elements(*args)
      #输入值
      def input_(self,args,text):
          self.locate_element(args).send_keys(text)
      #点击按钮
      def click_button(self,args):
          self.locate_element(args).click()
  3.1.2 页面对象层
  页面对象层:pageobject,存放页面的元素定位和操作流程
  登录模块代码实现:
  from time import sleep
  from basepage.base_page import BasePage
  from selenium.webdriver.common.by import By
  class LoginPage(BasePage):
      '''定位页面元素'''
      
      #url
      testin_url='https://www.testin.cn/account/login.htm'
      
      #输入用户名和密码
      username_loc=(By.ID,'email')
      password_loc=(By.ID,'pwd')
      #点击登录按钮
      login_button=(By.ID,"submitBtn")
      #登录邮箱操作流程
      def testin_login(self,username='18170710339',password='Quyun1230'):
          self.into_testin(self.testin_url)
          sleep(2)
          self.locate_element(self.username_loc).send_keys(username)
          sleep(1)
          self.locate_element(self.password_loc).send_keys(password)
          sleep(1)
          self.click_button(self.login_button)
  选择手机代码实现:
  from time import sleep
  from basepage.base_page import BasePage
  from selenium.webdriver.common.by import By
  class SelectPage(BasePage):
      '''定位页面元素'''
      #定位弹窗
      win_loc=(By.XPATH,"//div[@class='modal-body']/i")
      #定位iphone
      ip_12pro_loc=(By.XPATH,'//div[@id="collapse_1"]/div/dl[1]/dd/div/span[2]/label/span')
      # 定位iphone12 pro max
      ip_loc = (By.XPATH, "//button[@device-source='00008101-0004102C3468001E']")
      #定位品牌
      an_loc=(By.XPATH,'//div[@id="collapse_1"]/div/dl[2]/dd/div/span[3]/label/span')
      # 定位安卓魅族
      mz_loc = (By.XPATH, "//button[@device-source='864968050654030']")
      #定位上市时间
      onlin_loc=(By.XPATH,'//div[@id="collapse_1"]/div/dl[6]/dd/div/span[5]/label/span')
      # 定位上市时间的华为荣耀
      sj_loc = (By.XPATH, "//button[@device-source='7d22ebd8f913637d']")
      #定位文本框
      text_detail=(By.XPATH,'//div[@id="modal_quota_alert"]/div/div/div[2]')
      #定位取消框
      qx_but_loc=(By.XPATH,'//div[@id="modal_quota_alert"]/div/div/div[3]/button[1]')
      #点击登录按钮
      login_button=(By.ID,"submitBtn")
      #登录邮箱操作流程
      def testin_select_01_iphone(self):
          sleep(1)
          self.locate_element(self.ip_12pro_loc).click()
          sleep(1)
          self.locate_element(self.ip_loc).click()
          sleep(1)
          as_text=self.locate_element(self.text_detail).text
          '''断言信息正确'''
          assert as_text==u'您的配额已不足,是否前往购买?'
          self.locate_element(self.qx_but_loc).click()
          sleep(2)
      def testin_select_02_android(self):
          sleep(1)
          self.locate_element(self.an_loc).click()
          sleep(1)
          self.locate_element(self.mz_loc).click()
          sleep(1)
          as_text = self.locate_element(self.text_detail).text
          assert as_text == u'您的配额已不足,是否前往购买?'
          self.locate_element(self.qx_but_loc).click()
          sleep(2)
      def testin_select_03_onlin_time(self):
          sleep(1)
          self.locate_element(self.onlin_loc).click()
          sleep(1)
          self.locate_element(self.sj_loc).click()
          sleep(1)
          as_text = self.locate_element(self.text_detail).text
          assert as_text == u'您的配额已不足,是否前往购买?'
          self.locate_element(self.qx_but_loc).click()
          sleep(2)
  3.1.3 测试用例
  测试用例层:存放测试用例及数据
  代码实现:
  import pytest
  from time import sleep
  from selenium import webdriver
  from common.excel import read_excel
  from pageobject.login_page import LoginPage
  from pageobject.select_phone import SelectPage
  class TestTestIn:
      #打开浏览器
      def setup(self) -> None:
          self.driver=webdriver.Chrome()
          driver=self.driver
      def teardown(self) -> None:
          sleep(1)
          self.driver.close()
      '''利用excel导入登录测试数据'''
      @pytest.mark.parametrize('case',read_excel('./data/data.xlsx','login'))
      def test_01_login(self,case):
          '''测试登录模块'''
          xh,case_name,username,password,is_exc,result,bz=case
          lp=LoginPage(self.driver)
          lp.testin_login(username,password)
      def test_02_select_iphone_12(self):
          '''测试根据品牌选择手机'''
          lp = LoginPage(self.driver)
          lp.testin_login()
          ps=SelectPage(self.driver)
          ps.testin_select_01_iphone()
      def test_03_select_androi_sys(self):
          '''测试根据安卓系统选择手机'''
          lp = LoginPage(self.driver)
          lp.testin_login()
          ps=SelectPage(self.driver)
          ps.testin_select_02_android()
      def test_04_select_online_time(self):
          '''测试根据上市时间来选择手机'''
          lp = LoginPage(self.driver)
          lp.testin_login()
          ps=SelectPage(self.driver)
          ps.testin_select_03_onlin_time()
  3.1.4 创建测试数据
  登录模块,我们用到了数据驱动,我们先创建一个目录,如data,里面创建一个excel表,添加相应数据,如:
  excel表中如下:
  3.1.5 创建读取excel目录
  创建一个common目录,再创建一个read_excel的文件:
  代码如下:
  import openpyxl
  def read_excel(excel_dir,sheet_name):
      '''读取excel'''
      #加载目录
      ex=openpyxl.load_workbook(excel_dir)
      #获取sheet页
      sheet=ex[sheet_name]
      #打印表最大行和列
      # print(sheet.max_row,sheet.max_column)
      # print(sheet.cell(2,1).value)
      #循环行和列
      sheet_list=[]
      for row in range(2,sheet.max_row+1):
          row_list=[]
          for col in range(1,sheet.max_column+1):
              row_list.append(sheet.cell(row,col).value)
          sheet_list.append(row_list)
      return sheet_list
  if __name__ == '__main__':
      read_excel('../data/data.xlsx','login')
  3.2 生成测试报告
  3.2.1 创建报告目录
  本次我们使用pytest测试框架,所以,当然使用allure测试报告了。如果不熟悉allure报告的朋友,可以参考我上一篇详细的介绍:单元测试框架–pytest从入门到精通2021最新教程 先创建两个目录:一个临时目录:temp和存放测试报告的reports:
  3.2.2 创建报告配置文件
  新建一个pytest.ini的文件:
  [pytest]
  #
  addopts=-vs --alluredir ./temp
  testpaths=./testcase
  python_files=test_*.py
  python_classes=Test*
  python_functions=test_*
  3.3 运行测试
  根据上面的操作,最终会形成这样的目录:
  3.3.1 运行用例:
  创建一个run_test.py文件:
  import os
  import pytest
  from time import sleep
  if __name__ == '__main__':
      pytest.main()
      sleep(2)
      os.system('allure generate ./temp -o ./reports --clean')
  3.3.2 查看运行结果
  3.3.2.1 编辑器中结果
  可以看出,结果全部运行通过。
  3.3.2.2 查看测试报告
  查看reports目录中的html测试,用浏览器打开:
  测试用例全部通过。
  四、jenkins集成
  如果不太熟悉jenkins的朋友,可以参考我之前的博客,有详细搭建教程:?jenkins持续集成的使用(含RF自动执行自动化)
  4.1 启动jenkins
  cmd中进入jenkins目录,执行命令:
  java -jar jenkins.war
  jenkins启动成功
  4.2 创建任务
  进入jenkins,创建一个任务:
  添加项目目录:
  设置运行命令:
  保存,创建成功。
  任务创建成功后, 执行运行操作。
  可以看到已经在运行了。
  查看运行结果:
  运行成功。测试报告,同上,就不再次看了。
  本文内容不用于商业目的,如涉及知识产权问题,请权利人联系51Testing小编(021-64471599-8017),我们将立即处理
《2024软件测试行业从业人员调查问卷》,您的见解,行业的声音!

关注51Testing

联系我们

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

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

沪ICP备05003035号

沪公网安备 31010102002173号