note
- 使用
unittest
框架进行单元测试是Python标准库的一部分,提供了编写测试用例、测试套件以及运行测试的能力。 - 测试用例是继承自
unittest.TestCase
的类。在这个类中,你可以定义一系列的方法来测试不同的行为。每个测试方法都应该以test
开头。
文章目录
一、单元测试unittest框架
1. 直接来看一个简单的测试用例
- 使用
unittest
框架进行单元测试是Python标准库的一部分,提供了编写测试用例、测试套件以及运行测试的能力。 - 测试用例是继承自
unittest.TestCase
的类。在这个类中,你可以定义一系列的方法来测试不同的行为。每个测试方法都应该以test
开头。下面代码是一个简单的测试用例
# test-单元测试import unittest
# 子类必须继承unittest.TestCase类classTestMethod(unittest.TestCase):# 每个测试方法都需要以test开头deftest_upper(self):# 检查是否相等
self.assertEqual('foo'.upper(),'FOO')deftest_isupper(self):# 验证是否为真/假
self.assertTrue('FOO'.isupper())
self.assertFalse('foo'.isupper())deftest_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
文件中,可以直接在命令行中运行:
python -m unittest test
这会自动发现所有以
test
开头的方法并运行它们。
- b. 在代码中运行
如果你想在代码中直接运行测试,可以在文件的最后加上:
if __name__ =='__main__':
unittest.main()
4. 测试套件和测试运行器
对于更复杂的测试需求,可以使用
unittest.TestSuite
来组合多个测试用例,然后用
unittest.TextTestRunner
来运行这些测试。
defsuite():
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数据:
import unittest
from datasets import Dataset
from data_juicer.ops.filter.perplexity_filter import PerplexityFilter
from data_juicer.utils.constant import Fields
classPerplexityFilterTest(unittest.TestCase):def_run_perplexity_filter(self, dataset: Dataset, target_list, op):if Fields.stats notin 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)deftest_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
版权归原作者 山顶夕景 所有, 如有侵权,请联系我们删除。