大家好。我是小蔡:
這是Web自動的第二章。上一張主要介紹selenium框架。這一章我介紹其他框架和工具
今天分享的內容有幾個方面:
1.Unitest測試框架
2.Log模塊以及底層
3.PO模式
4.數據驅動
5.HTML自動生成報告(GIT引入的一個包,哈哈)
1.Unitest測試框架:
引入Unitest的目的:1)解決一類多用的問題。2)需要斷言
核心組件:
TestCase[用例組件]
TestSuite
TestRunner(套件)
TestLoader(套件)
Fixture(工程裝置)
TestCase:
操作:
1.導包 import unittest
2.新建類,並繼承unittest.TestCase
3.測試方法必須使用Test開頭
代碼:
import unittest
class Test(unittest.TestCase)
TestRunner(套件)/TestSuite:
多個TestCase組成TeSuite套件
使用:
實例化
suite = unittest.TestSuite
添加用例:#添加
suite.addTest(Test01("test_add"))
執行套件:
實例化
runner = unittest_textTestRunner
添加/執行套件
runner.run(suite)
擴展添加:
搜索指定classname 內中以test開頭方法並執行套件
my_name_si_shili=unittest.Testsuite()
my_name_si_shili.addtest(unittest.makesuite(Test02))
.....
TestLoader方法類:
解決批量導入的問題:將Testcase添加入套件,滿足條件就添加
my_name_si_shili=unittest.TestLoader().discover(測試目錄.查找py文件格式)
不使用實例化
unittest.defaultTestLoader.discover(../cases)
區別(TestLoader與TestSuite)
兩者都是套件,前置是按指定目錄,指定py文件。后者是按類和方法
Fixture裝置(前置通知/后置通知)
#初始化函數 def setup()
#結束函數 def setdown()
級別:函數/類/模塊
類
@classmethon 對類級別進行修飾
def set/downclass()
模塊
def set/downmodule()
斷言UnitTest
常用斷言:
asserture()
asserfalse()
assertEqual(參數1,參數2)
assernotEqual(參數1,參數2)
assertIn("XXX","XXX") #后面串包含前面的串
擴展:
python自帶斷言機制
assert str1=str2
assert str1 in str2 "錯誤信息"
assert Ture/false
Unittest跳過
對一些為滿足的測試用例進行跳過
Unittest.Skip(‘代碼未完成’)
#可用於修飾測試函數跳過
滿足特定條件提過
Unittest.SkipIf(跳過條件,原因)
2.生成HTML測試報告
因為Unittest沒有自帶HTML版的報告
操作
復制HTMLTestRunner.py文件到指定目錄(git下載)
導包操作 import HTMLTestRunner
直接打開文件,並調用run方法
實戰操作:
擴展:
open與with open 區別
相同點:均是打開文件
異同點:with open 等於打開關閉文件
一般打開文件都怎么寫:
try:
f=open("../目錄”,“r”,enconding="utf-8")
print(f.read())
except:
pass
finally:
f.close()
3.PO模式:
PO模式主要思想
1.不采用任何方法
2.采用測試框架
3.將業務代碼和頁面對象進行(分離)
4.實際編寫 Po編寫
所以我們Web自動化架構分成:三層即page類,case類,base類
page:一個頁面一個對象
case:集成base類+調用page頁面
base:抽取公共的方法
4.數據驅動
前置知識:
Unittest框架時沒有參數化插件的。需要建築parameterized插件實現參數化
parameterized使用步驟:
導入parameterized框架包
需要在參數化的測試函數上@parameterized.expand(列表)
列表的值:單(列表)多(值為列表嵌套元組)【(1,2,3),(1,2,3,)】
用法:
class def_01(unittest.TestClass):
#單個參數使用法:
@parameterized.expand(["1,2,3"]):
def test_add_one(sefl,num):
pringt(num)
思想:
將數據放置到文件中,實現數據驅動
是一種設計思想
數據驅動技術是以講關注點放到測試數據的構建上,可以將不同數據,執行相同用例上
依賴於我們的前置參數化
傳入方式/載體:
直接定義在腳本中
從文件中讀取:json,excel,xml,txt
從數據庫中獲取
直接從接口獲取數據
本地封裝
總結:
數據驅動=數據存儲+讀取數據工具(自己寫的)+參數化技術
Json:
問題:
需要數據格式【(),()】,【(),()】
解決:
新建列表
讀取值,轉化json
arrys=[]
for date in read_json(“login_json").values():
arrys.append((date.get("username"))
json基本情況介紹
1.基於文本輕量級交換
2.具有良好的結構
【key,value】
xml格式:
<?xml version=8 encoding=utf-8"?>
<person>
....
</person>
擴展:
json與字典之間轉化:
轉化代碼:
python--->json
import json
date= {"name":“名字”,“年齡”:“18” }
date=json.dumps(date)
json-->python
import json
json= {"name":“名字”,“年齡”:“18” }
date2=json.loads(json)
讀取json:
with open ('文件名',‘r’,enconding='utf-8') as f :
date=json.load(f)
寫入json:
json_01={'name':'tom','age':‘18’}
with open('data.json','w',encoding='utf-8') as f:
json.dump(json_01,f,ensure_ascill=False)
編寫數據數據讀取工具類:(動態獲取)
def read_json(filename):
filename="../date/"+filename
#調用讀取方法
with open(filename,"r",enconding=utf-8) as f :
return json.load(f)
5.日記模塊:
作用
運行調試錯誤
便於觀察
級別
Debug調試級別
Info信息級別
WARINO警告
Error出現不能用
Crttal嚴重錯誤
如何使用
Logging模塊
logging{級別}
#如何設置日記級別:
logging,basicConfig(level=looging.DEBUG)
#如何設置日志格式:
f=指定格式
logging.basicConfig(level=looging.DEBUG,format=f,filename"路徑格式")
基本用法:
def get_logging():
f=指定格式
logging.basicConfig(level=looging.DEBUG,format=f,filename"路徑格式")
return logging
#在每個需要操作的步驟上方或者下方標注即可
標注方式:logging.info
高級用法:涉及logging類的底層,這個部分可看也可以不看
日記的四大組件
日記類:Logger 提供入口
處理類:Handler 將logging日記發送到合適的目的輸出
格式器:Forratter 決定日志的輸出格式
過濾器:Fitter 提供了更細的粒度控制日志記錄
組件關系
logger 需要多個Hanlder 將日志輸出到A,B
Hanlder需要設置 formatter 將日志輸出到AB
formatter設置,實現過濾
獲取Looger對象:
logger =logger.getLogger()
logger=logger.getLoggger("指定名稱”)
Logger常用對象:
Logger.五個等級()
Logger.setLevel()//設置日志將會處理等級
Logger.addHandler()//為該logger對象添加handler
Looger.addFilter()//為該logger對象添加一個filter對象
Handler類
#將消息分配到指定位置
Logger對象可以通過addhandler()方法為自己添加對象
#如何創建handler對象
基本不實例化和handeler實例
handler是個基類
#logering內置handler包括:
獲取控制器(處理類)
sh.logging.StreamHandle()
logger.addHandler(sh)
#時間處理器和格式處理器:
#添加格式器
#以及設置處理器級別
最后。。。給大家看看成品吧 我實在是不想分步驟了
最后呢運用了一個單例的設計模式。。去設計這個日記類。。就是預防多次調用,出現了多個logger()方法
總結:
web自動化基本上已經總結完了。后續會推出App自動化的學習筆記。也感謝各位關注。
至於提到的Web項目的實戰。會找一個三端的東西結合運用吧 App/Web/后台 三者的結合的系統(目前正在開發ing~)