欢迎访问宙启技术站
智能推送

unittest怎么用

发布时间:2023-05-17 12:19:23

unittest 是 Python 自带的用于进行单元测试的模块,可以用来对 Python 编写的函数和类进行测试。unittest 提供了一些方便的接口和工具,可以用来检查函数或方法的输入和输出是否符合预期,是否能正确处理异常等。下面介绍 unittest 的基本用法。

1. 创建测试类

unittest 的测试用例必须继承自 unittest.TestCase 类。在测试类中,每个测试用例都是一个测试方法,方法名必须以 test_ 开头。例如:

import unittest

class TestDemo(unittest.TestCase):
    def test_add(self):
        self.assertEqual(1 + 2, 3)

    def test_sub(self):
        self.assertEqual(3 - 1, 2)

2. 运行测试

可以使用 unittest 的 TextTestRunner 运行测试。默认情况下,它会运行测试类中所有以 test_ 开头的测试方法。例如:

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

可以使用 -v 参数来打印详细的测试结果,例如:

if __name__ == "__main__":
    unittest.main(verbosity=2)

3. 测试断言

unittest 提供了一些断言方法,用于检查测试的结果是否符合预期。下面列举一些常用的断言方法:

- 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

- assertIsNot(a, b) 断言 a is not b

- assertIsNone(x) 断言 x is None

- assertIsNotNone(x) 断言 x is not None

- assertIn(a, b) 断言 a in b

- assertNotIn(a, b) 断言 a not in b

- assertIsInstance(a, b) 断言 isinstance(a, b)

- assertNotIsInstance(a, b) 断言 not isinstance(a, b)

- assertAlmostEqual(a, b) 断言 round(a-b, 7) == 0

- assertNotAlmostEqual(a, b) 断言 round(a-b, 7) != 0

- assertGreater(a, b) 断言 a > b

- assertGreaterEqual(a, b) 断言 a >= b

- assertLess(a, b) 断言 a < b

- assertLessEqual(a, b) 断言 a <= b

例如,在前面的测试类中,使用 assertEqual 方法来断言加法和减法的结果是否符合预期:

class TestDemo(unittest.TestCase):
    def test_add(self):
        self.assertEqual(1 + 2, 3)

    def test_sub(self):
        self.assertEqual(3 - 1, 2)

4. 设置前置条件和清理工作

有时候,测试用例需要在运行测试前进行一些预处理,例如创建一个对象、打开一个文件等。这时可以使用 setUp 方法,在每个测试用例之前执行预处理操作。例如:

class TestDemo(unittest.TestCase):
    def setUp(self):
        self.obj = Demo()

    def test_add(self):
        self.assertEqual(self.obj.add(1, 2), 3)

    def test_sub(self):
        self.assertEqual(self.obj.sub(3, 1), 2)

    def tearDown(self):
        del self.obj

tearDown 方法可以在每个测试用例之后执行清理工作,例如释放资源等。这里删除了创建的对象。

5. 跳过测试用例

有时候,某些测试用例无法或者不需要进行测试,可以使用 @unittest.skip 装饰器来跳过测试用例。例如:

class TestDemo(unittest.TestCase):
    @unittest.skip("demonstrating skipping")
    def test_nothing(self):
        self.fail("shouldn't happen")

    def test_add(self):
        self.assertEqual(1 + 2, 3)

    def test_sub(self):
        self.assertEqual(3 - 1, 2)

6. 跳过整个测试类

有时候,整个测试类无法或者不需要进行测试,可以使用 @unittest.skip 装饰器来跳过。例如:

@unittest.skip("demonstrating skipping of entire class")
class TestDemo(unittest.TestCase):
    def test_nothing(self):
        self.fail("shouldn't happen")

7. 超时设置

有时候,测试用例可能会运行时间过长,需要限制测试用例的运行时间。可以使用 @unittest.timeout 装饰器来设置测试用例的超时时间。例如:

class TestDemo(unittest.TestCase):
    @unittest.timeout(0.1)
    def test_long_time(self):
        time.sleep(0.2)

以上就是 unittest 的基本用法,使用 unittest 可以有效地对 Python 编写的代码进行测试,保证代码的正确性和稳定性。