unittest 單元測試
單元測試:
顆粒度最小,一般由開發小組採用白盒方式來測試,主要測試單元是否符合“設計”;是指對軟體中的最小可測試單元進行檢查和驗證
整合測試:
介於單元測試和系統測試之間,一般由開發小組採用白盒+黑盒的方法來測試,即驗證“設計”又驗證“需求”。主要用來測試模板與模板之間的介面,同時還要測試一些主要的業務功能。
功能測試:
顆粒度最大,一般由獨立的測試小組採用黑盒的方式來測試,主要測試系統是否符合“需求規格說明書
問題:什麼是白盒測試,什麼是黑盒測試
主要應用於單元測試階段,主要是對程式碼級別的測試,針對程式內部的邏輯結構。測試的手段有:語句覆蓋、判定覆蓋、條件覆蓋、路徑覆蓋和條件組合覆蓋
不考慮程式內部結構和邏輯結構,主要是測試系統的功能是否滿足“需求規格說明書”。一般會有一個輸入值和一個輸出值,和期望值做比較。
unittest重要組成:
Python中有一個自帶的單元測試框架是unittest模組,用它來做單元測試,它裡面封裝好了一些校驗返回的結果方法(斷言)和一些用例執行前的初始化操作。
unittest中最核心的部分是:TestFixture、TestCase、TestSuite、TestRunner
TestFixture:用於一個測試環境的準備和銷燬還原。
當測試用例每次執行之前需要準備測試環境,每次測試完成後還原測試環境,比如執行前連線資料庫、開啟瀏覽器等,執行完成後需要還原資料庫、關閉瀏覽器等操作。這時候就可以啟用testfixture。
setUp():準備環境,執行每個測試用例的前置條件;
tearDown():環境還原,執行每個測試用例的後置條件;
setUpClass():必須使用@classmethod裝飾器,所有case執行的前置條件,只執行一次;
tearDownClass():必須使用@classmethod裝飾器,所有case執行完後只執行一次;
TestCase:測試用例
一個類class繼承 unittest.TestCase,就是一個測試用例。
什麼是測試用例呢?就是一個完整的測試流程,包括測試前準備環境的搭建(setUp),執行測試程式碼(run),以及測試後環境的還原(tearDown)。
繼承自unittest.TestCase的類中,測試方法的名稱要以test開頭。且只會執行以 test開頭定義的方法(測試方法),測試用例執行的順序會按照方法名的ASCII值排序。
如果想跳過某個測試用例,@unittest.skip(‘描述資訊')
import unittest
class Calc_testcase(unittest.TestCase):
def setUp(self) : #測試用例方法執行前的操作
print("start")
def test1(self): #測試用例
resl = c.add(2,3)
self.assertEqual(resl,5)
def tearDown(self) : #測試用例方法執行後的操作
print("end")
if name
unittest.main() #呼叫測試用例中以test開頭的方法
斷言:
assertEqual(a,b):斷言a和b是否相等,相等則測試用例通過。
assertNotEqual(a,b):斷言a和b是否相等,不相等則測試用例通過。
assertTrue(x):斷言x是否True,是True則測試用例通過。
assertFalse(x):斷言x是否False,是False則測試用例通過。
assertIs(a,b):斷言a是否是b,是則測試用例通過。
assertNotIs(a,b):斷言a是否是b,不是則測試用例通過。
assertIsNone(x):斷言x是否None,是None則測試用例通過。
assertIsNotNone(x):斷言x是否None,不是None則測試用例通過。
assertIn(a,b):斷言a是否在b中,在b中則測試用例通過。
assertNotIn(a,b):斷言a是否在b中,不在b中則測試用例通過。
assertIsInstance(a,b):斷言a是是b的一個例項,是則測試用例通過。
assertNotIsInstance(a,b):斷言a是是b的一個例項,不是則測試用例通過。
TestSuite:測試套件,可以將多個測試用例集合在一起,能一起執行選中的測試用例。
方式一:
suite = unittest.TestSuite()#建立測試套件
case_list = [“test1”,”test2”….]
For case in case_list:
suite.addTest(類名(case))
方式二
suite = unittest.TestSuite()#建立測試套件
suite.addTest(類名 (“test1“))
suite.addTest(類名 (“test2“))
TestSuite:測試套件,可以將多個測試用例集合在一起,能一起執行選中的測試用例。
方式三:(新增一個測試用例類 )
suite = unittest.TestSuite()#建立測試套件
loader = unittest.TestLoader()# 建立一個載入物件 suite .addTest(loader.loadTestsFromTestCase(類名))
TextRunner:執行測試用例
通過TextTestRunner類提供的run()方法來執行test suite/test case
格式如下:
runner = unittest.TextTestRunner(verbosity=2)
runner.run(suite)
verbosity :表示測試報告資訊的詳細程度,一共三個值,預設是2
0 (靜默模式):你只能獲得總的測試用例數和總的結果,如:總共100個 失敗10 成功90
1 (預設模式):類似靜默模式,只是在每個成功的用例前面有個. 每個失敗的用例前面有個F
2 (詳細模式):測試結果會顯示每個測試用例的所有相關的資訊
生成測試報告(重點)
html格式的就是HTMLTestRunner了,HTMLTestRunner是 Python 標準庫的 unittest 框架的一個擴充套件,它可以生成一個直觀清晰的 HTML 測試報告。使用的前提就是要下載 HTMLTestRunner.py
格式如下:
with open("../report.html","wb") as f:
HTMLTestRunner(
stream=f,
#tester:”xiaogang”,
title="單元測試",
description="測試一期",
verbosity=2
).run(suite)
生成測試報告
相關引數說明:
stream:指定輸出的方式
description:報告中要顯示的面熟資訊
title:測試報告的標題
verbosity :表示測試報告資訊的詳細程度,一共三個值,預設是2
0 (靜默模式):你只能獲得總的測試用例數和總的結果,如:總共100個 失敗10 成功90
1 (預設模式):類似靜默模式,只是在每個成功的用例前面有個. 每個失敗的用例前面有個F
2 (詳細模式):測試結果會顯示每個測試用例的所有相關的資訊
操作
1:匯入unittest模組 >>>import unittest
2:編寫一個類繼承unittest.TestCase
3:呼叫setUp(self), tearDown(self)方法實現測試用例前後階段的操作
4:編寫測試用例方法
(1)該方法必須以test開頭,否則在unittest.main()中呼叫測試找不到該方法
(2)設定斷言進行判斷,輸入資料和輸出資料的預期結果
5:建立套件,將多個測試用例存放套件中,一併執行()
6:生成測試報告(python自帶或者匯入HTMLTestRunner生成html格式的測試報告)
7:執行測試用例unittest.main(),呼叫測試用例中以test開頭的方法
程式碼展示:
讀取xml檔案資料:
資料的讀取
from xml.dom import minidom
class Readxml():
def read_xml(self,filename,onename,twoname):
root =minidom.parse(filename)
firstnode =root.getElementsByTagName(onename)[0]
secondnode=firstnode.getElementsByTagName(twoname)[0].firstChild.data
return secondnode
獲取xml檔案中的資料
讀取csv檔案資料:
資料的讀取
import csv #匯入csv模組
class ReadCsv():
def read_csv(self):
item =[] #定義一個空列表
c = csv.reader(open("../commonDemo/test1.csv","r")) #得到csv檔案物件
for csv_i in c:
item.append(csv_i) #將獲取的資料新增到列表中
return item
r = ReadCsv()
print(r.read_csv())