Python unittest测试外部文本文件时self.text的append方法不生效问题
问题原因及修复方案
核心问题
- unittest 框架中,每个以
test_开头的测试方法执行前,都会重新实例化测试类,你在test_reader中写入self.text的数据,执行test_capitalization时已经是新的类实例,self.text会被重新初始化为空列表,自然读不到内容。 - 测试方法默认按方法名字母顺序执行,就算不重新实例化,
test_capitalization也大概率会在test_reader之前运行,还是拿不到数据。
其他隐性错误
- 路径拼接错误:
os.path.join(DIRECTORY, '/data/text_folder')中第二个参数开头带/会被识别为绝对路径,直接忽略前面的DIRECTORY参数,导致文件路径找不到。 - 语法错误:
entry.split[0]中split是方法,需要加括号调用,正确写法是entry.split()[0]。 test_reader作为测试用例没有断言逻辑,不符合单元测试的用例规范。
修复方案
把文件加载逻辑放到unittest提供的setUpClass类方法中,该方法会在所有测试用例执行前只运行一次,加载的数据可以供所有测试方法复用:
import os import unittest DIRECTORY = os.path.abspath(os.path.dirname(os.path.dirname(__file__))) # 修正路径拼接,去掉开头的/ text_file = os.path.join(DIRECTORY, 'data/text_folder') class TestAugmentation(unittest.TestCase): # 类属性,所有实例共享 text = [] @classmethod def setUpClass(cls): # 所有测试用例执行前只加载一次文件 file_path = os.path.join(text_file, 'test.txt') with open(file_path, encoding='utf-8') as f: data = f.readlines() for element in data: cls.text.append(element.strip()) def test_capitalization(self): for entry in self.text: # 修正split的调用写法 first_word = entry.split()[0] self.assertTrue(first_word.isupper(), f'The sentence starts with a lowercase: {entry}') if __name__ == '__main__': unittest.main()
修改后运行测试,会正常触发断言错误,提示第二个句子首单词小写。
内容的提问来源于stack exchange,提问作者zara kolagar
相关产品推荐
相关产品推荐

