zoukankan      html  css  js  c++  java
  • python自动化测试技术-Allure

    文末有源码

    大部分人可能做的是爬虫和web,数据分析方面的工作,今天分享个在自动化测试领域python能做什么样的事情,比如下方,是用python+pytest+allure生成的精美自动化测试报告,本文仅演示,用例个数较少,具体工作中根据项目来进行编写用例,allure测试报告现在已经非常流行,具体看下方图,测试用例个数、通过率、测试步骤执行过程、描述,都给我们详细的生成出来,这样的测试用例,拿出去给领导汇报,逼格绝对高。

    640?wx_fmt=jpeg

    640?wx_fmt=jpeg

    1、环境配置

    1、电脑配jdk 1.8+版本,allure所依赖的环境
    2、allure , 单独的包,安装好后需要配环境变量
    3、pytest、allure-pytest、allure-python-commons、selenium这几个通过pip安装即可

    2、文件目录

    1、report : 报告最终生成的目录
    2、xml : xml数据文件,用来生成最终报告(中间产物)
    3、20.py  自动化脚本文件
    4、methods.py  用来被调用的脚本方法文件
    5、start_script.py  脚本启动文件,生成报告

    640?wx_fmt=jpeg

    3、start_script.py启动脚本文件代码

    主要是通过os.system执行两个命令,分别生产xml和html最终报告,clean用来清空旧目录
    import os
    
    # file_path 是自动化脚本文件
    file_path = "20.py"
    
    # xmlpth是生成的xml数据文件,用来生成最终报告
    xmlpath = "./xml"
    
    xmlStr = "pytest -s -q {file_path} --alluredir {xmlpath}".format(file_path=file_path, xmlpath=xmlpath)
    print("xmlStr",xmlStr)
    
    # 执行命令,生成xml文件
    a = os.system(xmlStr)
    
    # 生成报告,--clean会清除旧文件
    htmlStr = "allure generate {0} -o ./report/ --clean".format(xmlpath)
    os.system(htmlStr)

    4、20.py自动化测试脚本文件

    所有的方法均调用的methods.py里面

    1、setup_class : 
    类的初始化方法,浏览器最大化,不然有些元素找不到

    2、teardown_class : 
    类的销毁方法,退出驱动

    3、teardown:
    每个用例方法的销毁方法,我这里没用,比如应用场景:服务崩了后用来返回到首页,以不影响下个用例的执行

    参数传递,见后面介绍,用上我直接复制粘贴了一个,代表2个用例,明白流程即可

    5、methods.py文件

    举例说明

    send_key方法:

    1、loc :需要传入的元素位置,定义规则是xpath=>"*****",id=>"*****",这样我用split切分=>符号后,就可以获取元素选取方式和具体xpath路径或者id名字,例如 xpath=>//*[@id='loginname'] 切分后,可以得到["xpath","//*[@id='loginname'] "],供我定位选取元素使用

    2、key:需要传入的值

    3、desc:用例步骤描述

    4、with allure.step用来记录步骤生成allure报告

    def send_key(loc,key,desc=None):
       with allure.step(desc):
         try:
          getElement(loc).send_keys(Keys.CONTROL,'a')
          getElement(loc).send_keys(key)
         except Exception as e:
           raise e

    getElement方法:
    供调用,需要传入上面介绍的loc
    # 获取单个页面元素
    def getElement(loc):
       try:
         by = loc.split("=>")[0]
         value = loc.split("=>")[1]
        element = WebDriverWait(driver, 10).until(lambda x: x.find_element(by=byTypeDict[by], value=value))
         # print(element)
         return element
      except Exception as e:
        raise e

    click方法:
    对于需要传入元素位置的,都要传loc
    def click(loc,desc=None):
       with allure.step(desc):
         try:
          print("这里是点击方法")
          getElement(loc).click()
         except Exception as e:
           raise e

    import os
    from selenium.webdriver.common.keys import Keys
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.action_chains import ActionChains
    from selenium import webdriver
    from selenium.webdriver.support.select import Select
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    import time
    import allure
    
    byTypeDict = {
     "xpath": By.XPATH,
     "id": By.ID,
     "name": By.NAME,
     "class_name": By.CLASS_NAME,
     "tag_name": By.TAG_NAME,
     "link_text": By.LINK_TEXT,
     "partial_link_text": By.PARTIAL_LINK_TEXT,
     "css selector" : By.CSS_SELECTOR
    }
    
    driver = webdriver.Chrome(executable_path='C:chromechromedriver246.exe')
    # 获取单个页面元素
    def getElement(loc):
      try:
       by = loc.split("=>")[0]
       value = loc.split("=>")[1]
       element = WebDriverWait(driver, 10).until(lambda x: x.find_element(by=byTypeDict[by], value=value))
        # print(element)
        return element
       except Exception as e:
        raise e
    
    # 获取一组相同的元素,以列表形式返回
    def getElements(loc):
       try:
        by = loc.split("=>")[0]
        value = loc.split("=>")[1]
        elements = WebDriverWait(driver, 5).until(lambda x: x.find_elements(by=byTypeDict[by], value=value))
         return elements
       except Exception as e:
         raise e
    
    def get_url(*args, desc=None):
       with allure.step(desc):
         try:
          driver.get(args[0])
         except Exception as e:
           raise e
    
    def wait(*args, desc=None):
       with allure.step(desc):
         try:
          time.sleep(args[0])
         except Exception as e:
           raise e
    
    def max_window(*args, **kwargs):
       try:
        driver.maximize_window()
       except Exception as e:
         raise e
    
    def close(desc=None):
       with allure.step(desc):
         try:
          driver.quit()
         except Exception as e:
           raise e
    
    def click(loc,desc=None):
       with allure.step(desc):
         try:
          print("这里是点击方法")
          getElement(loc).click()
         except Exception as e:
           raise e
    
    def send_key(loc,key,desc=None):
       with allure.step(desc):
         try:
          getElement(loc).send_keys(Keys.CONTROL,'a')
          getElement(loc).send_keys(key)
         except Exception as e:
           raise e

    6、启动脚本python3 start_script.py

    打印脚本执行信息,有报错的话也可以看到

    640?wx_fmt=jpeg

    7、启动脚本python3 start_script.py

    切换到report目录下执行,指定报告打开的ip和端口,提示成功后会自动打开网页,也可以复制下方出现的地址打开(我这里提示http://api.meiduo.site:8083是因为我本机hosts的dns改了,你的hosts文件没改的话,不会出现此问题
    allure open -h 127.0.0.1 -p 8083 ./

    640?wx_fmt=jpeg

    8、其他说明:
    1、这是基于web的ui自动化,用的是selenium,后面会出基于app的appium方面的ui自动化文章,其实也实现了另外一种爬虫进行app数据抓取的功能
    2、本文环境要配置正确,不然得不到想要的报告
    3、具体工作实战应用比本文讲述的要复杂的多,很多基于jenkins等做批量脚本执行
    4、methods.py方法要继续补充,我这里只是演示用的几个方法

    源码:

    公众号回复:测试报告,获取源码           

  • 相关阅读:
    python3 接口测试 一般方法
    python2 接口测试一般方法.
    Postman 官网教程,重点内容,翻译笔记,
    Unity3D --对撞机/碰撞器 介绍
    MyBatis之配置文件与操作
    Eclipse连接mysql数据库jdbc下载(图文)
    MyBatis概述和环境的搭建
    样式加载不出来,浏览器控制台报错:Resource interpreted as Stylesheet but transferred with MIME type text/html
    bootstrap之navbar
    JSP中的内置标记(JSP动作)和 EL表达式
  • 原文地址:https://www.cnblogs.com/finer/p/11895042.html
Copyright © 2011-2022 走看看