Unittest组织用例的姿势

admin 2018-12-04 阅读


本文我们将会讲解Python Unittest 里组织用例的5种姿势。


环境准备:
python 3.0以上
python requests库


小编的环境:
python 3.6.4

一、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()的实例对象
"""


二、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)


1、加载测试类中的用例

loadTestsFromTestCase(self, testCaseClass)
  • 使用loadTestsFromTestCase这个方法,需传入unittest测试类的类名
  • 以项目为例子,传入 testCaseClass :AddCase

例子:

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.py

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


2、加载模块中的测试用例

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.py

python run_from_test_case_moudle.py

2.2 运行结果

test_add_1 (test_case.test_add.AddCase)
加法冒烟测试 ... ok
test_add_2 (test_case.test_add.AddCase) ... FAIL


3、加载指定的单个测试用例

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

例子:

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


4、加载指定的多个测试用例

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


5、加载指定目录下所有的测试用例

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


6、 Github 源码地址: https://github.com/SEtester/how_to_run_test_case






声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。