Unittest組織用例的姿式

本文咱們將會講解Python Unittest 裏組織用例的5種姿式。


環境準備:
python 3.0以上
python requests庫


小編的環境:
python 3.6.4

python

1、TestLoader

  • 當 import unittest 時 ,會自動導入TestLoader類
  • TestLoader這個類下,封裝了 5 種組織用例的方法

loader.py

class TestLoader(object):
    """
    該類負責根據各類標準加載測試並將它們包裝在TestSuite中
    """
    
    def loadTestsFromTestCase(self, testCaseClass):
    """
    返回testCaseClass中包含的全部測試用例的套件
    """
    
    def loadTestsFromModule(self, module, *args, pattern=None, **kws):
    """
    返回給定模塊中包含的全部測試用例的套件
    """
    
    def loadTestsFromName(self, name, module=None):
    """
    返回給定用例名的測試用例的套件
    
    """
    
    def loadTestsFromNames(self, names, module=None):
    """
    返回給定的一組用例名的測試用例的套件
    """
    
    def discover(self, start_dir, pattern='test*.py', top_level_dir=None):
    """
    查找並返回指定的起始目錄中的全部測試模塊,遞歸到子目錄中以查找它們並返回在其
    中找到的全部測試。僅加載與模式匹配的測試文件。
    必須能夠從項目的頂層導入測試模塊。若是起始目錄不是頂級目錄,則必須單獨指定頂級目錄。
    """
    
defaultTestLoader = TestLoader()
"""
當執行     import unittest 時
會自動導入 defaultTestLoader
defaultTestLoader是TestLoader()的實例對象
"""


2、unittest組織用例方法演示

項目目錄

how_to_run_test_case
    test_case
        __init__.py
        test_add.py
        test_sub.py
    run_from_test_case_class.py
    run_from_test_case_moudle.py
    run_from_case_name.py
    run_from_case_names.py
    run_from_discover.py

test_add.py

# encoding:utf8

import unittest

class AddCase(unittest.TestCase):

    def add_fun(self, a, b):
        
        return a + b
    def test_add_1(self):
    '''加法冒煙測試'''
        ret = self.add_fun(1, 2)
        self.assertEqual(3, ret)
    
    def test_add_2(self):
        ret = self.add_fun(1, 2)
        self.assertEqual(6, ret)

test_sub.py

# encoding:utf8

import unittest

class SubCase(unittest.TestCase):

    def add_fun(self, a, b):
        return a - b
    
    def test_sub_1(self):
    '''減法冒煙測試'''
        ret = self.add_fun(1, 2)
        self.assertEqual(-1, ret)
    
    def test_sub_2(self):
        ret = self.add_fun(1, 2)
        self.assertEqual(6, ret)


一、加載測試類中的用例

loadTestsFromTestCase(self, testCaseClass)
  • 使用loadTestsFromTestCase這個方法,需傳入unittest測試類的類名
  • 以項目爲例子,傳入 testCaseClass :AddCase

例子:git

run_from_test_case_class.py

# encoding:utf8

import unittest
from test_case.test_add import AddCase

cases = unittest.TestLoader().loadTestsFromTestCase(AddCase)
runner = unittest.TextTestRunner(verbosity=2)
runner.run(cases)

1.1 運行 run_from_test_case_class.pygithub

python run_from_test_case_class.py

1.2 運行結果數組

test_add_1 (test_case.test_add.AddCase)
加法冒煙測試 ... ok
test_add_2 (test_case.test_add.AddCase) ... FAIL


二、加載模塊中的測試用例

loadTestsFromModule(self, module, *args, pattern=None, **kws)
  • 使用loadTestsFromModule這個方法,需傳入被測試模塊
  • 以項目爲例子,傳入參數 module :test_add

例子:測試

run_from_test_case_moudle.py

# encoding:utf8

import unittest
from test_case import test_add

cases = unittest.TestLoader().loadTestsFromModule(test_add)
runner = unittest.TextTestRunner(verbosity=2)
runner.run(cases)

2.1 運行 run_from_test_case_moudle.pyui

python run_from_test_case_moudle.py

2.2 運行結果spa

test_add_1 (test_case.test_add.AddCase)
加法冒煙測試 ... ok
test_add_2 (test_case.test_add.AddCase) ... FAIL


三、加載指定的單個測試用例

