📜  在终端 python 中运行 unittest (1)

📅  最后修改于: 2023-12-03 15:08:05.147000             🧑  作者: Mango

在终端中运行 unittest

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 方法进行断言。assert 方法有多种形式,具体可以参考 Python 官方文档。以下是一些常用的断言方法:

  • assertEqual():判断两个值是否相等。
  • assertNotEqual():判断两个值是否不相等。
  • assertTrue():判断一个值是否为 True。
  • assertFalse():判断一个值是否为 False。
  • assertIn():判断一个值是否在一个列表、元组、字符串等容器中。
  • assertNotIn():判断一个值是否不在一个容器中。
总结

以上介绍了在终端中运行 unittest 的方法,以及一些高级使用的技巧。测试是代码质量的关键保障,熟练掌握 unittest 对于开发者而言是非常重要的。