python+unittest框架整理(一点点学习前辈们的封装思路,一点点成长。。。)
預(yù)期框架整理目標(biāo):
1.單個(gè)用例維護(hù)在單個(gè).py文件中可單個(gè)執(zhí)行,也可批量生成組件批量執(zhí)行
2.對(duì)定位參數(shù),定位方法,業(yè)務(wù)功能腳本,用例腳本,用例批量執(zhí)行腳本,常用常量進(jìn)行分層獨(dú)立,各自維護(hù)在單獨(dú)的.py文件中
3.加入日志,htlm報(bào)表,發(fā)送郵件功能
框架結(jié)構(gòu)
?
結(jié)構(gòu)說明:
config:配置部分,瀏覽器種類和定位信息維護(hù)在此處
constant:常量部分,固定不變的數(shù)據(jù)維護(hù)在此處
data:存放用于參數(shù)化的文本表格等文件
encapsulation:定位等selenium功能二次封裝在此處
error_picture:存放錯(cuò)誤截圖
function:業(yè)務(wù)功能腳本維護(hù)在此處
log:存放log類
report:存放測試報(bào)告文件
test_case:存放用例文件
all_case.py:用來執(zhí)行所有用例
debug_case.py:本人調(diào)試用的,可以忽略
tst.log:生成的日志
逐個(gè)介紹各個(gè)包下面的.py文件,并附上源碼(說明見注釋哈哈~):
?
1 #!/usr/bin/env python 2 # -*- coding: utf-8 -*- 3 # @Time : 2017-05-11 13:42 4 # config/config_01.py 5 from selenium import webdriver 6 import time 7 from selenium.webdriver.common.action_chains import * 8 9 10 # config配置部分 11 12 # 瀏覽器種類維護(hù)在此處 13 browser_config = { 14 'ie': webdriver.Ie, 15 'chrome': webdriver.Chrome 16 } 17 18 # 定位信息維護(hù)在此處,維護(hù)結(jié)構(gòu)由外到內(nèi)為:頁面名稱--頁面下元素名稱--元素的定位方式+參數(shù) 19 locat_config = { 20 '博客園首頁': { 21 '找找看輸入框': ['id', 'zzk_q'], 22 '找找看按鈕': ['xpath', '//input[@value="找找看"]'] 23 } 24 } 1 #!/usr/bin/env python 2 # -*- coding: utf-8 -*- 3 # @Time : 2017-05-15 13:20 4 # constant/constant_1.py 5 6 # 常量部分(固定不變使用頻繁的參數(shù)維護(hù)在此處) 7 LOGIN_URL = 'https://www.cnblogs.com/' 1 #!/usr/bin/env python 2 # -*- coding: utf-8 -*- 3 # @Time : 2017-05-15 13:20 4 # encapsulation/encapsulation.py 5 6 # 封裝部分維護(hù)在此 7 8 from config.config_01 import locat_config 9 from log.log import Logger 10 from selenium.webdriver.support.wait import WebDriverWait 11 12 from selenium.webdriver.support import expected_conditions as EC 13 14 class UIHandle(): 15 logger = Logger() 16 17 # 構(gòu)造方法,用來接收selenium的driver對(duì)象 18 @classmethod 19 def __init__(cls, driver): 20 cls.driver = driver 21 22 # 輸入地址 23 @classmethod 24 def get(cls, url): 25 cls.logger.loginfo(url) 26 cls.driver.get(url) 27 28 # 關(guān)閉瀏覽器驅(qū)動(dòng) 29 @classmethod 30 def quit(cls): 31 cls.driver.quit() 32 33 # element對(duì)象(還可加入try,截圖等。。。) 34 @classmethod 35 def element(cls, page, element): 36 # 加入日志 37 cls.logger.loginfo(page) 38 # 加入隱性等待 39 # 此處便可以傳入config_o1中的dict定位參數(shù) 40 el = WebDriverWait(cls.driver, 10).until(EC.presence_of_element_located(locat_config[page][element])) 41 # 加入日志 42 cls.logger.loginfo(page+'OK') 43 return el 44 # element對(duì)象(還未完成。。。) 45 def elements(cls, page, element): 46 # 加入日志 47 cls.logger.loginfo(page) 48 # 加入隱性等待 49 WebDriverWait(cls.driver, 10) 50 els = cls.driver.find_elements(*locat_config[page][element]) 51 # 注意返回的是list 52 return els 53 54 # send_keys方法 55 @classmethod 56 def Input(cls, page, element, msg): 57 el = cls.element(page, element) 58 el.send_keys(msg) 59 60 # click方法 61 @classmethod 62 def Click(cls, page, element): 63 el = cls.element(page, element) 64 el.click() 1 #!/usr/bin/env python 2 # -*- coding: utf-8 -*- 3 # @Time : 2017-05-15 13:22 4 # function/function_01.py 5 # 業(yè)務(wù)功能腳本(用例腳本可調(diào)用此處的功能腳本) 6 7 from encapsulation.encapsulation import UIHandle 8 from constant.constant_1 import LOGIN_URL 9 from config.config_01 import browser_config 10 from time import sleep 11 12 # 打開博客園首頁,進(jìn)行找找看搜索功能 13 def search(msg): 14 # 打開瀏覽器 15 driver = browser_config['chrome']() 16 # 傳入driver對(duì)象 17 uihandle = UIHandle(driver) 18 #輸入url地址 19 uihandle.get(LOGIN_URL) 20 # 調(diào)用二次封裝后的方法,此處可見操作了哪個(gè)頁面,哪個(gè)元素,msg是要插入的值,插入值得操作在另外一個(gè)用例文件中傳入 21 uihandle.Input('博客園首頁', '找找看輸入框', msg) 22 uihandle.Click('博客園首頁', '找找看按鈕') 23 uihandle.quit() 1 #!/usr/bin/env python 2 # -*- coding: utf-8 -*- 3 # @Time : 2017-05-17 11:19 4 # log/log.py 5 6 import logging 7 import logging.handlers 8 9 # 日志類 10 class Logger(): 11 LOG_FILE = 'tst.log' 12 13 handler = logging.handlers.RotatingFileHandler(LOG_FILE, maxBytes = 1024*1024, backupCount = 5) # 實(shí)例化handler 14 fmt = '%(asctime)s - %(filename)s:%(lineno)s - %(name)s - %(message)s' 15 16 formatter = logging.Formatter(fmt) # 實(shí)例化formatter 17 handler.setFormatter(formatter) # 為handler添加formatter 18 19 logger = logging.getLogger('tst') # 獲取名為tst的logger 20 logger.addHandler(handler) # 為logger添加handler 21 logger.setLevel(logging.DEBUG) 22 def loginfo(self, message): 23 self.logger.info(message) 24 25 def logdebug(self, message): 26 self.logger.debug(message) 1 #!/usr/bin/env python 2 # -*- coding: utf-8 -*- 3 # @Time : 2017-05-15 15:30 4 # test_case/test_case_1/start_case_01.py 5 6 import unittest 7 from function.function_01 import * 8 # 用例 9 class Case_02(unittest.TestCase): 10 u'''哇塞好玩''' 11 def setUp(self): 12 pass 13 14 def test_zzk(self): 15 u'''輸入哇塞好玩后點(diǎn)擊找找看''' 16 search("哇塞好玩") 17 print('打印方法名:test_zzk') 18 19 def tearDown(self): 20 pass 21 22 if __name__ == "__main__": 23 unittest.main() 1 #!/usr/bin/env python 2 # -*- coding: utf-8 -*- 3 # @Time : 2017-05-10 16:34 4 # all_case.py 5 6 import unittest 7 import HTMLTestRunner 8 import time,os,datetime 9 import smtplib 10 from email.mime.text import MIMEText 11 from email.mime.multipart import MIMEMultipart 12 from email.mime.image import MIMEImage 13 14 15 16 # 取test_case文件夾下所有用例文件 17 def creatsuitel(lists): 18 testunit = unittest.TestSuite() 19 # discover 方法定義 20 discover = unittest.defaultTestLoader.discover(lists, pattern='start_*.py', top_level_dir=None) 21 #discover 方法篩選出來的用例,循環(huán)添加到測試套件中 22 for test_suite in discover: 23 for test_case in test_suite: 24 testunit.addTests(test_case) 25 print(testunit) 26 return testunit 27 list_1 = 'test_case\\test_case_1' 28 alltestnames = creatsuitel(list_1) 29 30 #取前面時(shí)間加入到測試報(bào)告文件名中 31 now = time.strftime("%Y-%m-%M-%H_%M_%S", time.localtime(time.time())) 32 filename = "report\\"+now+'result.html' #定義個(gè)報(bào)告存放路徑,支持相對(duì)路徑。 33 fp = open(filename, 'wb') 34 runner = HTMLTestRunner.HTMLTestRunner(stream=fp, title='Report_title', description='Report_description') 35 36 if __name__ == "__main__": 37 # 執(zhí)行測試用例集并生成報(bào)告 38 runner = unittest.TextTestRunner()?
感謝@大師兄+@我去熱飯的指導(dǎo)與幫助。
?
為什么選擇?
有的人喜歡創(chuàng)造世界,他們做了程序員
有的人喜歡拯救世界,他們做了測試員
?
轉(zhuǎn)載于:https://www.cnblogs.com/hxjxb/p/6914263.html
總結(jié)
以上是生活随笔為你收集整理的python+unittest框架整理(一点点学习前辈们的封装思路,一点点成长。。。)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【LeetCode】031. Next
- 下一篇: websocket python爬虫_p