python - 在测试之间自动删除 MEDIA_ROOT

标签 python django unit-testing

我想知道是否有可能,最好不要太困难,使用 Django DiscoverRunner 在每次测试之间删除我的媒体目录,包括在最开始和最后一次。我对 Django 1.7 中引入的新属性“test_suite”和“test_runner”特别感兴趣,想知道它们是否会使这项任务变得更容易。

我还想知道如何使测试特定的 MEDIA_ROOT 成为一个临时文件,目前我有一个名为“media”的常规 MEDIA_ROOT 和一个名为“media_test”的测试 MEDIA_ROOT,我在每个测试类的设置和拆卸中使用 rmtree涉及媒体目录。我指定使用哪个 MEDIA_ROOT 的方式是在我的 test.py 设置文件中,目前我只有:

MEDIA_ROOT = normpath(join(DJANGO_ROOT, 'media_test'))

有没有办法将 MEDIA_ROOT 设置为名为“media”的临时目录?

最佳答案

这个问题有点老,我的回答来自Django 2.0和Python 3.6.6或更高版本。虽然我认为该技术也适用于旧版本,YMMV。

我认为这是一个比人们认为的更重要的问题!当您编写好的测试时,您需要启动测试文件或生成测试文件只是时间问题。无论哪种方式,您都有污染服务器或开发人员机器的文件系统的危险。 两者都不可取!

我认为写在 this page 上是最佳实践。如果您不关心推理(之后有更多注释),我将复制/粘贴下面的代码片段:

----

首先,让我们写一个基本的,非常基本的模型

from django.db import models

class Picture(models.Model):
    picture = models.ImageField()

然后,让我们编写一个非常非常基础的测试。

from PIL import Image
import tempfile
from django.test import TestCase
from .models import Picture
from django.test import override_settings

def get_temporary_image(temp_file):
    size = (200, 200)
    color = (255, 0, 0, 0)
    image = Image.new("RGBA", size, color)
    image.save(temp_file, 'jpeg')
    return temp_file

class PictureDummyTest(TestCase):

    @override_settings(MEDIA_ROOT=tempfile.TemporaryDirectory(prefix='mediatest').name)
    def test_dummy_test(self):
            temp_file = tempfile.NamedTemporaryFile()
            test_image = get_temporary_image(temp_file)
            #test_image.seek(0)
            picture = Picture.objects.create(picture=test_image.name)
            print "It Worked!, ", picture.picture
            self.assertEqual(len(Picture.objects.all()), 1)

----

我对代码片段进行了一项重要更改:TemporaryDirectory().name。原始代码段使用了 gettempdir()TemporaryDirectory 函数会在每次调用时使用系统生成的名称创建一个新文件夹。该文件夹将被操作系统删除 - 但我们不知道什么时候!这样,我们每次运行都会得到一个新文件夹,因此不会发生名称冲突。注意我必须添加 .name 元素来获取生成的文件夹的名称,因为 MEDIA_ROOT 必须是一个字符串。最后,我添加了 prefix='mediatest',这样所有生成的文件夹都很容易识别,以防我想在脚本中清理它们。

对您也可能有用的是,如何将设置覆盖轻松应用于测试类,而不仅仅是一个测试函数。参见 this page了解详情。

另请注意,在本文后的评论中,有些人展示了一种更简单的方法来获取临时文件名,而无需担心使用 NamedTemporaryFile 的媒体设置(仅对不支持的测试有效使用媒体设置!)

关于python - 在测试之间自动删除 MEDIA_ROOT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25792696/

相关文章:

unit-testing - 单元测试优先级、工具、指标

python - 为什么在对 df 中的几列进行分组后使用 df_grouped.loc[ ] 进行切片时会出现错误?

python - 对象没有属性

python - Flask 和传输编码 : chunked

python - Django 开发是否提供真正灵活的 3 层架构?

python - 具有问题模型的 Django 中的自定义权限

python - 正则表达式 sre_constants.error : bad character range

python - 如何使用表达式作为关键字在django中保存

python - 如何从pytest中获取通过、失败和跳过的测试总数

reactjs - Next.JS & JEST - publicRuntimeConfig 未定义