You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.21 04:15:04