大部分人可能做的是爬蟲和web,資料分析方面的工作,今天分享個在自動化測試領域python能做什麼樣的事情,比如下方,是用python+pytest+allure生成的精美自動化測試報告,本文僅演示,用例個數較少,具體工作中根據專案來進行編寫用例,allure測試報告現在已經非常流行,具體看下方圖,測試用例個數、通過率、測試步驟執行過程、描述,都給我們詳細的生成出來,這樣的測試用例,拿出去給領導彙報,逼格絕對高。
1、電腦配jdk 1.8+版本,allure所依賴的環境
2、allure , 單獨的包,安裝好後需要配環境變數
3、pytest、allure-pytest、allure-python-commons、selenium這幾個通過pip安裝即可
1、report : 報告最終生成的目錄
2、xml : xml資料檔案,用來生成最終報告(中間產物)
3、20.py 自動化指令碼檔案
4、methods.py 用來被呼叫的指令碼方法檔案
5、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)
所有的方法均呼叫的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)
舉例說明
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
列印指令碼執行資訊,有報錯的話也可以看到
切換到report目錄下執行,指定報告開啟的ip和埠,提示成功後會自動開啟網頁,也可以複製下方出現的地址開啟(我這裡提示http://api.meiduo.site:8083是因為我本機hosts的dns改了,你的hosts檔案沒改的話,不會出現此問題
allure open -h 127.0.0.1 -p 8083 ./
1、這是基於web的ui自動化,用的是selenium,後面會出基於app的appium方面的ui自動化文章,其實也實現了另外一種爬蟲進行app資料抓取的功能
2、本文環境要設定正確,不然得不到想要的報告
3、具體工作實戰應用比本文講述的要複雜的多,很多基於jenkins等做批次指令碼執行
4、methods.py方法要繼續補充,我這裡只是演示用的幾個方法
軟體測試是IT相關行業中最容易入門的學科~不需要開發人員燒腦的邏輯思維、不需要運維人員24小時的隨時待命,需要的是細心認真的態度和IT相關知識點廣度的瞭解,每個測試人員從入行到成為專業大牛的成長路線可劃分為:軟體測試、自動化測試、測試開發工程師 3個階段。
這裡有我整理的一些資料,如果你不想再體驗一次自學時找不到資料,沒人解答問題,堅持幾天便放棄的感受的話,可以加我們的軟體測試交流群 313782132 ,裡面有各種軟體測試資料和技術交流。