python的單元測試unittest(一)


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

1.定義:單元測試是用來對一個模塊、一個函數或者一個類來進行正確性檢驗的測試工作。

2.單元測試中最核心的四個概念:test case(測試用例),test suite(測試套件),test runner(測試運行器),test fixture(測試環境數據准備和數據清理或者測試腳手架)

  1)test case:一個testcase的實例就是一個測試用例。測試前准備環境的搭建(setUp),執行測試代碼(run),以及測試后環境的還原(tearDown

  2)TestSuite:多個測試用例集合在一起。

  3)TestLoader:用來加載TestcaseTestSuite中。

  4)TextTestRunner:用來執行測試用例,其中run(test)會執行TestSuite/TestCase中的run(result)方法。

  5)test fixture:測試用例環境的搭建和銷毀

 下圖為unittest的靜態類圖:

         

      綜上,整個流程就是首先要寫好TestCase,然后由TestLoader加載TestCase到TestSuite,然后由TextTestRunner來運行TestSuite,運行的結果保存在TextTestResult中,整個過程集成在unittest.main模塊中。

 

二、unittest的初級使用

1.步驟

    1)導入unittest模塊,被測文件或者其中的類

    2)創建一個測試類,被繼承unittest.TestCase

    3)重寫setUptearDown方法(如果有初始化條件和結束條件)

    4)定義測試函數,函數名以test_開頭。測試用例

    5)在函數體中使用斷言來判斷測試結果是否符合預期結果

    6)調用unittset.main()方法運行測試用例--------無此方法也是可以運行

2.設置setup和teardown:每次用例執行前都會執行初始化條件和結束條件(如下代碼可以看到,兩個測試用例執行了兩次)

import unittest

class Test_Math(unittest.TestCase):

    #每執行一個用例,都會執行setup()和teardown()方法
    #如果跑所有用例,只運行一次前提條件和結束條件。則用setupclass()和teardownclass()
    def setUp(self):
        print("測試用例執行前的初始化操作========")

    def tearDown(self):
        print("測試用例執行完之后的收尾操作=====")


    def test_addTwoNum_01(self):
        print(5+7)

    def test_subTwoNum_02(self):
        print(3-2)
結果:
測試用例執行前的初始化操作========
12
測試用例執行完之后的收尾操作=====
測試用例執行前的初始化操作========
1
測試用例執行完之后的收尾操作=====

 

3.設置setupClass和teardownClass:執行所有測試用例,僅執行一次初始化條件和結束條件(如下代碼可以看到,兩個測試用例只執行了一次)

import unittest

class Test_Math(unittest.TestCase):

    #如果跑所有用例,只運行一次前提條件和結束條件。則用setupclass()和teardownclass()
    @classmethod
    def setUpClass(cls):
        print("在所有的測試用例執行之前,只執行一次============")

    @classmethod
    def tearDownClass(cls):
        print("在所有的測試用例執行之后,只執行一次============")

    def test_addTwoNum_01(self):
        print(5+7)

    def test_subTwoNum_02(self):
        print(3-2)

#python3中寫不寫都會執行的
if __name__ == '__main__':
    unittest.main()

結果: Testing started at
22:19 ... 在所有的測試用例執行之前,只執行一次============ 12 1 在所有的測試用例執行之后,只執行一次============

4.斷言Assert----結果對比的函數

Method

Checks that

New In

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:判斷是否是同一對象(id(a))

3.1

asserNottIs(a,b)

a is not b

3.1

assertIsNone(x)

x is None

3.1

assertIsNotNone(x)

x is not None

3.1

assertIn(a,b):a是否在b

a in b

3.1

assertNotIn(a,b)

a not in b

3.1

assertIsInstance(a,b):實例對象

isInstance(a,b)

3.2

assertNotIsInstance(a,b)

not isInstance(a,b)

3.2

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

import unittest

class Test_Math(unittest.TestCase):

    def setUp(self):
        print("測試用例執行前的初始化操作========")

    def tearDown(self):
        print("測試用例執行完之后的收尾操作=====")

   #正確的斷言
    def test_addTwoNum_01(self):
        sum = 5+7
        print(sum)
        self.assertEqual(12,sum)
   
    #設置錯誤的斷言
    def test_subTwoNum_02(self):
        sub = 3-2
        self.assertEqual(11,sub)


if __name__ == '__main__':
    unittest.main()
