unittest學習

一、什么是單元測試&單元測試的對象

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:測試用例環境的搭建和銷毀

image.png

綜上,整個流程就是首先要寫好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方法,每次執行測試用例都會執行初始化化條件和結束條件

image.png

由代碼看到,每次執行用例前都會執行初始化條件和結束條件,兩個測試用例,共執行了兩次初始化條件和結束條件。

3.設置setupClass和teardownClass:執行所有測試用例,僅執行一次初始化條件和結束條件

image.png

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)

設置斷言,當某條測試用例執行失敗,不會影響其他測試用例的執行


image.png
image.png

也可以直接用 ==,!=,<=,>=來判斷


image.png

寫一個方法,通過unittest來執行


image.png

image.png

三、進階使用

1.TestSuite:

?addTest():添加單個測試用例
?addTests([,,]):添加多個測試用例


image.png

2.addTest的參數:是一個測試用例的列表

?1. 方式一:類名(‘方法名’)的集合
?2.方式二:unittest.TestLoader.discover方法匹配目錄下的用例-----用的最多的,測試用例在一個目錄下
?discover方法中默認匹配模式是從當前目錄下找以test開頭的py文件。測試用例的順序執行是根據字母a-z,0-9的順序執行的。
?3.方式三:unittest.TestLoader.loadTestsFromModule匹配模塊中的測試用例
?PS:TestLoader類、TestSuite類、TestRunner類需要先實例化再使用

如下是一個單元測試的實例


image.png
#實例:采用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

image.png

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

image.png

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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容