📜  UnitTest框架-Unittest2(1)

📅  最后修改于: 2023-12-03 14:48:11.136000             🧑  作者: Mango

UnitTest框架-Unittest2

简介

Unittest2是Python中的一个第三方测试框架,是unittest库的扩展版。它提供了一种简单、方便、快速的测试方法,使得开发者可以更加容易地编写和运行测试用例,以确保程序的质量和稳定性。

Unittest2具有以下特点:

  • 可以嵌套测试用例并使用setup和teardown方法,使得程序员可以更加灵活的控制测试用例的执行顺序。
  • 支持多种测试样式,如测试脚本、测试类、测试方法等。
  • 支持test discovery机制,可以自动发现测试用例并执行。
  • 提供了丰富的断言方法,可以方便地验证函数或方法的返回值、异常情况等。
  • 可以使用Mock框架模拟函数或方法的行为,以便测试依赖关系较强的代码块。
安装

在Python2或Python3的环境下,可以通过pip或easy_install命令进行安装:

pip install unittest2

或者:

easy_install unittest2
测试样式

Unittest2支持三种测试样式:

  • 测试脚本
  • 测试类
  • 测试方法
测试脚本

测试脚本是最简单的测试样式,可以直接在脚本中编写测试用例。首先,需要导入unittest2库,然后定义测试用例类,并在其中编写测试方法,例如:

import unittest2

class TestMyFunc(unittest2.TestCase):
    def test_add(self):
        self.assertEqual(1+2, 3)
        
    def test_subtract(self):
        self.assertEqual(4-2, 2)
        
if __name__ == '__main__':
    unittest2.main()

在该脚本中,定义了一个名为TestMyFunc的测试类,并在其中定义了两个测试方法test_add和test_subtract。然后,在main方法中调用unittest2.main函数来执行测试用例。

测试类

测试类是一种更加组织化的测试样式,可以将相关的测试方法归为一类。例如:

import unittest2

class TestMyMath(unittest2.TestCase):
    def setUp(self):
        self.numbers = list(range(1,6))
        
    def test_sum(self):
        self.assertEqual(sum(self.numbers), 15)
        
    def test_max(self):
        self.assertEqual(max(self.numbers), 5)
        
    def tearDown(self):
        del self.numbers
        
if __name__ == '__main__':
    unittest2.main()

在该脚本中,定义了一个名为TestMyMath的测试类,并在其中定义了三个方法:setUp、test_sum和test_max。其中setUp方法在执行测试类中每个测试方法之前被调用,tearDown方法在执行测试方法之后被调用。

测试方法

测试方法是最基本的测试样式,通过unittest2.TestCase的实例中的方法调用而执行。例如:

import unittest2

class TestMyStringMethods(unittest2.TestCase):
    def test_upper(self):
        self.assertEqual('foo'.upper(), 'FOO')
        
    def test_isupper(self):
        self.assertTrue('FOO'.isupper())
        self.assertFalse('Foo'.isupper())
        
if __name__ == '__main__':
    unittest2.main()

在该脚本中,定义了一个名为TestMyStringMethods的测试类,其中包含了两个测试方法test_upper和test_isupper。

断言方法

Unittest2提供了许多内置断言方法,以便开发人员可以方便地验证函数或方法的返回值、异常情况等。

以下是一些常用的断言方法:

  • assertEqual(first, second, msg=None):验证first和second是否相等。
  • assertNotEqual(first, second, msg=None):验证first和second是否不相等。
  • assertTrue(expr, msg=None):验证expr是否为True。
  • assertFalse(expr, msg=None):验证expr是否为False。
  • assertIs(expr1, expr2, msg=None):验证expr1和expr2是否是同一对象。
  • assertIsNot(expr1, expr2, msg=None):验证expr1和expr2是否不是同一对象。
  • assertIsNone(expr, msg=None):验证expr是否为None。
  • assertIsNotNone(expr, msg=None):验证expr是否不为None。
  • assertIn(expr1, expr2, msg=None):验证expr1是否在expr2中。
  • assertNotIn(expr1, expr2, msg=None):验证expr1是否不在expr2中。
  • assertRaises(excClass, callableObj, *args, **kwargs):验证callableObj是否会引发excClass异常。
  • assertRaisesRegexp(excClass, regexp, callableObj, *args, **kwargs):验证callableObj引发的异常是否匹配regexp。

除此之外,还有许多其他的断言方法,可以根据需要使用。

Mock框架

Unittest2还提供了Mock框架,可以用来模拟函数或方法的行为。例如:

import unittest2
from unittest2.mock import Mock

def is_tuesday():
    import datetime
    today = datetime.datetime.today()
    return today.weekday() == 1

class TestIsTuesday(unittest2.TestCase):
    def test_is_tuesday_on_tuesday(self):
        datetime = Mock()
        datetime.datetime.today.return_value.weekday.return_value = 1
        self.assertTrue(is_tuesday())
        
    def test_is_not_tuesday_on_wednesday(self):
        datetime = Mock()
        datetime.datetime.today.return_value.weekday.return_value = 2
        self.assertFalse(is_tuesday())
        
if __name__ == '__main__':
    unittest2.main()

在该脚本中,定义了一个名为is_tuesday的函数,并在TestIsTuesday测试类中,通过Mock框架模拟了datetime模块中的datetime类的行为,以便测试is_tuesday函数在不同的日期是否正常工作。

测试用例发现

Unittest2还支持test discovery机制,在不需要编写测试用例的情况下,可以动态地发现测试用例并执行。只需要在测试用例所在的目录中执行以下命令:

python -m unittest2 discover

该命令会自动发现并执行所有的测试用例。如果需要执行指定目录或模块的测试用例,可以使用以下命令:

python -m unittest2 discover -s path/to/directory -p *test.py

该命令会在path/to/directory目录下查找以test.py结尾的文件,并执行其中的测试用例。

总结

Unittest2是Python中一个强大、灵活、丰富的测试框架,提供了多种测试样式、丰富的断言方法和Mock框架,可以帮助开发人员更容易地编写和执行测试用例,确保程序的质量和稳定性。