单元测试中创建的归档文件提前被删除,如何修复?
问题
我编写了如下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
相关产品推荐
相关产品推荐

