批量生成python自動化測試指令碼
阿新 • • 發佈:2019-01-08
先前有家供應商與我們合作開發自動化工程,採用的py unittest作為指令碼執行框架。我發現他們出的指令碼都是挨個手寫的,格式上也是參差不齊。所以有了根據用例表批量生成指令碼的一段小程式碼
供應商提供的測試指令碼
貼一個經刪減修飾後的指令碼程式碼舉例(因原指令碼很難看,我有程式碼整潔強迫症 必需加以修飾後貼出 哈哈)。
1 import unittest 2 import base64 3 import time 4 from common import objUtil 5 from common import MQTT_ClientView Code6 from common import MQTT_Server 7 from common import objwrite_excle 8 9 10 11 class test_TEM(unittest.TestCase): 12 global TestResult 13 14 def setUp(self): 15 print("開始測試XXXX") 16 #開啟Log輸出 17 objUtil.outputLog("用例編號") 18 # Publish MSG 到被測裝置 19 requestStr = request.SerializeToString()20 sMessage = str(base64.b64encode(requestStr), 'utf-8') 21 22 pub = MQTT_Client.PubMsg('127.0.0.1') 23 pub.publish("XXX_PC/Administrator/Request", sMessage, 1) 24 pub.loop(5) 25 26 # 訂閱 MSG、解碼、 27 sub = MQTT_Server.mqtt.Client() 28 while MQTT_Server.message == None:29 sub.loop() 30 returnStr = MQTT_Server.message 31 print("收到MSG:", str(returnStr)) 32 33 34 def tearDown(self): 35 print(self.TestResult) 36 #統計測試結果 37 objwrite_excle.great_excle() 38 39 40 def test_ui(self): 41 #連線手機 42 objUtil.setDriver(platformVersion="8.0", deviceName='123456') 43 objUtil.sleep(1) 44 #滑動出來APP主頁 45 objUtil.swpie_up() 46 objUtil.sleep(1) 47 #重新整理 48 objUtil.refresh() 49 objUtil.sleep(1) 50 #進行判斷比較 錯誤截圖 51 textValue = driver.get_attribute("text") 52 if textValue != "多雲": 53 objUtil.screenshot_NG() 54 self.TestResult = 'FAIL' 55 else: 56 self.TestResult = 'PASS' 57 58 59 if __name__ == '__main__': 60 unittest.main()
此處只講述我們對一個測試指令碼必須存在內容的需求。我認為若滿足以下三點要求,就算一個合格的測試指令碼了。
1、測試用例的描述,包含測試目的,測試詳細步驟,預期結果等
2、簡潔,易於閱讀和維護的程式碼結構
3、詳細的執行LOG記錄與測試報告
所以很明顯以上指令碼結構上是不夠完整的,測試執行人員可能都不知道這個指令碼測的什麼內容。改之
根據用例表批量生成指令碼
我的用例管理表如下,xlsx的表格。以下內容是隨便舉的一個例子(可能測試用例寫得不正確)
程式碼實現的邏輯:解析用例管理表,生成測試指令碼框架
# !/usr/bin/env python # -*- coding:utf-8 -*- # !python3 __author__ = "xxx" """自動化指令碼生成工具""" import os import xlrd import time TestCaseName = "" TestCaseDescription = "" TestCasePreCondition = "" TestCaseStep = "" TestCaseExpectResult = "" TestEnvironment = "" TestScriptName = "" cur_path = os.getcwd() def scripts_template(): testcases = os.path.join(cur_path, u"用例模板.xlsx") data = xlrd.open_workbook(r'%s' % testcases) table = data.sheet_by_index(0) n_rows = table.nrows n_cols = table.ncols for i in range(1, n_rows): TestCaseName = table.cell_value(i, 1) TestCaseDescription = table.cell_value(i, 2) TestCasePreCondition = table.cell_value(i, 3) TestCaseStep = table.cell_value(i, 4) TestCaseExpectResult = table.cell_value(i, 5) TestEnvironment = table.cell_value(i, 0) TestScriptName = "test_{0}".format(TestCaseName) #符合unittest測試用例定義的識別條件, 以"test"開頭 filename = os.path.join(cur_path, "{0}.py".format(TestScriptName)) with open(filename, 'w', encoding='utf-8') as out: out.write('''# !/usr/bin/env python # -*- coding:utf-8 -*- """ #----------------------------------------------------------------------- 用例名稱: {0} 用例描述: {1} 前置條件: {2} 測試步驟: {3} 預期結果: {4} 測試環境: {5} 作者:{6} 日期:{7} #----------------------------------------------------------------------- """ import unittest class {8}(unittest.TestCase): def setUp(self): #TODO 新增用例執行前置條件 pass def testRun(self): #TODO 新增用例執行測試步驟 pass def tearDown(self): #TODO 新增恢復測試環境操作 pass if __name__ == '__main__': unittest.main()'''.format(TestCaseName, TestCaseDescription, TestCasePreCondition, TestCaseStep, TestCaseExpectResult, TestEnvironment, __author__, time.strftime('%Y-%m-%d'), TestScriptName)); print("generate scripts finished!") if __name__ == "__main__": scripts_template()View Code
執行一下以上測試指令碼生成程式碼。生成的指令碼如下:
1 # !/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 4 """ 5 #----------------------------------------------------------------------- 6 用例名稱: case_01_01_01_01 7 用例描述: 測試天氣提示重新整理 8 前置條件: 9 開啟天氣APP 10 測試步驟: 11 1.後臺設定今日天氣為多雲,檢視App提示是否更新。 12 預期結果: 13 頁面天氣提示重新整理為多雲 14 測試環境: Phone 15 作者:xxx 16 日期:2019-01-08 17 #----------------------------------------------------------------------- 18 """ 19 20 import unittest 21 22 23 class test_case_01_01_01_01(unittest.TestCase): 24 25 def setUp(self): 26 #TODO 新增用例執行前置條件 27 pass 28 29 def testRun(self): 30 #TODO 新增用例執行測試步驟 31 pass 32 33 def tearDown(self): 34 #TODO 新增恢復測試環境操作 35 pass 36 37 if __name__ == '__main__': 38 unittest.main()
以上生成的指令碼看起來就比較清晰了,再新增自己封裝後的測試介面,整體結構上非常簡潔明瞭。