首頁 > 軟體

python遊戲測試工具自動化遍歷遊戲中所有關卡

2022-06-21 14:00:21

場景

遊戲裡有很多關卡(可能有幾百個了),理論上每次釋出到外網前都要遍歷各關卡看看會不會有異常,上次就有玩家在打某個關卡時卡住不動了,如果每個關卡要人工遍歷這樣做會非常的耗時,所以考慮用自動化的方式來實現。

思路

遊戲的戰鬥是有時間限制的,到了 5 分鐘打不過就會判負,勝負都會出現結算面板,用 GA 提供的 find_element_wait 函數查詢這個結算面板,從進入戰鬥到找到了這個面板 element 就是通關時間,如果超過 5 分鐘了就說明被卡住了,最後輸出一張” 關卡通關時間表 “排序看看哪些關卡通關時間>5 分鐘即為有問題的關卡。

實現細節

1.卡住的判定和處理

GAutomator find_element_wait 函數的說明

程式碼中設定 5 秒查一次結算面板,超過 60 次其實已經卡住了 。Page.panel_BattleRes 是結算面板,這裡採用 PO 模式把所有的 element 都寫入到一個 Page 中。

如果卡住 了遊戲會一直停在哪裡,卡住後利用 adb 指令重啟遊戲並繼續測試下一個關卡一直到遍歷整個關卡列表。

2.GAutomator 呼叫遊戲內部的 GM 指令

GAutomator 可以把遊戲裡的 C# 函數註冊過來然後在 python 中呼叫,這是 GA 說明檔案相關部分:

所以把遊戲中的 GM 指令方法註冊過去再在指令碼裡呼叫,這樣我才能用指令進入各關卡而不會受到等級、入口、前置關卡等限制

unity 中:

python 中:

3.最終輸出的報告

第一列是關卡 id,第二列是通關時間,100014 這個關卡是有問題的,因為已經超過 5 分鐘了

詳細程式碼

AutoBattleTest.py 用來實現核心邏輯

from testcase.tools import *
from testcase.ExcelTool import ExcelReader,ExcelWriter
from testcase.Page import Page
class AutoBattle:
    def __init__(self,level_excel_path):
        self.start_time=0
        self.levelList=ExcelReader(level_excel_path).read_first_sheet_first_col()
        self.excelWriter =  ExcelWriter()
        print(self.levelList)
    def start_battle(self):
        self.start_time=time.time()
        m_btnStartGame = engine.find_element(Page.btn_BeginFight)
        screen_shot_click(m_btnStartGame)
        #auto fight
        m_autoFight = engine.find_element(Page.btn_AutoFight)
        screen_shot_click(m_autoFight)
    def test_each_level(self):
        for index,level in enumerate(self.levelList):
            print("關卡id---->"+level)
            engine.call_registered_handler("GoTo", "n"+level) #這裡呼叫unity裡的GM指令
            self.start_battle()
            battleResult = find_element_wait(Page.panel_BattleRes, 65, 5)
            if (battleResult):
                screen_shot_click(battleResult)
                duration = str(int(time.time() - self.start_time))  # 關卡持續時間
                self.excelWriter.write_excel(index, 0, level)  # 第一列寫關卡名
                self.excelWriter.write_excel(index, 1, duration)  # 第二列寫通關時間
            else:
                duration = str(int(time.time() - self.start_time))  # 關卡持續時間
                self.excelWriter.write_excel(index, 0, level)  # 第一列寫關卡名
                self.excelWriter.write_excel(index, 1, duration)  # 第二列寫通關時間
                self.restart_game()
                self.default_login()
                find_element_wait(Page.btn_Battle)
        self.excelWriter.save_excel()
    def restart_game(self): #重啟遊戲
        os.system("adb shell am force-stop  %s"%Page.package_name)
        time.sleep(2)
        os.system("adb shell am start -n %s/.NativeUnityPlayerActivity"%Page.package_name)
    def default_login(self):#登入一次後續直接點選就可以登入
        #m_BtnSart2
        start_btn = find_element_wait(Page.btn_LogIn)
        screen_shot_click(start_btn)
if __name__ == "__main__":
    ab = AutoBattle("level.xls")
    ab.test_each_level()

ExcelTool.py 用來讀寫表格

import xlrd
import time
import xlwt
class ExcelReader:
    def __init__(self,excel_path):
        self.excel_path = excel_path;
    def read_first_sheet_first_col(self):
        data = xlrd.open_workbook(self.excel_path)
        st = data.sheet_by_index(0)
        col  = [str(st.cell_value(i, 0)).replace(".0","") for i in range(0, st.nrows)]
        return col
class ExcelWriter:
    def __init__(self):
        self.wb = xlwt.Workbook()
        self.sh = self.wb.add_sheet("關卡通過時間記錄")
        self.cur_col  =0
    def write_excel(self,row ,col,record_str):
        self.sh.write(row, col, record_str)
    def save_excel(self):
        date_string = time.strftime("%Y%m%d%H%M")
        excel_name ="TestResult"+date_string+".xls"
        self.wb.save(excel_name)
if __name__=="__main__":
    ew = ExcelWriter()
    ew.save_excel()

後記

這套指令碼可以排查出一進入或者中途被卡住或者不結算被卡住的問題,但是如果是某個怪物的某個技能必定能導致關卡卡住,而這個怪物在放技能之前就被殺了,這種情況這套指令碼有概率排查不到。

以上就是python遊戲測試工具自動化遍歷遊戲中所有關卡的詳細內容,更多關於python遊戲測試自動化遍歷關卡的資料請關注it145.com其它相關文章!


IT145.com E-mail:sddin#qq.com