#結果---直接打印出來失敗的原因

Testing started at 10:14 ...
測試用例執行前的初始化操作========
12
測試用例執行完之后的收尾操作=====
測試用例執行前的初始化操作========
測試用例執行完之后的收尾操作=====

Failure
Traceback (most recent call last):
  File "E:\檸檬班\python\python_API\unittest_lianxi.py", line 22, in test_subTwoNum_02
    self.assertEqual(11,sub)
AssertionError: 11 != 1

     另外,斷言也可以直接寫>= = <= 來判斷

def test_addTwoNum_01(self):
        sum = 5+7
        print(sum)
        assert sum >= 10

     寫了一個方法,通過unnittest去執行

#方法文件: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
 #單元測試文件:test_Myclass.py import unittest
from Myclass_test import Myclass_test

class Test_Myclass(unittest.TestCase):

    def setUp(self):
        self.myclass = Myclass_test(12,12)

    def test_sum(self):
        sum = self.myclass.sum()
        self.assertEqual(24,sum)

    def test_sub(self):
        sub = self.myclass.sub()
        self.assertEqual(0,sub)

 

三、unittest的進階使用

1、testsuite

      addTest():添加一個測試用例

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

#實例化套件對象
s = unittest.TestSuite() #調用addTest來加載測試用例:類名(‘方法名’)的集合 s.addTest(Test_Myclass1("test_sub"))
s.addTests([Test_Myclass1("test_sub"),Test_Myclass1("test_sum")]) #實例化TextTestRunner對象 runner
= unittest.TextTestRunner() #調用run()方法 runner.run(s)

 

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

  方式一:類名(‘方法名’)的集合 

  方式二:unittest.TestLoader.discover方法匹配目錄下的用例-----用的最多的,測試用例在一個目錄下

      discover方法中默認匹配模式是從當前目錄下找以test開頭的py文件(test*)。測試用例的順序執行是根據字母a-z,0-9的順序執行的。

  方式三:unittest.TestLoader.loadTestsFromModule匹配模塊中的測試用例

        PSTestLoader類、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.Myclass_test import Myclass_test class Test_Myclass1(unittest.TestCase): def setUp(self): self.myclass = Myclass_test(12,12) def test_sum(self): print("sum_1") sum = self.myclass.sum() self.assertEqual(24,sum) def test_sub(self): print("sub_1") sub = self.myclass.sub() self.assertEqual(0,sub) ######定義測試類2:test_Myclass2.py import unittest from my_Unittest.Myclass_test import Myclass_test class Test_Myclass2(unittest.TestCase): def setUp(self): self.myclass = Myclass_test(1,12) def test_sum(self): print("sum_2") sum = self.myclass.sum() self.assertEqual(13,sum) def test_sub(self): print("sub_2") sub = self.myclass.sub() self.assertEqual(-11,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.定義的測試類和測試套件寫在不同的模塊里,為什么?

 

4.測試報告的生成

 第一種:text文件--寫到文件中

#第一種:unittest自帶的方法
#創建一個文件,以寫的方式打開
import unittest
from test_Myclass1 import Test_Myclass1


s = unittest.TestSuite()
s.addTest(Test_Myclass1("test_sub"))
s.addTests([Test_Myclass1("test_sub"),Test_Myclass1("test_sum")])
fs = open("test_run_report.txt","w")
run = unittest.TextTestRunner(fs)
run.run(s)

 

   第二種:html測試報告--HtmlTestRunner.py文件

                python提供第三方庫:HtmlTestRunner

               官方文檔:http://tungwaiyip.info/software/HTMLTestRunner.html(適用python2)

               然后放到你安裝的python安裝目錄中:Lib\site-packages目錄下即可。示例如下:D:\Python34\Lib\site-packages

import unittest
import os
from HTMLTestRunnerNew import HTMLTestRunner

#實例化測試套件對象
s = unittest.TestSuite()
#實例化TestLoader的對象
loader = unittest.TestLoader()
#使用discover()去找一個目錄下的所有測試用例的文件,並將返回數據添加到測試套件中。
s.addTests(loader.discover(os.getcwd()))
fp = open(os.getcwd() +"/test_report.html","wb")
runner = HTMLTestRunner(stream=fp,
                        title="測試報告標題",
                        description="測試報告描述信息",
                        tester="測試者")
runner.run(s)

 

四、

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM