unittest怎么用
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 编写的代码进行测试,保证代码的正确性和稳定性。
