





摘要:文章通過設計特定測試場景,編寫測試用例數據,基于Python的Unittest框架,采用PO模式實現通用操作封裝,使用ddt裝飾器實現遍歷測試數據并批量執行。所實現的自動化測試檢驗了人力資源管理系統中,以系統管理員身份登錄時,添加政治類別操作可能出現的幾種情況。該測試過程能夠自動截圖,并通過斷言比較測試用例的正確性,同時將生成的測試報告發送到指定郵箱。
關鍵詞:Python;Unittest框架;PO對象;ddt裝飾器;自動化測試
中圖分類號:TP311.53 文獻標識碼:A
文章編號:1009-3044(2024)17-0055-04 開放科學(資源服務)標識碼(OSID) :
0 引言
作為保證軟件質量的重要手段,軟件測試在日新月異的軟件開發中愈發重要。自動化測試是將以人為驅動的測試行為轉化為機器執行的過程,即模擬手工測試步驟,通過執行以程序語言編制的測試腳本自動地測試軟件,涵蓋了所有測試階段。自動化測試具有跨平臺兼容性,且與進程無關。廣義的自動化測試強調整個測試過程都由計算機系統完成,范圍更廣;狹義的自動化測試主要指通過某個自動化工具自動執行特定測試任務,處理范圍較小。
自動化測試適用于回歸測試,因為重復單一的數據錄入或擊鍵等測試操作會造成不必要的時間和人力浪費。測試人員通常需要借助自動化測試工具對程序進行理解和對設計文檔進行驗證。采用自動化測試工具還有利于生成測試報告文檔,保持版本的連貫性。自動化工具也能夠確定測試用例的覆蓋路徑,確定測試用例集對程序邏輯流程和控制流程的覆蓋。本文以系統管理員身份登錄人資管理系統,驗證添加政治面貌類別操作。
1 Unittest 框架
Unittest框架是Python自帶的一種單元測試框架,具備編寫用例、組織用例、執行用例、輸出報告等自動化框架的條件。該框架可以實現批量執行用例,提供豐富的斷言知識,還可以生成報告。Unittest框架的核心要素包括:TestCase(測試用例),TestSuite(測試套件),TextTestRunner(以文本形式運行測試用例),Tes?tLoader(批量執行測試用例-搜索指定文件夾內指定字母開頭的模塊),Fixture(固定裝置(兩個固定的函數,一個初始化時使用,一個結束時使用)) 。在使用Unittest框架創建測試用例時,首先要導入unittest包,新建的測試類需繼承unittest.TestCase,并且測試方法必須以test字母開頭[1]。
2 具體實現
2.1 測試環境搭建
安裝Python、Selenium 插件、PyCharm 平臺,配置相關環境變量后,還需要安裝Chrome瀏覽器及對應Chrome驅動,并確保可以成功登錄打開人資管理系統。打開PyCharm平臺,創建一個項目,同時在創建項目時選擇解釋器為當前安裝的Python[2]。
測試數據準備如圖1所示。
項目路徑如圖2所示[3]。
2.2 封裝基本操作
首先在指定名稱文件夾下創建driver.py文件,封裝打開谷歌瀏覽器操作,代碼如下:
from selenium import webdriver
def browser():
driver=webdriver.Chrome()
#打開谷歌瀏覽器
return driver
在指定文件夾下創建function.py文件[4],封裝截圖方法inser_img(driver,filename),查找最新測試報告方法latest_report(report_dir),將測試報告發送到郵箱的方法send_mail(latest_report),以及讀取csv文件方法。讀取csv文件方法可以通過逐行逐列循環讀取csv文件來批量執行測試用例,即通過數據驅動實現自動化測試某個功能,讀取csv文件代碼如下:
def get_csv_file(line):
# 文件路徑需要自己修改成自己的文件路徑
with open(r"盤符:\*\*\需被讀取的文件名.csv",encoding=′utf-8-sig′) as file:
reader=csv.reader(file)
for index,row in enumerate(reader,1):
if index==line:
return row 以及創建myunit.py文件,封裝啟動測試集和結束測試集操作,代碼如下:
import unittest
from driver.driver import *
class StartEnd(unittest.TestCase):
def setUp(self):
self.driver=browser()
self.driver.implicitly_wait(10)
self.driver.maximize_window()
def tearDown(self):
self.driver.quit()
2.3 定義基礎類Python 文件
創建基礎類BasePage.py,用于被所有頁面對象類繼承。其中,初始化方法用于打開被測系統頁面,open方法用于打開指定url地址頁面,find_element方法用于查找指定頁面元素,相關代碼如下:
from time import sleep
class Page():
def __init__(self, driver):
self.driver = driver
self. base_url = ′http://116.204.108.152: 30016/suthr/logon′
def _open(self, url):
url_ = self.base_url + url
print("Test page is %s" % url_)
self.driver.maximize_window()
self.driver.get(url_)
sleep(2)
assert self.driver.current_url == url_, ′Did not land on %s′ % url_
def open(self):
self._open(self.url)
def find_element(self, *loc):
return self.driver.find_element(*loc)
2.4 創建PageObject 對象
創建PO對象LoginPage.py文件,用于封裝登錄人資系統的操作;AddLeibiePage.py文件用于封裝一系列操作,包括點擊系統管理員鏈接→輸入系統管理員用戶名→輸入系統管理員密碼→點擊登錄按鈕→點擊類別維護菜單→點擊政治面貌類別子菜單→點擊創建類別按鈕→填寫政治類別名稱框→填寫描述框→點擊保存按鈕,以及讀取彈窗文字信息和紅底提示文字信息等。
以輸入政治類別名稱,點擊保存為例,代碼如下:
from selenium.webdriver.common.by import By
from Website. test_case. page_object. BasePage im?port *
from time import sleep
class LeibieAdd(Page):
...
lbmc = (By.ID, ′dictValue′) # 定位類別名稱輸入框
Baocun_loc = (By.XPATH, ′//*[@id="ajax-modal"]/div[3]/button[1]′) # 定位保存按鈕hongdi_loc = (By.ID,′dictValue-error′) # 定位消息提示文字信息
...
def type_lbmc(self, lbname):
self.find_element(*self.lbmc).clear()
self.find_element(*self.lbmc).send_keys(lbname)
# 輸入類別名稱
def type_Baocun(self):
self.find_element(*self.Baocun_loc).click()
#點擊保存按鈕
def type_hongdi(self):
return self.find_element(*self.hongdi_loc).get_attri?bute("innerHTML")
# 讀取紅底文字信息
...
def test_zzlb_add(driver, lbname):
...
sleep(1)
add_page.type_lbmc(lbname)
sleep(1)
add_page.type_Baocun()
需要注意的是,各類動態增加方法時一定要加self參數,并且PO類與調用PO類的封裝方法縮進要一致,表示同級的關系。如果縮進不一致,在后續測試類調用封裝方法時會報“方法沒有定義”的錯誤。
2.5 創建測試類
使用unittest框架創建測試類test_addzz.py,測試類中每一個以test開頭的方法就是一條測試用例。同時,使用ddt裝飾器實現遍歷測試數據,每遍歷出一條數據,就往測試類中添加一個以test開頭的方法setattr (類,方法名,方法)[5]。
該測試類通過調用function.py中的讀取csv文件方法get_csv_file(line)以及調用test_user_login(driver,username,password)方法,分別測試了csv文件中的3條測試數據,對應添加政治類別中的輸入政治類別名稱為空、重復和過長的操作。測試類能夠實現測試界面的截屏,并且能夠斷言對比測試用例是否正確。關鍵代碼如下:
import unittest
from Website. test_case. model import function,myunit
from Website.test_case.page_object.AddLeibiePage import *
from Website.test_case.page_object.LoginPage im?port *
from Website. test_case. page_object. AddPage im?port *
import time
import ddt
@ddt.ddt
class AddzzTest(myunit.StartEnd):
# @unittest.skip(′skip this case′)
def test01_add_null(self):
′′′操作成功′′′
print("test case is start run...")
test_date = function.get_csv_file(2)
#創建參數接收測試數據
test_user_login(self.driver,′ceshi01′,′123456′)
#登錄
test_zzlb_add(self.driver,test_date[0])
#輸入測試數據
time.sleep(3)
function. inser_img(self. driver, "test01_add_null.png")
# 截屏
po = LeibieAdd(self.driver)
# 設置參數接收數據
self.assertIn(test_date[1], po.type_hongdi())
# 斷言對比測試用例是否正確
print("test case is successful test end!")
...
if __name__ == ′__main__′:
unittest.main()
2.6 生成測試報告并發送指定郵箱
為能夠生成測試報告并發送指定郵箱,須創建run_test.py文件,相關代碼如下:
import unittest
from Website.test_case.model.function import *
from HTMLTestRunner import HTMLTestRunner
import time
report_dir=′./test_report′
test_dir=′./test_case′
print("start run test case")
discover=unittest. defaultTestLoader. discover(test_dir,pattern="test_addzz.py")
now=time.strftime("%Y-%m-%d %H_%M_%S")
report_name=report_dir+′/′+now+′result.html′
print("start write report..")
with open(report_name,′wb′) as f:
runner=HTMLTestRunner(stream=f,title="Test Re?port" ,description="localhost login test")
runner.run(discover)
f.close()
print("find latest report")
latest_report=latest_report(report_dir)
print("send email report..")
send_mail(latest_report)
print("Test end")
3 測試結果
3.1 PyCharm 界面結果顯示
從測試工作臺可以看到,3個測試用例均通過,分別測試了添加政治類別名稱為空、添加政治類別名稱重復和添加政治類別名稱過長這3種情況。測試結果均與預期相同,能夠彈出相應的錯誤提示彈窗,測試通過,并成功發送測試報告郵件。界面如圖3、圖4 所示。
3.2 測試報告郵件
正確收到測試報告郵件,郵件顯示測試內容和測試結果。界面如圖5所示。
4 總結
本文通過設計特定測試場景,編寫測試用例數據,實現了自動化測試,檢驗了人資管理系統中以系統管理員身份登錄時,添加政治類別操作可能出現的幾種情況。自動化測試能夠自動截圖、斷言對比測試用例的正確性,并將生成的測試報告發送到指定郵箱。
整體使用Python+Unittest+PO框架實現自動化測試。基于Unittest框架,使用PO對象實現通用操作封裝,提高了測試腳本的可重用性;使用ddt裝飾器實現遍歷測試數據并批量執行[6];同時實現了測試過程的自動截圖,能夠斷言對比測試用例的正確性,并將生成的測試報告發送到指定郵箱。可以看出,使用Py?thon+Unittest+PO 框架實現自動化測試,能夠實現自動化測試流程的一體化,提高測試效率。
參考文獻:
[1] 王春明.基于Unittest的Python測試系統[J].數字通信世界,2023(3):66-69.
[2] 李亞偉,牛士會.基于Python通過unittest進行自動化測試[J].價值工程,2023,42(14):163-165.
[3] 蔣程燕,孟令琴.基于Python語言的自動化測試應用實例[J].工業控制計算機,2021,34(10):109-110,113.
[4] 王娜.基于python的接口自動化測試框架設計[J].電腦知識與技術,2020,16(12):246-248.
[5] 方巍,吳伶琳.基于Python的Web自動化測試的實踐[J].現代計算機,2020(34):91-94.
[6] 單攀攀.一種基于Selenium與Unittest的Web自動化測試框架[J].信息技術與網絡安全,2021,40(9):77-80.
【通聯編輯:謝媛媛】