在python里使用unittest寫好用例后,想用一個批處理文件去雙擊即可運行,而且還想在批處理里面設置用例要傳人的參數怎么辦呢?
下面是我的解決辦法:
1、在用例里面用sys.argv來設置
# -*- coding: utf-8 -*- import json import unittest import time from appium import webdriver #from HtmlTestRunner import HTMLTestRunner from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.common.action_chains import ActionChains import sys reload(sys) sys.setdefaultencoding('utf8') startime=time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) argv=sys.argv print(argv) if len(argv) >1 : waittime = argv[1] #批處理輸入參數1 if len(argv) >2 : login=argv[2] print(type(login)) login = json.loads(login) if len(argv) >3 : noReset=argv[3] else: noReset = True else: login = { "username": "xxxxxx", "userpwd": "xxxx", "newsever": "http://IP:port/agent_client" } else: waittime=5 class LotteryTests(unittest.TestCase): def setUp(self): #初始化測試平台 desired_caps = { 'platformName': 'Android', #移動操作平台 'platformVersion': '4.4.2', # 移動操作系統版本 'newCommandTimeout': '3600', # 自定義超時時間 'deviceName': '127.0.0.1:52001', # 設備名稱 'appPackage': 'com.dgcy.pasx', # 測試APP的包名 'app': 'E://example_android.apk', 'appActivity': 'com.dgcy.ui.activity.StartTicketsActivity', # 要從包中啟動的Android活動的活動名稱 'automationName': 'Appium', # 自動化引擎 # 'unicodeKeyboard':True, # 'resetKeyboard':True, 'noReset': noReset, 'chromeOptions': {'androidProcess': 'com.dgcy.paysx'} } print(startime+': 打開APP...'.decode("utf-8")) self.driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub',desired_caps) time.sleep(5) def isElementExist(self, locator): """ locator: locator輸入規則:元素屬性名=元素屬性值,如果是id則以"id=xxx",如果是css則以“css=xxx”等,例如:id=com.dgcy.paysx:id/monitor_t;css=div.popup-content; xpath=//div[text()='刪除成功'];name=myna;class=mmv;link=登錄; :return: 布爾值 """ list=locator.split('=') flag = True driver = self.driver try: if list[0] == "id": driver.find_element_by_id(list[1]) elif list[0] == "xpath": driver.find_element_by_xpath(list[1]) elif list[0] == "name": driver.find_element_by_namne(list[1]) elif list[0] == "css": driver.find_element_by_css_selector(list[1]) elif list[0] == "class": driver.find_element_by_class_name(list[1]) elif list[0] == "tag": driver.find_element_by_tag_name(list[1]) elif list[0] == "link": driver.find_element_by_link_text(u"%s" % list[1]) return flag except: flag = False return flag def login(self): #打開app並判斷是否自動登錄 print("Start test1...open application") time.sleep(2) #判斷是否需要登錄 driver = self.driver assertelement=LotteryTests.isElementExist(self,"id=com.dgcy.paysx:id/monitor_t") if not assertelement: loging = driver.find_element_by_id("com.dgcy.paysx:id/login_submit").text try: assert '登錄'.decode("utf-8") in loging #檢測到登錄按鈕 print("檢測到登錄按鈕,重新登錄....".decode("utf-8")) #輸入用戶名 driver.find_element_by_id("com.dgcy.paysx:id/loginUserName").send_keys(login["username"]) #輸入密碼 driver.find_element_by_id("com.dgcy.paysx:id/loginPwd").send_keys(login["userpwd"]) #輸入服務器設置 driver.find_element_by_id("com.dgcy.paysx:id/fwurl").send_keys(login["newsever"]) time.sleep(1) #點擊登錄 driver.find_element_by_id("com.dgcy.paysx:id/login_submit").click() except AssertionError as e: print("未檢測到登錄按鈕....".decode("utf-8")) else: print("已登錄在APP首頁".decode("utf-8")) time.sleep(2) def test_03_allTicket(self,timewait=waittime): # 檢測‘運營監控’ timewait=int(timewait) driver = self.driver assertelement = LotteryTests.isElementExist(self, "id=com.dgcy.paysx:id/monitor_t") if assertelement: firstPage = driver.find_element_by_id("com.dgcy.paysx:id/monitor_t").text # 添加斷言是否顯示“運營監控” try: assert '運營監控'.decode("utf-8") in firstPage print("Login User is Right!") except AssertionError as e: print('loginUser is Error') self.login() # 非‘運營監控’則重新登錄 else: self.login() driver.find_element_by_id("com.dgcy.paysx:id/monitor_t").click() # 點擊運營監控 WebDriverWait(driver, timewait).until(lambda x: x.find_element_by_id("com.dgcy.paysx:id/rb_all")) # 等待顯示所有數據 print("正在每隔".decode("utf-8")+str(timewait)+"s循環獲取到所有設備的狀態.....".decode("utf-8")) driver.find_element_by_id('com.dgcy.paysx:id/rb_all').click() # 點擊‘全部’ while True: driver.find_element_by_id('com.dgcy.paysx:id/rb_all').click() # 點擊‘全部’ time.sleep(timewait) assertelement = LotteryTests.isElementExist(self, "id=com.dgcy.paysx:id/monitor_t") if assertelement == False: raise ValueError("elm:(com.dgcy.paysx:id/monitor_t) is not exist!") #print("等待了"+str(timewait)+"s,獲取到所有設備的狀態.....") def tearDown(self): self.driver.quit() if __name__ == '__main__': #構造測試套件 unittest.main()
2、寫批處理文件test.bat
::后面的數字為等待時間,如果不輸入則默認為5s,如果是需要輸入用戶名密碼重新登錄請把最后面的True改為False,最后一個參數如果是True或不填表示不需要輸入用戶名密碼重新登錄 python C:\Users\用戶名\PycharmProjects\XAJK\SX-lottery.py 10 {\"username\":\"xxxxx\",\"userpwd\":\"xxxxx\",\"newsever\":\"http://ip:port/agent_client\"} False pause
3、還需要修改unittest里面的main.py文件
因為unittest原本就沒有想過要做批處理里加參數運行,所以要想成功必須得修改一下C:\Python27\Lib\unittest\main.py源碼:
在93行后面加入一下代碼:
if len(argv)>1: argv=argv[:1]
修改完畢,運行自己編寫的test.py,成功!