Python 测试框架 unittest 初体验

前言

这是我的软件工程课程的第二次上机实验。实验的基本内容是使用一门 OO(Object Oriented) 语言的测试框架。遂记录如下。

简单使用说明

官网示例如下

# 测试三种字符串方法
import unittest

class TestStringMethods(unittest.TestCase):

    def test_upper(self):
        self.assertEqual('foo'.upper(), 'FOO')

    def test_isupper(self):
        self.assertTrue('FOO'.isupper())
        self.assertFalse('Foo'.isupper())

    def test_split(self):
        s = 'hello world'
        self.assertEqual(s.split(), ['hello', 'world'])
        # check that s.split fails when the separator is not a string
        with self.assertRaises(TypeError):
            s.split(2)

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

运行结果

Testing started at 21:11 ...
Launching unittests with arguments python -m unittest C:/Users/17309/PycharmProjects/TDDExperiment/draft01.py in C:\Users\17309\PycharmProjects\TDDExperiment


Process finished with exit code 0


Ran 3 tests in 0.010s

OK

所谓测试,就是定义一个类,只是,这个类必须要继承 unittest.TestCase 这个父类。

另外,上述的类中的三个独立的方法,就是三个独立的测试,这些方法的命名都以 test 开头。这个命名约定告诉测试运行类哪些方法表示测试。

在 PyCharm 中,可以看出,以 test 开头的方法前面有一个绿色的可执行按钮。

根据 Python 文档

调用 assertEqual() 来检查预期的输出;调用 assertTrue()assertFalse() 来验证一个条件;调用 assertRaises() 来验证抛出了一个特定的异常。使用这些方法而不是 assert 语句是为了让测试运行者能聚合所有的测试结果并产生结果报告。

这里简单选取几个函数记录它们的用法

  • assertEqual(first, second, msg=None): 测试第一个参数和第二个参数是否是相等的。如果它们的值不等,那么这个 test 将会失败。

  • assertTrue(expr, msg=None): 测试 expr 是否正确。

  • assertRaises(exception, *, msg=None): 测试是否抛出了指定的异常。

依葫芦画瓢

待测试的函数

import re

# 判断一个字符串是否是一个合法的 IP4 地址
def judgeIP4(string:str) -> bool:
    ret = re.match(r"(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}"
                   r"([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])$", string)
    if ret:
        return True
    else:
        return False

if __name__ == '__main__':
    string = "10.16.82.108"
    print(judgeIP4(string))

测试代码

import unittest
from IP4Test import judgeIP4

class TestJudgeIP4(unittest.TestCase):
    def test_judgeIP4(self):
        string = '10.16.82.108'
        self.assertTrue(judgeIP4(string))

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

测试输出

Testing started at 1:27 ...

Launching unittests with arguments python -m unittest C:/Users/17309/PycharmProjects/TDDExperiment/TestUnit.py in C:\Users\17309\PycharmProjects\TDDExperiment


Ran 1 test in 0.003s

OK

Process finished with exit code 0

Python 测试框架 unittest 初体验
http://fanyfull.github.io/2021/06/04/Python-测试框架-unittest-初体验/
作者
Fany Full
发布于
2021年6月4日
许可协议