【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)来检查a和b是否相等。
  • 使用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框架

2 https://docs.python.org/zh-cn/3.11/library/unittest.html

相关推荐
BD_Marathon3 小时前
【Python】初识迭代器
python
gz927cool3 小时前
Python 全栈应用最佳实践完整指南
开发语言·python·ai
智购科技智能售货柜3 小时前
顾客已经关门,视觉售货柜还在处理旧画面:延迟积压怎么查?~YH
python·单片机·嵌入式硬件·物联网·eclipse
梯度下降者3 小时前
Python从0到100(三):Python中的变量介绍
python·作用域·变量·数据类型·计算机常识
AIFQuant3 小时前
Python期货行情API接入:股指、黄金、原油多品种数据管道实战
开发语言·python·金融·区块链·量化开发
威哥爱编程4 小时前
Python 智能体开发实战 07:让它查课表它张口就编?给 Agent 接上真正能动手的工具
python·agent
Wang's Blog4 小时前
Java 项目实战:交友项目 - 即时通信总结:全链路复盘、可复用清单与自检
java·python·交友
2601_962885724 小时前
按主板/科创/创业/北交分板扫描选股
python
威哥爱编程4 小时前
Python 智能体开发实战 08:上线第一天就挂?给 Agent 装上重试、超时和降级三条保险丝
python·agent
Dmz丶4 小时前
前端转 AI 100 天 Day 35:结构化输出——让 LLM 稳定返回 JSON
python