python自動化測試技術-Allure

2020-10-28 14:00:30

大部分人可能做的是爬蟲和web,資料分析方面的工作,今天分享個在自動化測試領域python能做什麼樣的事情,比如下方,是用python+pytest+allure生成的精美自動化測試報告,本文僅演示,用例個數較少,具體工作中根據專案來進行編寫用例,allure測試報告現在已經非常流行,具體看下方圖,測試用例個數、通過率、測試步驟執行過程、描述,都給我們詳細的生成出來,這樣的測試用例,拿出去給領導彙報,逼格絕對高。

在這裡插入圖片描述

在這裡插入圖片描述

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 指令碼啟動檔案,生成報告

在這裡插入圖片描述

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個用例,明白流程即可

import allure, os,sys

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

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:\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

列印指令碼執行資訊,有報錯的話也可以看到

在這裡插入圖片描述

7、啟動指令碼python3 start_script.py

切換到report目錄下執行,指定報告開啟的ip和埠,提示成功後會自動開啟網頁,也可以複製下方出現的地址開啟(我這裡提示http://api.meiduo.site:8083是因為我本機hosts的dns改了,你的hosts檔案沒改的話,不會出現此問題

allure open -h 127.0.0.1 -p 8083 ./

在這裡插入圖片描述

8、其他說明:

1、這是基於web的ui自動化,用的是selenium,後面會出基於app的appium方面的ui自動化文章,其實也實現了另外一種爬蟲進行app資料抓取的功能

2、本文環境要設定正確,不然得不到想要的報告

3、具體工作實戰應用比本文講述的要複雜的多,很多基於jenkins等做批次指令碼執行

4、methods.py方法要繼續補充,我這裡只是演示用的幾個方法

軟體測試是IT相關行業中最容易入門的學科~不需要開發人員燒腦的邏輯思維、不需要運維人員24小時的隨時待命,需要的是細心認真的態度和IT相關知識點廣度的瞭解,每個測試人員從入行到成為專業大牛的成長路線可劃分為:軟體測試、自動化測試、測試開發工程師 3個階段。

在這裡插入圖片描述
這裡有我整理的一些資料,如果你不想再體驗一次自學時找不到資料,沒人解答問題,堅持幾天便放棄的感受的話,可以加我們的軟體測試交流群 313782132 ,裡面有各種軟體測試資料和技術交流。