loadTestsFromName(self, name, module=None)
  • 使用loadTestsFromName這個方法,需傳入測試用例的方法名
  • 傳入測試用例的方法名格式:moudleName.testCaseClassName.testCaseName
  • 以項目爲例子,我想測試test_add.py 裏面的用例 test_add_1
  • 我須要傳入的參數 name:test_add.AddCase.test_add_1
  • loadTestsFromName這個方法是在 sys.path 裏面的路徑去尋找測試模塊test_add.py,而後再尋找測試類AddCase
    最後再尋找測試用例test_add_1

例子:code

run_from_case_name.py

# encoding:utf8

import unittest
import os
import sys

# 獲取 "how_to_run_test_case" 的絕對路徑
dir_run_test_case = os.path.dirname(os.path.abspath(__file__))
# 獲取 "test_case" 的絕對路徑
dir_test_case = dir_run_test_case + '/test_case'
# 把 "test_case" 的絕對路徑 加入 sys.path
sys.path.insert(0,dir_test_case)

case= unittest.TestLoader().loadTestsFromName('test_add.AddCase.test_add_1')
runner = unittest.TextTestRunner(verbosity=2)
runner.run(cases)

3.1 運行 run_from_case_name.py對象

python run_from_case_name.py

3.2 運行結果遞歸

test_add_1 (test_add.AddCase)
加法冒煙測試 ... ok


四、加載指定的多個測試用例

loadTestsFromNames(self, names, module=None)
  • 使用loadTestsFromNames這個方法,須要傳入一個數組
  • 數組裏面裏面的元素必須是字符串
  • 數組元素能夠是模塊、類、方法
  • 數組元素 - 傳入格式1:moudleName
  • 數組元素 - 傳入格式2:moudleName.testCaseClassName
  • 數組元素 - 傳入格式3:moudleName.testCaseClassName.testCaseName
  • 以項目爲例,我想測試test_add.py 裏面的用例 test_add_1 ,以及test_sub.py 裏面的用例 test_sub_1
  • 我須要傳入的參數 names:['test_sub.SubCase.test_sub_2','test_add.AddCase.test_add_1']
  • loadTestsFromNames這個方法是在 sys.path 裏面的路徑去尋找匹配的測試用例
  • 執行用例是根據數組元素的的順序執行

例子:

run_from_case_names.py

# encoding:utf8

import unittest
import sys
import os

# 獲取 "how_to_run_test_case" 的絕對路徑
dir_run_test_case = os.path.dirname(os.path.abspath(__file__))
# 獲取 "test_case" 的絕對路徑
dir_test_case = dir_run_test_case + '/test_case'
# 把 "test_case" 的絕對路徑 加入 sys.path
sys.path.insert(0,dir_test_case)

cases = ['test_sub.SubCase.test_sub_1','test_add.AddCase.test_add_1']
suite = unittest.TestLoader().loadTestsFromNames(cases)
runner = unittest.TextTestRunner(verbosity=2)
runner.run(suite)

4.1 運行 run_from_case_names.py

python run_from_case_names.py

4.2 運行結果

test_sub_1 (test_sub.SubCase)
減法冒煙測試 ... ok
test_add_1 (test_add.AddCase)
加法冒煙測試 ... ok


五、加載指定目錄下全部的測試用例

discover(self, start_dir, pattern='test*.py', top_level_dir=None)
  • start_dir : 查找用例的起始目錄
  • pattern='test*py' : 查找模塊名爲test開頭的python文件
  • top_level_dir=None :測試模塊頂級目錄

例子:

run_from_discover.py

# encoding:utf8

import unittest
import os

dir_how_to_run_test_case = os.path.dirname(os.path.abspath(__file__))
dir_test_case = dir_how_to_run_test_case + '/test_case'

cases = unittest.defaultTestLoader.discover(dir_test_case)
runner = unittest.TextTestRunner(verbosity=2)
runner.run(cases)

5.1 運行 run_from_discover.py

python run_from_discover.py

5.2 運行結果

test_add_1 (test_add.AddCase)
加法冒煙測試 ... ok
test_add_2 (test_add.AddCase) ... FAIL
test_sub_1 (test_sub.SubCase)
減法冒煙測試 ... ok
test_sub_2 (test_sub.SubCase) ... FAIL


六、 Github 源碼地址: https://github.com/SEtester/how_to_run_test_case

相關文章
相關標籤/搜索