一、什么是單元測試&單元測試的對象
1.定義:單元測試是用來對一個模塊、一個函數或者一個類來進行正確性檢驗的測試工作
2.單元測試中最核心的四個概念:test case(測試用例),test suite(測試套件),test runner(測試運行器),test fixture(測試環境數據準備和數據清理或者測試腳手架)
?1)test case:一個testcase的實例就是一個測試用例。測試前準備環境的搭建(setUp),執行測試代碼(run),以及測試后環境的還原(tearDown)
?2)TestSuite:多個測試用例集合在一起。
?3)TestLoader:用來加載Testcase到TestSuite中。
?4)TextTestRunner:用來執行測試用例,其中run(test)會執行TestSuite/TestCase中的run(result)方法。
?5)test fixture:測試用例環境的搭建和銷毀
綜上,整個流程就是首先要寫好TestCase,然后由TestLoader加載TestCase到TestSuite,然后由TextTestRunner來運行TestSuite,運行的結果保存在TextTestResult中,整個過程集成在unittest.main模塊中。
二、初級使用
1.步驟
?1)導入unittest模塊,被測文件或者其中的類
?2)創建一個測試類,被繼承unittest.TestCase
?3)重寫setUp和tearDown方法(如果有初始化條件和結束條件)
?4)定義測試函數,函數名以test_開頭
?5)在函數體中使用斷言來判斷測試結果是否符合預期結果
?6)調用unittset.main()方法運行測試用例--------無此方法也是可以運行
2.使用setUp和tearDown方法,每次執行測試用例都會執行初始化化條件和結束條件
由代碼看到,每次執行用例前都會執行初始化條件和結束條件,兩個測試用例,共執行了兩次初始化條件和結束條件。
3.設置setupClass和teardownClass:執行所有測試用例,僅執行一次初始化條件和結束條件
4.斷言Assert----結果對比的函數
Method | Checks that |
---|---|
assertEqual(a,b):相等 | a==b |
assertNotEqual(a,b) | a!=b |
assertTrue(x) | bool(x) is True |
assertFalse(x) | bool(x) is False |
assertIs(a,b) | a is b 判斷是否是同一現象 |
assertIsNot(a,b) | a is not b |
assertIsNone(x) | x is None |
assertIsNotNone(x) | x is not None |
assertIn(a,b):a是否在b中 | a in b |
assertNotIn(a,b) | a not in b |
assertIsInstance(a,b):實例對象 | isInstance(a,b) |
assertNotIsInstance(a,b) | not isInstance(a,b) |
設置斷言,當某條測試用例執行失敗,不會影響其他測試用例的執行
也可以直接用 ==,!=,<=,>=來判斷
寫一個方法,通過unittest來執行
三、進階使用
1.TestSuite:
?addTest():添加單個測試用例
?addTests([,,]):添加多個測試用例
2.addTest的參數:是一個測試用例的列表
?1. 方式一:類名(‘方法名’)的集合
?2.方式二:unittest.TestLoader.discover方法匹配目錄下的用例-----用的最多的,測試用例在一個目錄下
?discover方法中默認匹配模式是從當前目錄下找以test開頭的py文件。測試用例的順序執行是根據字母a-z,0-9的順序執行的。
?3.方式三:unittest.TestLoader.loadTestsFromModule匹配模塊中的測試用例
?PS:TestLoader類、TestSuite類、TestRunner類需要先實例化再使用
如下是一個單元測試的實例
#實例:采用unittest.TestLoader.discover方式加載測試用例。
######定義函數:Myclass_test.py
class Myclass_Test():
def __init__(self,a,b):
self.a = a
self.b = b
def sum(self):
sum = self.a + self.b
return sum
def sub(self):
sub = self.a - self.b
return sub
######定義測試類1:test_Myclass1.py
import unittest
from my_Unittest import Myclass_test
class Test_myclass(unittest.TestCase):
def setUp(self):
self.myclass = Myclass_test.Myclass_Test(11,10)
def test_sum(self):
sum = self.myclass.sum()
print('class1sum = '+str(sum))
self.assertEqual(21,sum)
def test_sub(self):
sub = self.myclass.sub()
print('class1sub = '+str(sub))
self.assertNotEqual(10,sub)
######定義測試類2:test_Myclass2.py
import unittest
from my_Unittest import Myclass_test
class Test_myclass(unittest.TestCase):
def setUp(self):
self.myclass = Myclass_test.Myclass_Test(1,10)
def test_sum(self):
sum = self.myclass.sum()
print('class2sum = '+str(sum))
self.assertEqual(11,sum)
def test_sub(self):
sub = self.myclass.sub()
print('class2sub = '+str(sub))
self.assertNotEqual(10,sub)
######主函數的調用:Myclass_main.py
import unittest
import os
#實例化測試套件對象
s = unittest.TestSuite()
#實例化TestLoader的對象
loader = unittest.TestLoader()
#使用discover()去找一個目錄下的所有測試用例的文件,并將返回數據添加到測試套件中。
s.addTests(loader.discover(os.getcwd()))
run = unittest.TextTestRunner()
run.run(s)
3.測試報告的生成
第一種:text文件----寫到txt文件中
#第一種:unittest自帶的方法
#創建一個文件,以寫的方式打開
import unittest
import os
#實例化測試套件對象
s = unittest.TestSuite()
#實例化TestLoader的對象
loader = unittest.TestLoader()
#使用discover()去找一個目錄下的所有測試用例的文件,并將返回數據添加到測試套件中。
s.addTests(loader.discover(os.getcwd()))
fs = open('test_run_report.txt','w')
run = unittest.TextTestRunner(fs)
run.run(s)
第二種:html測試報告
需下載HTMLTestRunner.py文件,http://tungwaiyip.info/software/HTMLTestRunner.html
下載后放到Python安裝目錄的Lib目錄下即可。同時需修改文件中部分內容,附上鏈接:https://www.cnblogs.com/hellomaster/p/11040277.html
HTMLTestRunner參數詳解:
verbosity
=1的時候 默認值為1,不限制完整結果,即單個用例成功輸出’.’,失敗輸出’F’,錯誤輸出’E’
=0的時候。不輸出信息
=2的時候,需要打印詳細的返回信息
--stream:測試報告寫入文件的存儲區域
--title:測試報告的主題
--description:測試報告的描述
import os
from HTMLTestRunner import *
# 實例化測試套件對象
s = unittest.TestSuite()
# 實例化TestLoader的對象
loader = unittest.TestLoader()
# 使用discover()去找一個目錄下的所有測試用例的文件,并將返回數據添加到測試套件中。
s.addTests(loader.discover(os.getcwd()))
with open(os.getcwd() +"/test_report.html","wb") as fp:
runner = HTMLTestRunner(
stream=fp,
verbosity=1,
title="測試報告標題",
description="測試報告描述信息",
)
runner.run(s)
HTMLTestRunner踩坑記錄:
1、導入的時候,盡量寫成from HTMLTestRunner import *,如果是import HTMLTestRunner,那么下面調用的時候,要寫成HTMLTestRunner.HTMLTestRunner
https://www.cnblogs.com/hellomaster/p/11040277.html
2、使用with open寫入文件的時候,runner.run要放在with open里面
https://www.cnblogs.com/chuiyuedefeng/p/11902018.html
3、因為寫入的是二進制文件,所以寫入方式要用wb,使用w會報錯
https://blog.csdn.net/kingyuan666/article/details/81214954