1.UnitTest框架css
1.1 什麼是框架?
說明:
1. 框架英文單詞framework
2. 爲解決一類事情的功能集合
1.2 什麼是UnitTest框架?
概念:UnitTest是Python自帶的一個單元測試框架,用它來作單元測試。
1.3 爲何使用UnitTest框架?
1. 可以組織多個用例去執行
2. 提供豐富的斷言方法
3. 可以生成測試報告
1.4 UnitTest核心要素
1. TestCase
2. TestSuite
3. TestRunner
4. TestLoader
5. Fixture
2. TestCase
說明:TestCase就是測試用例
2.1 案例
定義一個實現加法操做的函數,並對該函數進行測試
2.2 定義測試用例
1. 導包:import unittest
2. 定義測試類:新建測試類必須繼承unittest.TestCase
3. 定義測試方法:測試方法名稱命名必須以test開頭
2.3 執行測試用例
方式一:
使用pycharm在代碼上點擊鼠標右鍵,選擇使用UnitTest運行
方式二:
調用 unittest.main() 來運行
思考:如何同時運行多個測試用例?
3. TestSuite
說明:(翻譯:測試套件)多條測試用例集合在一塊兒,就是一個TestSuite
使用:
1. 實例化:
suite = unittest.TestSuite()
(suite:爲TestSuite實例化的名稱)
2. 添加用例:
suite.addTest(ClassName("MethodName"))
(ClassName:爲類名;MethodName:爲方法名)
3. 添加擴展:
suite.addTest(unittest.makeSuite(ClassName))
(搜索指定ClassName內test開頭的方法並添加到測試套件中)
提示:TestSuite須要配合TestRunner才能被執行
4. TextTestRunner
說明:TextTestRunner是用來執行測試用例和測試套件的
使用:
1. 實例化:
runner = unittest.TextTestRunner()
2. 執行:
runner.run(suite) # suite:爲測試套件名稱
需求
將test01.py..test10.py共10條用例,將這10條用例批量執行;
問題
1. 使用suite.addtest(unittest.makeSuite(className))導入10條測試類
2. .addtest()須要添加10次
5. TestLoader
說明:
用來加載TestCase到TestSuite中,即加載知足條件的測試用例,並把測試用例封裝成測試套件。
使用unittest.TestLoader,經過該類下面的discover()方法自動搜索指定目錄下指定開頭的.py文件
,並將查找到的測試用例組裝到測試套件;
用法:
suite = unittest.TestLoader().discover(test_dir, pattern='test*.py')
自動搜索指定目錄下指定開頭的.py文件,並將查找到的測試用例組裝到測試套件
test_dir: 爲指定的測試用例的目錄
pattern:爲查找的.py文件的格式,默認爲'test*.py'
也可使用unittest.defaultTestLoader 代替 unittest.TestLoader()
運行:
runner = unittest.TextTestRunner() runner.run(suite)
5.1 TestLoader與TestSuite區別
1. TestSuite須要手動添加測試用例(能夠添加測試類,也能夠添加測試類中某個測試方法)
2. TestLoader搜索指定目錄下指定開頭.py文件,並添加測試類中的全部的測試方法,不能指定添加測試方法;
Fixture
1.Fixture
說明:Fixture是一個概述,對一個測試用例環境的初始化和銷燬就是一個Fixture
Fixture控制級別:
1. 方法級別
2. 類級別
3. 模塊級別
1.1 方法級別
使用:
1. 初始化(前置處理):
def setUp(self) --> 首先自動執行
2. 銷燬(後置處理):
def tearDown(self) --> 最後自動執行
3. 運行於測試方法的始末,即:運行一次測試方法就會運行一次setUp和tearDown
1.2 類級別
使用:
1. 初始化(前置處理):
@classmethod
def setUpClass(cls): --> 首先自動執行
2. 銷燬(後置處理):
@classmethod
def tearDownClass(cls): --> 最後自動執行
3. 運行於測試類的始末,即:每一個測試類只會運行一次setUpClass和tearDownClass
1.3 模塊級別 [瞭解]
使用:
1. 初始化(前置處理):
def setUpModule() --> 首先自動執行
2. 銷燬(後置處理):
def tearDownModule() --> 最後自動執行
3. 運行於整個模塊的始末,即:整個模塊只會運行一次setUpModule和tearDownModule
2. 案例
需求:使用UnitTest框架對tpshop項目測試
1). 點擊登陸,進入登陸頁面
2). 輸入用戶名和密碼,不輸入驗證碼,直接點擊登陸按鈕
3). 獲取錯誤提示信息
2.1 示例代碼
import time import unittest from selenium import webdriver class TestLogin(unittest.TestCase): def setUp(self): self.driver = webdriver.Firefox() self.driver.get("http://localhost") self.driver.implicitly_wait(10) self.driver.maximize_window() def test_login(self): # 點擊登陸按鈕
self.driver.find_element_by_link_text("登陸").click() # 輸入用戶名
self.driver.find_element_by_id("username").send_keys("13012345678") # 輸入密碼
self.driver.find_element_by_id("password").send_keys("123456") # 點擊登陸按鈕
self.driver.find_element_by_css_selector("[name='sbtbutton']").click() # 獲取錯誤提示信息
msg = self.driver.find_element_by_css_selector(".layui-layer-content").text print("msg=", msg) def tearDown(self): time.sleep(3) self.driver.quit()
2.2 總結
1. 必須繼承unittest.TestCase類,setUp、tearDown纔是一個Fixture
2. setUp:通常作初始化工做,好比:實例化瀏覽器驅動對象、瀏覽器最大化、設置隱式等待等
3. tearDown:通常作結束工做,好比:關閉瀏覽器驅動對象、退出登陸等
斷言
-
什麼是斷言?html
讓程序代替人工去校驗系統執行的結果web
-
須要掌握哪一個斷言?瀏覽器
-
斷言異常類?spa
AssertionError
-
注意:捕獲到異常以後,最後經過raise
繼續向外拋出異常
參數化
安裝插件:
pip install parameterized
導包:
from parameterized import parameterized
使用方式:
-
方式一
@parameterized.expand([(1, 2), (2, 3), (4, 5)])
def test_add(self, x, y):
-
方式二【瞭解】
data = [(1, 2), (2, 3), (4, 5)]
@parameterized.expand(data)
def test_add(self, x, y):
-
方式三
# 定義到測試類的外面
def bulid_data():
# .....
retrun [(1, 2), (2, 3), (4, 5)]
@parameterized.expand(bulid_data)
def test_add(self, x, y):
跳過
對於一些未完成的或者不知足條件的測試方法或測試類能夠標記成跳過,代碼不會被執行
生成HTML測試報告
如何使用HTMLTestRunner生成測試報告?
-
把HTMLTestRunner.py文件複製到項目中
-
導包
from day06.tools.HTMLTestRunner import HTMLTestRunner
-
建立測試套件
-
定義測試報告文件存放的路徑
report_path = './report/r20100101.html'
-
打開測試報告文件流
# 該方式會自動關閉文件流
with open(report_path, "wb") as f:
# ....
-
示例化HTMLTestRunner對象
runner = HTMLTestRunner(f, title="xxx", description="xxx")
-
執行測試套件
runner.run(suite)