天天看點

UnitTest 架構學習

目錄

  • 介紹
  • 入門案例
  • 通過TestSuite 執行指定測試案例
  • 通過TestSuite 執行指定測試類的全部test開頭的方法
  • TestLoader 的使用
  • 參數化 - DDT
  • 參數化 - parameterized
  • skip
  • HTMLTestReport插件生成報告

python 自帶的測試架構,使用時不需要進行導包

組成:

  • TestFixture

    測試之前或之後需要做的一些操作,常用的有setUp,tearDown,setUpClass,tearDownClass,setUpModel,tearDownModer

    Fixture 注意事項:

    1. 使用Fixture結構代碼(定義了前後置方法)時,務必保證至少有一個測試方法
    2. 根據需求隻調用部分 Fixture 方法是允許的, 不一定非得成對實作
  • TestCase
    Unittest 中執行測試的最小單元,測試用例的方法必須以test開頭,并且執行順序依照的是方法名的ASCII值排序
  • TestSuite
    測試套件就是一組測試用例,作用是将多個測試用例放在一起,執行一個測試套件就可以将這些測試用例全部執行
  • TestRunner
    測試運作器用來執行測試用例,并傳回測試用例的執行結果
  • TestLoader
    加載TestCase 到TestSuit中

import unittest

"""
目标:
執行目前測試類的全部test開頭的方法
1.測試類必須繼承unittest.TestCase
2.測試方法必須以test開頭
3.測試類的名字建議以Test開頭或者TestCase結尾
4.子產品名預設以test開頭
"""


class TestDemo(unittest.TestCase):

    def setUp(self) -> None:
        print("setUp")

    def tearDown(self) -> None:
        print("tearDown")

    def test_method01(self):
        self.assertEqual("張飛", "張飛")


if __name__ == '__main__':
    unittest.main()

           

"""
目标:通過TestSuite 運作指定的測試案例
"""

import unittest


from test01 import TestDemo
from test02 import TestDemo2
# 1.獲得TestSuite對象
suite = unittest.TestSuite()

# 2.添加測試方法
# 注意格式:suite.addTest(類名("方法名"))
suite.addTest(TestDemo("test_method01"))
suite.addTest(TestDemo2("test_method01"))

# 3.執行測試用例
# 3.1 獲得TextTestRunner對象
runner = unittest.TextTestRunner()
# 3.2執行run方法
runner.run(suite)



           

"""
目标:通過TestSuite
    運作指定測試類下的全部test開頭的方法
"""

# 1.導包
import unittest
from test02 import TestDemo2
# 2.獲得TestSuite對象
suite = unittest.TestSuite()

# 3.調用addTest方法指定測試類
"""
unittest.makeSuite(testCaseClass, prefix='test')
如果不指定字首, 預設是test開頭的方法
"""
suite.addTest(unittest.makeSuite(TestDemo2, prefix="method"))
# 4.執行個體化TextTestRunner
runner = unittest.TextTestRunner()
runner.run(suite)

           

"""
目标:
    掌握TestLoader的使用方法,通過TestLoader()運作
    指定路徑下,以某種字首開頭的.py檔案中的test開頭的方法
"""
# 1.導包
import unittest

# 2.通過TestLoader獲得TestSuite對象

"""
unittest.TestLoader() 也可以使用unittest.defaultTestLoader代
注意:
def discover(self, start_dir, pattern='test*.py')
start_dir: 搜尋的路徑
pattern: 指定測試檔案的字首
"""
suite = unittest.TestLoader().discover(".")
# 3.執行個體化TextTestRunner對象
runner = unittest.TextTestRunner()
# 4.執行run方法
runner.run(suite)

           

"""
目标:掌握unittest + ddt 實作參數化
DDT: Data Driven Tests,即資料驅動測試,為第三方插件第一次使用需要在安裝
"""
import unittest
import ddt


def my_sum(a, b):
    return a + b


@ddt.ddt
class TestSum(unittest.TestCase):

    """
    注意:
    1.測試類需要被@ddt.ddt 修飾
    2.ddt.data(): 可以傳遞清單和元組,一個清單或元組是一個測試用例
    3.ddt.unpack: 對測試資料進行解包
    """
    @ddt.data((1, 2, 3), (3, 4, 7))
    @ddt.unpack
    def test_my_sum(self, a, b, expect):
        result = my_sum(a, b)
        self.assertEqual(result, expect)

           

"""
目标:
掌握unittest 參數化第三方插件parameterized的基本使用,第一次使用需要安裝插件
"""
import unittest

from parameterized import parameterized


def my_sum(a, b):
    return a + b


class SumTestCase(unittest.TestCase):
    """
    注意:
    1.parameterized.expand(),需要傳遞清單
    2.清單中包含元組,一個元組就是一個測試用例
    """

    @parameterized.expand([(1, 2, 3), (1, 5, 6)])
    def test_my_sum(self, a, b, expect):
        result = my_sum(a, b)
        self.assertEqual(result, expect)

           

"""
@unittest.skip()
@unittest.skipif(condition, reason)
注意:
這兩個修飾符可以修飾類和方法
當修飾類時,将忽略類的所有測試方法
"""
import unittest

version = 25


#@unittest.skip
@unittest.skipIf(version > 20, "跳過此案例")
class TestDemo2(unittest.TestCase):

    # @unittest.skip
    def test_method01(self):
        self.assertEqual("關羽", "關羽")

    # @unittest.skipIf(version > 20, "跳過此案例")
    def test_method02(self):
        self.assertEqual("曹操", "曹操")

           

"""
目标: 掌握HTMLTestReport 的基本使用

report = HTMLTestReport(file_path, [title], [description])
file_path: 報告生成的路徑
title: 可選參數,測試報告的标題
description: 可選參數,為報告描述資訊
"""

import unittest
from htmltestreport import HTMLTestReport


suite = unittest.TestLoader().discover('../case', pattern='test*.py')
# 生成報告的路徑
report_path = '../report/report.html'
# 生成報告
report = HTMLTestReport(report_path, title='測試報告', description='v1.0')

report.run(suite)

           

報告資訊:

UnitTest 架構學習

本文來自部落格園,作者:abcbca,轉載請注明原文連結:https://www.cnblogs.com/czzz/p/15754942.html