【Python】单元测试unittest框架

note

  • 使用unittest框架进行单元测试是Python标准库的一部分,提供了编写测试用例、测试套件以及运行测试的能力。
  • 测试用例是继承自unittest.TestCase的类。在这个类中,你可以定义一系列的方法来测试不同的行为。每个测试方法都应该以test开头。

文章目录

一、单元测试unittest框架

1. 直接来看一个简单的测试用例

  • 使用unittest框架进行单元测试是Python标准库的一部分,提供了编写测试用例、测试套件以及运行测试的能力。
  • 测试用例是继承自unittest.TestCase的类。在这个类中,你可以定义一系列的方法来测试不同的行为。每个测试方法都应该以test开头。下面代码是一个简单的测试用例
python 复制代码
# test-单元测试
import unittest

# 子类必须继承unittest.TestCase类
class TestMethod(unittest.TestCase):
    # 每个测试方法都需要以test开头
    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 = "happy new year"
        self.assertEqual(s.split(), ['happy', 'new', 'year'])
        with self.assertRaises(TypeError):
            s.split(3)


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

2. 相关断言方法的使用:

  • 使用assertEqual(a, b)来检查ab是否相等。
  • 使用assertTrue(x)assertFalse(x)来验证x是否为真或假。
  • 使用assertRaises(Error, func, *args, **kwargs)来验证是否抛出了期望的异常。比如上面的代码例子,s.split()方法的参数应该是一个字符串,然后传入了3数字所以预期该调用会抛出TypeError异常

3. 运行测试

可以通过以下2种方式运行测试:

  • a. 命令行运行

如果你的测试代码保存在test.py文件中,可以直接在命令行中运行:

bash 复制代码
python -m unittest test

这会自动发现所有以test开头的方法并运行它们。

  • b. 在代码中运行

如果你想在代码中直接运行测试,可以在文件的最后加上:

python 复制代码
if __name__ == '__main__':
    unittest.main()

4. 测试套件和测试运行器

对于更复杂的测试需求,可以使用unittest.TestSuite来组合多个测试用例,然后用unittest.TextTestRunner来运行这些测试。

python 复制代码
def suite():
    suite = unittest.TestSuite()
    suite.addTest(TestStringMethods('test_upper'))
    suite.addTest(TestStringMethods('test_isupper'))
    return suite

if __name__ == '__main__':
    runner = unittest.TextTestRunner()
    runner.run(suite())

unittest框架提供了丰富的断言方法和测试组织方式,帮助开发者构建可靠和可维护的测试套件。通过这种方式,可以有效地进行单元测试,确保代码的质量和稳定性。

二、一个完整的例子

这里引用大模型数据处理库data_juicer的一个栗子,PerplexityFilter是根据计算微调数据的困惑度进行筛选sft数据:

python 复制代码
import unittest
from datasets import Dataset
from data_juicer.ops.filter.perplexity_filter import PerplexityFilter
from data_juicer.utils.constant import Fields


class PerplexityFilterTest(unittest.TestCase):

    def _run_perplexity_filter(self, dataset: Dataset, target_list, op):
        if Fields.stats not in dataset.features:
            # TODO:
            # this is a temp solution,
            # only add stats when calling filter op
            dataset = dataset.add_column(name=Fields.stats,
                                         column=[{}] * dataset.num_rows)
        dataset = dataset.map(op.compute_stats)
        dataset = dataset.filter(op.process)
        dataset = dataset.select_columns(column_names=['text'])
        res_list = dataset.to_list()
        self.assertEqual(res_list, target_list)

    def test_en_case(self):

        ds_list = [{
            'text': "Today is Sunday and it's a happy day!"
        }, {
            'text':
            "Today is Sund Sund Sund Sund Sunda and it's a happy day!"
        }, {
            'text': 'a v s e c s f e f g a qkc'
        }, {
            'text': ',。、„""<<>>1」「《》´∶:?!();-----.~'...━〈〉【】%►'
        }, {
            'text': 'Do you need a cup of coffee?'
        }, {
            'text': 'emoji表情测试下😊,😸31231'
        }]
        tgt_list = [{
            'text': "Today is Sunday and it's a happy day!"
        }, {
            'text': 'Do you need a cup of coffee?'
        }]
        dataset = Dataset.from_list(ds_list)
        op = PerplexityFilter(lang='en', max_ppl=900)
        self._run_perplexity_filter(dataset, tgt_list, op)


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

Reference

1\] [python中unittest库 python的unittest框架](https://blog.51cto.com/u_14402/6504932) \[2\] https://docs.python.org/zh-cn/3.11/library/unittest.html

相关推荐
dme.15 分钟前
Javascript之DOM操作
开发语言·javascript·爬虫·python·ecmascript
加油吧zkf24 分钟前
AI大模型如何重塑软件开发流程?——结合目标检测的深度实践与代码示例
开发语言·图像处理·人工智能·python·yolo
t_hj25 分钟前
python规划
python
czhc114007566341 分钟前
Linux 76 rsync
linux·运维·python
悠悠小茉莉1 小时前
Win11 安装 Visual Studio(保姆教程 - 更新至2025.07)
c++·ide·vscode·python·visualstudio·visual studio
m0_625686551 小时前
day53
python
Real_man2 小时前
告别 requirements.txt,拥抱 pyproject.toml和uv的现代Python工作流
python
站大爷IP3 小时前
Python文件操作的"保险箱":with语句深度实战指南
python
运器1233 小时前
【一起来学AI大模型】算法核心:数组/哈希表/树/排序/动态规划(LeetCode精练)
开发语言·人工智能·python·算法·ai·散列表·ai编程
新world4 小时前
mybatis-plus从入门到入土(二):单元测试
单元测试·log4j·mybatis