如何测试自定义 django-admin 命令

Posted

技术标签:

【中文标题】如何测试自定义 django-admin 命令【英文标题】:How to test custom django-admin commands 【发布时间】:2010-11-20 04:16:18 【问题描述】:

我创建了custom django-admin commands

但是,我不知道如何在standard django tests 中测试它

【问题讨论】:

【参考方案1】:

添加到此处已发布的内容。如果您的 django-admin 命令将文件作为参数传递,您可以执行以下操作:

from django.test import TestCase
from django.core.management import call_command
from io import StringIO
import os


class CommandTestCase(TestCase):
    def test_command_import(self):
        out = StringIO()
        call_command(
            'my_command', os.path.join('path/to/file', 'my_file.txt'),
            stdout=out
        )
        self.assertIn(
        'Expected Value',
            out.getvalue()
        )

当您的 django-command 以如下方式使用时,此方法有效:

$ python manage.py my_command my_file.txt

【讨论】:

【参考方案2】:

如果您正在使用某些覆盖工具,最好从代码中调用它:

from django.core.management import call_command
from django.test import TestCase

class CommandsTestCase(TestCase):
    def test_mycommand(self):
        " Test my custom command."

        args = []
        opts = 
        call_command('mycommand', *args, **opts)

        # Some Asserts.

From the official documentation

可以使用 call_command() 函数测试管理命令。输出可以重定向到 StringIO 实例中

【讨论】:

注意如何涵盖测试docs.djangoproject.com/en/1.9/howto/custom-management-commands/… 以上链接失效,请访问最新版本的文档here。【参考方案3】:

parsing stdout 的一个简单替代方法是,如果管理命令未成功运行,则使用错误代码退出,例如使用 sys.exit(1)。

您可以在测试中捕捉到这一点:

    with self.assertRaises(SystemExit):
        call_command('mycommand')

【讨论】:

【参考方案4】:

您可以在 github.com 示例中看到 see here

def test_command_style(self):
    out = StringIO()
    management.call_command('dance', style='Jive', stdout=out)
    self.assertEquals(out.getvalue(),
        "I don't feel like dancing Jive.")

【讨论】:

你可能需要 out.getvalue().strip()【参考方案5】:

我同意 Daniel 的观点,即实际的命令脚本应该尽可能少,但您也可以使用 os.popen4 在 Django 单元测试中直接对其进行测试。

在您的单元测试中,您可以使用类似的命令

fin, fout = os.popen4('python manage.py yourcommand')
result = fout.read()

然后你可以分析结果的内容来测试你的Django命令是否成功。

【讨论】:

不要使用子进程进行这种测试,当然也不要使用 os.popen4,如果你真的想这样做,你会使用子进程包。【参考方案6】:

您应该使您的实际命令脚本尽可能少,以便它只在其他地方调用一个函数。然后可以像往常一样通过单元测试或文档测试来测试该功能。

【讨论】:

不确定我是否同意这一点。如果我能做到这一点,我可能不会让它成为 Django 命令。我只是将它作为 python 程序运行。我制作 Django 命令的原因是为了获取所有 Django 基础设施。 嗯,有时由于导入问题,您不能将其作为 python 程序运行。

以上是关于如何测试自定义 django-admin 命令的主要内容,如果未能解决你的问题,请参考以下文章

自定义django-admin命令

如何在 Django-admin 中添加自定义搜索框?

Django-Admin:集成自定义表单

django-admin.py 找不到自定义设置文件

word2016如何自定义安装

Django-admin自定义用户信息表