UI自動化框架搭建--unittest
使用的代碼是Python3版本,與時俱進哈哈
解釋一下我的框架目錄接口(每個人框架的目錄接口不一樣,根據實際要求)
common目錄:公共模塊,這個地方可以存放一下公共調用的方法或者文件之類的
log:日志目錄,存放執行自動化腳本產生的日志 ,方便定位問題所在,這個是必須有的
report:測試報告目錄,每一次執行自動化測試都需要產生一份測試報告,我這邊把執行自動化的腳本也放在里面了,以及自動化添加用例套件的方法也放在這里了,主要是嫌麻煩
testcase:測試用例目錄,封裝好的測試用例
一個很簡單的框架目錄
本次自動化框架需要的模塊主要有:HTMLTestRunner、unittest、logging、pymysq、selenium,其他的就涉及自動化的項目頁面需要了
log日志的方法:
# coding:utf-8
import logging,time,os
# 這個是日志保存本地的路徑
log_path = "C:\\Users\Administrator\PycharmProjects\\test"
class Log:
def __init__(self):
# 文件的命名
self.logname = os.path.join(log_path, '%s.log'%time.strftime('%Y_%m_%d'))
self.logger = logging.getLogger()
self.logger.setLevel(logging.DEBUG)
# 日志輸出格式
self.formatter = logging.Formatter('[%(asctime)s] - %(filename)s[line:%(lineno)d] - fuc:%(funcName)s- %(levelname)s: %(message)s')
def __console(self, level, message):
# 創建一個FileHandler,用於寫到本地
fh = logging.FileHandler(self.logname, 'a',encoding="utf-8") # 追加模式
fh.setLevel(logging.DEBUG)
fh.setFormatter(self.formatter)
self.logger.addHandler(fh)
# 創建一個StreamHandler,用於輸出到控制台
ch = logging.StreamHandler()
ch.setLevel(logging.DEBUG)
ch.setFormatter(self.formatter)
self.logger.addHandler(ch)
if level == 'info':
self.logger.info(message)
elif level == 'debug':
self.logger.debug(message)
elif level == 'warning':
self.logger.warning(message)
elif level == 'error':
self.logger.error(message)
# 這兩行代碼是為了避免日志輸出重復問題
self.logger.removeHandler(ch)
self.logger.removeHandler(fh)
# 關閉打開的文件
fh.close()
def debug(self, message):
self.__console('debug', message)
def info(self, message):
self.__console('info', message)
def warning(self, message):
self.__console('warning', message)
def error(self, message):
self.__console('error', message)
if __name__ == "__main__":
log = Log()
log.info("---測試開始----")
log.info("輸入密碼")
log.warning("----測試結束----")
添加測試用例的套件:
文件一:
import unittest
class ParametrizedTestCase(unittest.TestCase):
def __init__(self, methodName='runTest', param1=None, param2=None, param3=None):
super(ParametrizedTestCase, self).__init__(methodName)
self.param1 = param1
self.param2 = param2
self.param3 = param3
@staticmethod
def parametrize_case(classname, casename, param1=None, param2=None, param3=None):
suite = unittest.TestSuite()
suite.addTest(classname(casename, param1=param1, param2=param2, param3=param3))
return suite
@staticmethod
def parametrize_class(testcase_klass, param1=None, param2=None, param3=None):
testloader = unittest.TestLoader()
testnames = testloader.getTestCaseNames(testcase_klass)
suite = unittest.TestSuite()
for name in testnames:
suite.addTest(testcase_klass(name, param1=param1, param2=param2, param3=param3))
return suite
文件二:
# -*-_ coding: utf-8 -*-
import unittest
import time
from selenium import webdriver
import HTMLTestRunner
from common.test_excel import *
from report.Parametrized import *
from testcase.test_login import Login
from testcase.test_webqz import Webqz
from testcase.test_qzvideo import Videpqz
from testcase.test_qzshaixuan import QzShaiXuan
from testcase.test_gerenzx import Gerenzx
from testcase.test_cunzhengqq import CunZhengQQ
...
driver = webdriver.Chrome()
ceshi_url = "http://192.168.1.1:81/sign"
ceshi2_url = 'http://192.168.1.2:81/attestationsh'
login_name = '18999999999'
login_passwd = 'a123456'
webqz_num = 10
webqz_name = time.strftime("%Y-%m-%d-%H_%M_%S",time.localtime(time.time())) +"升級測試"
guochengqz_name = "自動化測試"
guochengqz_biaoqian = "測試"
shaixuanqz_name = "自動化"
baoquanbi_num = 520
gerenzx_qzurl = 'https://www.baidu.com'
cunzheng_biaoqian = '自動化測試'
cunzheng_file_name = '199'
suite = unittest.TestSuite()
suite.addTest(ParametrizedTestCase.parametrize_class(Login, param1=driver,param2=baoquanceshi_url,param3=login_name))
suite.addTest(ParametrizedTestCase.parametrize_case(Webqz,"test_webqz_search", param1=driver,param2=webqz_name,param3=webqz_num))
suite.addTest(ParametrizedTestCase.parametrize_case(Videpqz,"test_video_search", param1=driver,param2=guochengqz_name,param3=guochengqz_biaoqian))
suite.addTest(ParametrizedTestCase.parametrize_class(Gerenzx, param1=driver,param2=baoquanbi_num,param3=webqz_name))
suite.addTest(ParametrizedTestCase.parametrize_class(CunZhengQQ, param1=driver,param2=cunzheng_biaoqian,param3=cunzheng_file_name))
suite.addTest(ParametrizedTestCase.parametrize_class(QzShaiXuan, param1=driver,param2=shaixuanqz_name,param3=login_name))
...
now = time.strftime("%Y-%m-%d %H_%M_%S")
filename = ".\\" + now + "result.html"
fp = open(filename, "wb")
runner = HTMLTestRunner.HTMLTestRunner(stream=fp,title="自動化測試報告")
runner.run(suite)
文件一是一個添加測試用例套件的方法
文件二是調用文件一的方法將測試封裝好的測試用例進行添加,從而執行所有測試用例產生測試報告
舉一個模擬登錄的測試用例腳本
#-*- coding = utf - 8 -*-
from report.Parametrized import ParametrizedTestCase
import time , sys
from log.log_test import Log
import pytesseract
from PIL import Image,ImageEnhance
from selenium import webdriver
log = Log()
screenImg = "D:/checkcode.png"
i = 0
class Login(ParametrizedTestCase):
def test_login_search(self):
self.param1.get(self.param2)
self.param1.maximize_window()
try:
self.param1.find_element_by_name('phoneNumber').send_keys(self.param3)
log.info("輸入用戶賬號:%s" % self.param3)
self.param1.find_element_by_name('password').send_keys('a123456')
log.info("輸入用戶密碼:a123456")
for i in range(100):
self.param1.save_screenshot(screenImg) # 截取當前網頁,該網頁有我們需要的驗證碼
location = self.param1.find_element_by_xpath("//img[@class='check-code']").location
size = self.param1.find_element_by_xpath("//img[@class='check-code']").size
left = location['x']
top = location['y']
right = location['x'] + size['width']
bottom = location['y'] + size['height']
img = Image.open(screenImg).crop((left, top, right, bottom))
img = img.convert('L') # 轉換模式:L | RGB
img = ImageEnhance.Contrast(img) # 增強對比度
img = img.enhance(2.0) # 增加飽和度
img.save(screenImg)
# 讀取截圖
img = Image.open(screenImg)
# 獲取驗證碼
code = pytesseract.image_to_string(img)
# 打印驗證碼
print(list(code))
# 清空驗證碼輸入框
self.param1.find_element_by_name('checkCode').clear()
# 輸入驗證碼
self.param1.find_element_by_name('checkCode').send_keys(code)
# 提交登錄
self.param1.find_element_by_class_name("login").click()
# time.sleep(2)
# if循環,當生成的code列表有4個元素時,跳出循環,否則刷新驗證碼,循環操作
if len(list(code)) == 4:
log.info("登陸成功")
break
else:
self.param1.find_element_by_xpath("//img[@class='check-code']").click()
time.sleep(1)
log.warning("登陸失敗")
except Exception as err:
log.info("執行失敗")
這是一個簡單識別驗證碼登錄的用例,對每一步進行日志打印,以方便后面定位問題
對一個簡單的UI自動化框架的認知,大神可以指導一波
萌新入門,不喜勿噴,哈哈哈