【问题标题】:Django doctests in views.pyviews.py 中的 Django 文档测试
【发布时间】:2011-01-23 17:51:36
【问题描述】:

Django 1.4 documentation on tests 声明:

对于给定的 Django 应用程序,测试运行程序会在两个地方查找 doctest:

  • models.py 文件。您可以为单个模型定义模块级 doctest 和/或 doctest。通常的做法是将应用程序级别的文档测试放在模块文档字符串中,将模型级别的文档测试放在模型文档字符串中。

  • 应用程序目录中名为 tests.py 的文件 - 即保存 models.py 的目录。该文件是您要编写的任何和所有与模型无关的文档测试的挂钩。

出于好奇,我想知道为什么 Django 的测试运行程序仅限于 models.py 中的文档测试,但更实际地我想知道如何扩展测试运行程序的文档测试以包括(例如)views.py以及运行manage.py test时的其他模块。

如有任何意见,我将不胜感激。

谢谢。

布赖恩

【问题讨论】:

    标签: python django unit-testing doctest


    【解决方案1】:

    您可以通过在 tests.py 中添加/编辑 suite() 函数来做到这一点,该函数定义了 django 测试运行程序将运行哪些测试。

    import unittest
    import doctest
    from project import views
    
    def suite():
        suite = unittest.TestSuite()
        suite.addTest(doctest.DocTestSuite(views))
        return suite
    

    然后像往常一样运行你的测试,你应该在views.py中看到你的文档测试。

    $ python manage.py test project
    

    这在django testing documentation中有更详细的描述

    当您运行测试时,测试实用程序的默认行为是在 models.py 和 tests.py 中查找所有测试用例(即 unittest.TestCase 的子类),并根据这些测试自动构建测试套件测试用例,然后运行该套件。

    还有第二种方法可以为模块定义测试套件:如果您在 models.py 或 tests.py 中定义了一个名为 suite() 的函数,Django 测试运行器将使用该函数来构建测试套件那个模块。这遵循建议的单元测试组织。有关如何构建复杂测试套件的更多详细信息,请参阅 Python 文档。

    但是,请记住,构建您自己的测试套件意味着 django 测试运行器不会自动运行您在 tests.py 中的任何测试。例如,您必须手动将这些添加到您的套件中

    import unittest
    import doctest
    from project import views
    
    class FooTestCase(unittest.TestCase):
        def testFoo(self):
            self.assertEquals('foo', 'bar')
    
    def suite():
        suite = unittest.TestSuite()
        suite.addTest(doctest.DocTestSuite(views))
        suite.addTest(unittest.TestLoader().loadTestsFromTestCase(FooTestCase))
        return suite
    

    【讨论】:

    • 对于 Django 1.8,这仍然是正确的方法吗? Andre Miras 在下面的回答表明它已经更新。
    • @BrianM.Hunt 不确定 1.8 但在 1.6 中,在我看来 suite() 不再被调用。安德烈对load_tests() 的回答反而起作用了。
    【解决方案2】:

    东西有changed in Django 1.6:

    Doctests 将不再被自动发现。集成 测试套件中的 doctests,请关注 recommendations in the Python documentation

    所以我自己要做的就是(在 my_app/tests.py 中):

    import unittest
    import doctest
    from my_app import views
    
    def load_tests(loader, tests, ignore):
        tests.addTests(doctest.DocTestSuite(views))
        return tests
    

    【讨论】:

    • 在我的应用程序 tests.py 文件的末尾(我已经更新了我的答案)。
    • 这对我有用,谢谢。我能够引入应用程序的模型,而不是用于 doctesting 的视图。而且我认为您可以跳过导入unittest?
    • 这是最新的答案。还很高兴注意到它与正常的 TestCase 测试一起执行,因此无需额外使用 unittest.TestLoader 或类似的东西来加载更传统的 django 测试
    【解决方案3】:

    这是我的tests/__init__.py 实现,基于Jesse Shieh answer

    import doctest
    import unittest
    
    list_of_doctests = [
        'myapp.views.myview',
        'myapp.forms.myform',
    ]
    list_of_unittests = [
        'sometestshere',  # This file is myapp/tests/sometestshere.py
        'moretestshere',  # This file is myapp/tests/moretestshere.py
        'myapp.tests.othertest',  # Absolute paths also work.
    ]
    
    def suite():
        suite = unittest.TestSuite()
        for t in list_of_doctests:
            suite.addTest(doctest.DocTestSuite(
                __import__(t, globals(), locals(), fromlist=["*"])
            ))
        for t in list_of_unittests:
            suite.addTest(unittest.TestLoader().loadTestsFromModule(
                __import__(t, globals(), locals(), fromlist=["*"])
            ))
        return suite
    

    基本上,此解决方案允许向测试套件添加任意“文件”(实际上是模块)。它允许将单元测试拆分为单独的文件,并允许添加任何包含 doctest 的模块。只需将模块名称添加到此文件顶部的相应列表中即可。

    【讨论】:

      【解决方案4】:

      使用nosetests 和django 插件(django-sane-testing 或django-nose)并使用--with-doctest flag

      【讨论】:

        【解决方案5】:

        Django 的原生测试系统基于unittest 包。所以它没有它可以的那么强大。

        我建议您使用nose,它是向后兼容的unittest 类固醇。与Django test runner that uses nose 一起使用。您可以通过多种方式自定义鼻子,包括使用-m 标志将其指向自定义测试位置。

        【讨论】:

          【解决方案6】:

          我发布了一个 github gist,可让您在项目中的任何文件或模块中运行测试。 Running doctests from specific modules and files

          【讨论】:

            【解决方案7】:

            您可以尝试编写自己的testrunner,看看是否可以包含其他文件以检查文档测试。

            http://docs.djangoproject.com/en/dev/topics/testing/#defining-a-test-runner

            【讨论】:

              猜你喜欢
              • 2014-01-15
              • 2011-06-03
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2015-01-07
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多