如何创建用于测试的临时文件结构

问题描述 投票:0回答:2

在单元测试和 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图像)?

谢谢你。

django django-testing django-tests
2个回答
0
投票

对于资源准备,您应该使用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

删除目录树

0
投票

为什么不创建您希望存在的目录内容,并在每次测试时复制它们:

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)

我更喜欢在每次测试之前而不是之后删除测试目录,因为它可以让您在测试失败时检查内容,这是您经常想要做的。

© www.soinside.com 2019 - 2024. All rights reserved.