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

单元测试中创建的归档文件提前被删除,如何修复?

问题

我编写了如下unittest测试代码:

class TestBackup(unittest.TestCase):
    def setUp(self):
        # Create a temporary directory for the test files
        self.temp_dir = tempfile.mkdtemp()
        self.output_dir = os.path.join(self.temp_dir, 'output')
        os.makedirs(self.output_dir)

        # Create a tar archive file for the test
        self.tar_file = os.path.join(self.temp_dir, 'test.tar.gz')
        tar = tarfile.open(self.tar_file, mode='w:gz')
        tar.add(__file__, arcname='test.py')

        # Add two fake files to the tar archive

        ....

        tar.close()

    def test_check_if_tar_file(self):
        # Test with a valid tar archive file
        check_if_tar_file(self.tar_file)

        # Test with a non-existent file
        with self.assertRaises(ValueError) as cm:
            check_if_tar_file('nonexistent.tar.gz')
        self.assertEqual(str(cm.exception), "Error: File nonexistent.tar.gz does not exist or is not a regular file")

        # Test with a file that exists but is not a tar archive file
        with open(os.path.join(self.temp_dir, 'not_a_tar.txt'), 'w') as f:
            f.write('test')
        with self.assertRaises(ValueError) as cm:
            check_if_tar_file(os.path.join(self.temp_dir, 'not_a_tar.txt'))
        self.assertEqual(str(cm.exception), "Error: File not_a_tar.txt is not a tar archive file")

        # Test with a file that exists but the user does not have read permissions
        os.chmod(self.tar_file, 0o000)
        with self.assertRaises(ValueError) as cm:
            check_if_tar_file(self.tar_file)
        self.assertEqual(str(cm.exception), "Error: Permission denied for file test.tar.gz")

    ....

    def tearDown(self):
        # Delete the temporary directory and its contents
        shutil.rmtree(self.temp_dir)

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

运行测试时收到错误:No such file or directory: 'test.tar.gz'。我已确认归档文件已正确创建并存储在类属性中,但推测文件在测试运行前被删除,请问我哪里出错了?

解决方法
  • 优先排查check_if_tar_file函数逻辑:错误提示里的路径是相对路径test.tar.gz,但你传入的是绝对路径self.tar_file,说明函数内部可能错误地将绝对路径转换成了文件名(比如用os.path.basename处理后直接使用),导致程序去当前工作目录找文件,而非你创建的临时目录。检查函数是否正确使用传入的完整路径进行文件操作。
  • 确保tar文件被正确写入磁盘:setUp里手动调用tar.close()存在风险,如果中间....部分的代码抛出异常,tar.close()会被跳过,导致tar文件未完成写入。改用with语句自动管理文件句柄,即使出错也能保证文件正确关闭:
    with tarfile.open(self.tar_file, mode='w:gz') as tar:
        tar.add(__file__, arcname='test.py')
        # 添加假文件的代码
    
  • 修复权限测试后的清理问题:将文件权限设为0o000后,tearDown里的shutil.rmtree可能无法删除该文件,虽然这不会直接导致当前测试的文件不存在,但会影响后续测试的环境。可以在权限测试后恢复权限:
    os.chmod(self.tar_file, 0o000)
    try:
        with self.assertRaises(ValueError) as cm:
            check_if_tar_file(self.tar_file)
        self.assertEqual(str(cm.exception), "Error: Permission denied for file test.tar.gz")
    finally:
        # 恢复权限以便tearDown正常删除
        os.chmod(self.tar_file, 0o644)
    
  • 验证setUp执行完整性:在setUp末尾添加断言,确认tar文件确实被创建:
    self.assertTrue(os.path.exists(self.tar_file), f"Tar file {self.tar_file} was not created")
    
    这样如果setUp中创建文件的代码出错,会直接在初始化阶段抛出错误,方便定位问题。

内容的提问来源于stack exchange,提问作者Sergiu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 01:35:25