在单元测试和 Selenium 功能测试过程中,会生成这些文件,这些文件随后不会被清除。我花了很长时间试图让 django-cleanup 工作,但它什么也没做。
我想我需要创建一个临时文件结构,可以在测试期间将文件上传到该结构,然后在测试后销毁。这就是我创建临时 MEDIA_ROOT 文件的方法:
MEDIA_ROOT = tempfile.mkdtemp()
@override_settings(MEDIA_ROOT=MEDIA_ROOT)
class UnitTest(TestCase):
@classmethod
def tearDownClass(cls):
shutil.rmtree(MEDIA_ROOT, ignore_errors=True)
super().tearDownClass()
问题是,虽然我可能创建了临时 MEDIA_ROOT 文件夹,但它不会创建子文件夹和文件。
我的项目中的文件结构如下所示
MEDIA_ROOT
profile_pics
default.jpg
user_files
在执行每个测试之前,会创建一个用户,并且在用户创建期间,会为用户分配一个个人资料图片“default.jpg”。这会使每个测试崩溃,因为 profile_pics 文件夹和 default.jpg 图像都不存在。如果它没有在这里崩溃,它稍后会崩溃,因为它会尝试将文件保存在 MEDIA 内的文件夹中,而该文件夹不会存在于我的临时文件中。
如何在不使用 Django Cleanup 的情况下测试后删除所有文件?或者我如何创建一个临时媒体文件(类似于我已经在做的),以及其中的文件结构(它还必须包括用户创建过程中所需的default.jpg图像)?
谢谢你。
对于资源准备,您应该使用setup和tearDown方法
class MyViewSetTestCase(TestCase):
def setUp(self):
# do directory & files creation here
pass
def tearDown(self):
# do cleanup (remove all dirs & files) here
pass
setUp 在每次测试之前调用,tearDown 在每次测试之后调用
您可以使用 os.makedirs
创建目录树您可以使用 shutil.rmtree
删除目录树为什么不创建您希望存在的目录内容,并在每次测试时复制它们:
TMP_MEDIA_ROOT = tempfile.mkdtemp()
EXAMPLE_DIR = 'tests/example_media_dir'
@override_settings(MEDIA_ROOT=TMP_MEDIA_ROOT)
class UnitTest(TestCase):
@classmethod
def setUpClass(cls):
shutil.rmtree(TMP_MEDIA_ROOT)
shutil.copytree(EXAMPLE_DIR, TMP_MEDIA_ROOT)
我更喜欢在每次测试之前而不是之后删除测试目录,因为它可以让您在测试失败时检查内容,这是您经常想要做的。