用python自动化测试技术打造一款升职加薪利器

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


用python自动化测试技术打造一款升职加薪利器_第1张图片

用python自动化测试技术打造一款升职加薪利器_第2张图片



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  脚本启动文件,生成报告

用python自动化测试技术打造一款升职加薪利器_第3张图片


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)

# 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个用例,明白流程即可
 
   
import allure, os,syssys.path.insert(0,r"C:\\Users\\Administrator\\Desktop\\关于网站\\ccc\\爬虫系统\\go\\allure_test")from allure_test import methodsclass Test_20: def setup_class(self):  methods.max_window() def teardown_class(self):  methods.close() @allure.feature('打开京东') @allure.story('点击登陆')def test_case_15(self):   '''用例名称京东-登录-百度-新闻-百度'''  methods.get_url("https://www.jd.com", desc="打开京东")  methods.click("xpath=>//*[contains(text(),'请登录')]", desc="登陆")  methods.click("xpath=>//*[contains(text(),'账户登录')]", desc="切换账户登陆")  methods.send_key("xpath=>//*[@id='loginname']", 188888888, desc="发送账户名密码")  methods.wait(5) @allure.feature('打开京东') @allure.story('点击登陆') def test_case_16(self):   '''用例名称京东-登录-百度-新闻-百度'''  methods.get_url("https://www.jd.com", desc="打开京东")  methods.click("xpath=>//*[contains(text(),'请登录')]", desc="登陆")  methods.click("xpath=>//*[contains(text(),'账户登录')]", desc="切换账户登陆")   methods.send_key("xpath=>//*[@id='loginname']", 188888888, desc="发送账户名密码")  methods.wait(5)

sys.path.insert(0,r"C:\\Users\\Administrator\\Desktop\\关于网站\\ccc\\爬虫系统\\go\\allure_test")
from allure_test import methods

class Test_20:
def setup_class(self):
  methods.max_window()

def teardown_class(self):
  methods.close()

@allure.feature('打开京东')
@allure.story('点击登陆')
def test_case_15(self):
  '''用例名称京东-登录-百度-新闻-百度'''
  methods.get_url("https://www.jd.com", desc="打开京东")
  methods.click("xpath=>//*[contains(text(),'请登录')]", desc="登陆")
  methods.click("xpath=>//*[contains(text(),'账户登录')]", desc="切换账户登陆")
  methods.send_key("xpath=>//*[@id='loginname']", 188888888, desc="发送账户名密码")
  methods.wait(5)

@allure.feature('打开京东')
@allure.story('点击登陆')
def test_case_16(self):
  '''用例名称京东-登录-百度-新闻-百度'''
  methods.get_url("https://www.jd.com", desc="打开京东")
  methods.click("xpath=>//*[contains(text(),'请登录')]", desc="登陆")
  methods.click("xpath=>//*[contains(text(),'账户登录')]", desc="切换账户登陆")
  methods.send_key("xpath=>//*[@id='loginname']", 188888888, desc="发送账户名密码")
  methods.wait(5)


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
  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
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
  with allure.step(desc):
    try:
      print("这里是点击方法")
      getElement(loc).click()
    except Exception as e:
      raise e



 
   
import osfrom selenium.webdriver.common.keys import Keysfrom selenium.webdriver.support.ui import WebDriverWaitfrom selenium.webdriver.common.action_chains import ActionChainsfrom selenium import webdriverfrom selenium.webdriver.support.select import Selectfrom selenium.webdriver.support.ui import WebDriverWaitfrom selenium.webdriver.common.by import Byfrom selenium.webdriver.support import expected_conditions as ECimport timeimport allurebyTypeDict = { "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:\chrome\chromedriver246.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 edef get_url(*args, desc=None):   with allure.step(desc):     try:      driver.get(args[0])     except Exception as e:       raise edef wait(*args, desc=None):   with allure.step(desc):     try:      time.sleep(args[0])     except Exception as e:       raise edef max_window(*args, **kwargs):   try:    driver.maximize_window()   except Exception as e:     raise edef close(desc=None):   with allure.step(desc):     try:      driver.quit()     except Exception as e:       raise edef click(loc,desc=None):   with allure.step(desc):     try:      print("这里是点击方法")      getElement(loc).click()     except Exception as e:       raise edef 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
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:\chrome\chromedriver246.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

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

用python自动化测试技术打造一款升职加薪利器_第4张图片


7、启动脚本python3 start_script.py


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


用python自动化测试技术打造一款升职加薪利器_第5张图片


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


源码:

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


python爬虫人工智能大数据公众号

640?wx_fmt=gif

你可能感兴趣的:(用python自动化测试技术打造一款升职加薪利器)