📅  最后修改于: 2023-12-03 15:08:05.147000             🧑  作者: Mango
unittest 是 Python 自带的测试框架,可以方便地对代码进行测试。本文将介绍在终端中运行 unittest 的方法,并提供一些使用技巧。
假设我们有一个名为 demo.py
的 Python 文件,其中有一个 add
函数:
def add(a, b):
return a + b
我们想要测试这个函数,可以在同一目录下创建一个名为 test_demo.py
的文件,其中定义一个测试类,如下所示:
import unittest
import demo
class TestDemo(unittest.TestCase):
def test_add(self):
result = demo.add(1, 2)
self.assertEqual(result, 3)
在终端中进入该目录,并运行命令 python -m unittest test_demo.py
,即可运行测试:
$ python -m unittest test_demo.py
.
----------------------------------------------------------------------
Ran 1 test in 0.000s
OK
其中,“.” 表示测试通过。如果出现错误,将会有相应的错误提示。例如,在 test_add
函数中将 self.assertEqual(result, 3)
改为 self.assertEqual(result, 0)
,则运行结果如下:
$ python -m unittest test_demo.py
F
======================================================================
FAIL: test_add (__main__.TestDemo)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/path/to/test_demo.py", line 6, in test_add
self.assertEqual(result, 0)
AssertionError: 3 != 0
----------------------------------------------------------------------
Ran 1 test in 0.000s
FAILED (failures=1)
其中,“F” 表示测试失败,“FAILED (failures=1)” 表示有一个测试失败。
我们可以将多个测试类或测试函数组成一个测试套件,统一运行。例如,修改上面的测试文件如下:
import unittest
import demo
class TestAdd(unittest.TestCase):
def test_add(self):
result = demo.add(1, 2)
self.assertEqual(result, 3)
class TestSub(unittest.TestCase):
def test_sub(self):
result = demo.sub(3, 2)
self.assertEqual(result, 1)
这里又添加了一个 sub
函数,并定义了一个新的测试类 TestSub
。我们可以在 test_demo.py
中创建一个测试套件,如下所示:
import unittest
from test_add import TestAdd
from test_sub import TestSub
suite = unittest.TestSuite()
suite.addTest(unittest.makeSuite(TestAdd))
suite.addTest(unittest.makeSuite(TestSub))
运行命令 python -m unittest test_demo.py
即可运行测试:
$ python -m unittest test_demo.py
..
----------------------------------------------------------------------
Ran 2 tests in 0.000s
OK
有时,我们会遇到某些测试无法通过,但又不希望影响其他测试的运行。这时,可以使用 @unittest.skip
装饰器跳过这些测试。例如,修改测试文件如下:
import unittest
import demo
class TestAdd(unittest.TestCase):
def test_add(self):
result = demo.add(1, 2)
self.assertEqual(result, 3)
@unittest.skip("demonstrating skipping")
def test_add_error(self):
result = demo.add("hello", "world")
self.assertEqual(result, "helloworld")
class TestSub(unittest.TestCase):
def test_sub(self):
result = demo.sub(3, 2)
self.assertEqual(result, 1)
使用装饰器 @unittest.skip("demonstrating skipping")
可以跳过 test_add_error
函数。运行命令 python -m unittest test_demo.py
:
$ python -m unittest test_demo.py
..
----------------------------------------------------------------------
Ran 2 tests in 0.000s
OK (skipped=1)
其中,“(skipped=1)” 表示跳过了一个测试。
有时我们需要对同一个函数使用不同的参数进行测试,可以使用 @unittest.parameterized.parameterized
装饰器实现参数化测试。例如,修改测试文件如下:
import unittest
import demo
import parameterized
class TestAdd(unittest.TestCase):
@parameterized.parameterized.expand([
[1, 2, 3],
[2, 3, 5],
[0, 0, 0],
[-1, 1, 0],
])
def test_add(self, a, b, expected):
self.assertEqual(demo.add(a, b), expected)
使用 @parameterized.parameterized.expand
装饰器,可以将多组参数传入测试函数 test_add
。运行命令 python -m unittest test_demo.py
:
$ python -m unittest test_demo.py
....
----------------------------------------------------------------------
Ran 4 tests in 0.000s
OK
在测试用例中,我们经常会使用 assert
方法进行断言。assert
方法有多种形式,具体可以参考 Python 官方文档。以下是一些常用的断言方法:
以上介绍了在终端中运行 unittest 的方法,以及一些高级使用的技巧。测试是代码质量的关键保障,熟练掌握 unittest 对于开发者而言是非常重要的。