【问题标题】:Django test runner not finding testsDjango 测试运行程序找不到测试
【发布时间】:2011-01-03 11:42:44
【问题描述】:

我是 Python 和 Django 的新手,我正在通过创建一个饮食管理网站来学习,但我完全被运行单元测试所击败。我发现的所有文档和博客都说,只要可以从tests.py 中发现,tests.py 与models.py 和您的测试类子类TestCase 位于同一个文件夹中,它应该都会自动获取。这对我不起作用,当我运行 manage.py test <myapp> 时,它没有找到任何测试。

我开始时将所有测试都放在他们自己的包中,但已将其简化为所有测试都在我的 tests.py 文件中。当前的 tests.py 看起来像:

import unittest
from pyDietTracker.models import Weight
from pyDietTracker.weight.DisplayDataAdapters import DisplayWeight

class TestDisplayWeight(unittest.TestCase):

    def setUp(self):
        pass

    def tearDown(self):
        pass

    def testGetWeightInStone_KG_Correctly_Converted(self):
        weight = Weight()
        weight.weight = 99.8

        testAdapter = DisplayWeight(weight)
        self.assertEquals(testAdapter.GetWeightInStone(), '15 st 10 lb')   

我也尝试过继承 Django TestCase 类,但这也不起作用。我正在使用 Django 1.1.1、Python 2.6 并且正在运行 Snow Leopard。

我确定我遗漏了一些非常基本和明显的东西,但我就是不知道是什么。有什么想法吗?

编辑:评论后的快速更新

INSTALLED_APPS = (
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
'django.contrib.admin',
'pyDietTracker',
 )

为了让测试运行,我正在运行manage.py test pyDietTracker

【问题讨论】:

  • 您正在运行什么命令来执行这些命令?你的settings 是什么样的?此应用程序是否在 INSTALLED_APPS 列表中?
  • 我已经用我的 INSTALLED_APPS 更新了这个问题,还有其他相关的设置部分吗?谢谢
  • 你实际收到了什么消息?
  • 我没有收到错误消息,它只是说 0 个测试运行。我远离计算机 atm,但是当我尝试直接命名测试类时,我得到一个错误,类似于不合适的测试用例。我会在我回来的时候准确地发布它。
  • @L2Type:您不能轻易地直接命名 TestCase 类。您命名应用程序,Django 运行程序通过查看 models.py 和 tests.py 来完成它的发现工作

标签: python django unit-testing


【解决方案1】:

https://docs.djangoproject.com/en/1.11/topics/testing/overview/

测试未运行的最常见原因是您的设置不正确,并且您的模块不在 INSTALLED_APPS 中。

我们使用django.test.TestCase 而不是unittest.TestCase。它捆绑了Client

https://docs.djangoproject.com/en/1.11/topics/testing/tools/#django.test.TestCase

【讨论】:

  • 谢谢,我已经翻页了,我的模块在 INSTALLED_APPS 中
  • 测试类中的测试方法必须以关键字 test 开头才能运行。
【解决方案2】:

解决了。

原来我已经完成了django-admin.py startproject pyDietTracker,但没有完成python manage.py startapp myApp。在返回并执行此操作后,它确实按记录工作。看来我有很多关于阅读以及 Django 中网站和应用程序之间的区别的知识。

感谢 S.Lott 和 Emil Stensröm 的帮助。我希望我能接受你的两个答案,因为他们都得到了很多帮助。

最重要的一课测试只能在应用级别而不是网站级别进行

【讨论】:

    【解决方案3】:

    我有同样的问题,但我的根本原因不同。

    我收到了Ran 0 tests,作为 OP。

    但事实证明,测试类中的测试方法必须以关键字test 开头才能运行

    例子:

    from django.test import TestCase
    
    
    class FooTest(TestCase):
        def setUp(self):
            pass
    
        def tearDown(self):
            pass
    
        def this_wont_run(self):
            print 'Fail'
    
        def test_this_will(self):
            print 'Win'
    

    其中包含您的 TestCases 的文件也必须以 test 开头。

    【讨论】:

    • 如果仍然无法正常工作,请检查文件名是否匹配此模式:test*.py 这就是 django 选择测试套件文件的方式。 django doc
    • 对于其他读者,还有一个变化是使用Django的TestCase代替unittest.TestCase
    • 那是我错过的事情。谢谢!
    • 这个技巧对我有用。我没有在函数前面加上“test_”
    【解决方案4】:

    当我在同一个 Django 应用程序目录中有一个 test.py 文件和一个 test/ 子目录时,我遇到了这种情况。我想我是在寻找一个测试模块(在 test.py 中)还是一个测试包(在 test/subdir 中),这让 python 或测试运行器感到困惑。

    【讨论】:

      【解决方案5】:

      如果您尝试在主应用程序中运行测试,例如 my_app/my_app/,请确保您已检查以下内容:

      1. 应用名称列在settings.py 内的INSTALLED_APPS 中
      2. 确保您在settings.py 中的DATABASES['default'] 设置正确
      3. App有一个models.py(即使你不使用,至少也需要一个空的)

      【讨论】:

      • 如果你使用''tests''文件夹,记得放一个''_ init _.py''文件。
      【解决方案6】:

      如果您的 tests.py 中有语法错误,也会发生这种情况。

      【讨论】:

        【解决方案7】:

        如果您使用yourapp/tests 包/样式进行单元测试,请确保您的tests 文件夹中有__init__.py(因为这就是使它成为Python 模块的原因!)。

        【讨论】:

        • 是的!如果您为所需应用程序使用自定义文件夹来运行测试(例如:my_apps/app_name/",那么您应该在 my_apps/ 中创建 __init__.py 文件。
        【解决方案8】:

        这是我刚刚得到的另一个:检查您的测试文件不可执行。我的 virtualbox 将它们自动挂载为可执行文件,因此测试发现完全错过了它们。我必须将它们添加到相关的 __init__.py 文件中,然后有人告诉我问题是什么作为解决方法,但现在它们已被删除,不可执行,一切都_just_works。

        【讨论】:

        • 在 Docker Desktop 上的 docker 镜像中运行测试时,我遇到了同样的问题。解决方案来自这个答案。我在 /{app}/tests/ 文件夹中有很多 test_*.py 。在 /{app}/tests/__init__.py 中导入此测试时已解决。非常感谢您的洞察力。
        【解决方案9】:

        就我而言,我输入了def 而不是class。而不是

        class TestDisplayWeight(TestCase): # correct!
        

        我有

        def TestDisplayWeight(TestCase): # wrong!
        

        【讨论】:

          【解决方案10】:

          我可以为特定应用运行测试,例如

          python project/manage.py test app_name
          

          但是当我跑步时

          python project/manage.py test
          

          找到0个测试

          弄清楚我需要在与 manage.py 相同的目录中运行它

          所以解决方案是,cd 到项目目录并运行

          python manage.py test
          

          【讨论】:

          【解决方案11】:

          当您使用tests 模块而不是tests.py 时,也可能发生这种情况。在这种情况下,您需要将所有测试类导入您的测试模块的__init__.py,例如

          tests/
              __init__.py
              somemodule.py
          

          在您的__init__.py 中,您现在需要像这样导入somemodule

          from .somemodule import *
          

          【讨论】:

          • 这是我的问题,感谢您解决。问候!
          • 这可能有效,但我认为这不是正确的解决方法,因为我有另一个不需要此导入来运行测试的 python 项目。
          • 这也是我的问题。非常感谢!
          • 我正在使用脚本来运行我的测试。几个月和一台新电脑后,测试出乎意料地坏了。这解决了它。不知道有什么区别。也许是不同的python版本。也许是更新的 Django...
          【解决方案12】:

          使用这种语法

          python manage.py test
          

          而不是./manage.py test 为我解决了这个问题。

          【讨论】:

            【解决方案13】:

            在同一个文件中,我有两个具有 SAME NAME 的测试类,当然这会阻止所有测试运行。

            【讨论】:

              【解决方案14】:

              我在我的测试类中创建了一个名为run 的方法,结果证明这是一个非常糟糕的主意。 Python 可以看到我想运行测试,但无法运行。这个问题略有不同,但结果是一样的——它看起来好像找不到测试。

              请注意,显示了以下消息: You want to run the existing test: <unittest.runner.TextTestResult run=0 errors=0 failures=0>

              【讨论】:

                【解决方案15】:

                就我而言,app 文件夹本身缺少__init__.py。这会导致测试将使用python manage.py test project.app_name 运行而不是python manage.py test

                project/
                  app_name/
                    __init__.py   # this was missing
                

                【讨论】:

                • 谢谢!您帮我找到了我的问题,即我创建了一个文件夹“tests”来保存我的测试脚本,但忘记添加文件 init.py
                • 同样的事情:我有project/apps/core,在project/apps 中没有__init__.py
                • 感谢您发布此信息 - 我创建了一个 tests 子文件夹,但忘记在该方向下方包含一个 __init__.py。添加它就可以了!
                • 谢谢。为这个问题苦苦挣扎了很久。最后将__init__.py 添加到应用程序工作。最初我只是在测试文件夹中检查__init__.py
                【解决方案16】:

                就我而言,我想念以 test_ 开头的函数名称 当运行我的测试时:

                python manage.py test myapp
                

                结果是:

                Creating test database for alias 'default'...
                System check identified no issues (0 silenced).
                
                ----------------------------------------------------------------------
                Ran 0 tests in 0.000s
                
                OK
                Destroying test database for alias 'default'...
                

                似乎 Django 无法识别我的测试!

                然后我像这样更改 myproject/myapp/test.py 文件:

                from django.test import TestCase
                # Create your tests here.
                class apitest(TestCase):
                
                    def test_email(self):
                        pass
                    def test_secend(self):
                        pass
                

                之后的结果是:

                Creating test database for alias 'default'...
                System check identified no issues (0 silenced).
                ..
                ----------------------------------------------------------------------
                Ran 2 tests in 2.048s
                
                OK
                Destroying test database for alias 'default'...
                

                【讨论】:

                  【解决方案17】:

                  运行--help 并查找详细信息。把它调到最大。

                  我运行manage.py test --verbose 并在顶部找到了这个调试输出:

                  &gt;nosetests --with-spec --spec-color --verbose --verbosity=2

                  哦,看!我已经安装并忘记了nosetests。它说--verbosity=2。我发现 3 是最大值,并以 3 运行它,我发现了很多:

                  nose.selector: INFO: /media/sf_C_DRIVE/Users/me/git/django/app/tests/test_processors.py is executable; skipped
                  

                  这给了我正确的提示。确实存在设置 x 位的文件的问题。然而,由于它已经运行了一些测试,我被抛离了轨道——尽管它明确表示它会跳过它们。更改位是不可能的,因为我在 VM 中运行测试,共享我的 Windows NTFS 磁盘。所以添加--exe 修复了它。

                  【讨论】:

                    【解决方案18】:

                    有同样的问题,这是因为我的文件名中有一个 - 字符。 我的文件名是route-tests.py,改成route_tests.py

                    【讨论】:

                      【解决方案19】:

                      如果您在升级到 Django 3 后遇到此错误,可能是因为 -k 参数的含义从:

                      -k, --keepdb          Preserves the test DB between runs.
                      

                      -k TEST_NAME_PATTERNS   Only run test methods and classes that match the pattern or substring. Can be used multiple times. Same as unittest -k option.
                      

                      所以只需将-k 替换为--keepdb 即可使其再次工作。

                      【讨论】:

                        【解决方案20】:

                        Django 引擎搜索带有test_ 前缀的文件和文件夹(在tests 文件夹内)。就我而言,这是一个简单的解决方案。

                        所以,请务必检查以它开头的文件/文件夹名称。

                        【讨论】:

                          【解决方案21】:

                          我遇到了同样的问题,它是由项目根目录下的 init.py 引起的 - 删除它,所有测试再次运行良好。

                          【讨论】:

                            猜你喜欢
                            • 1970-01-01
                            • 2011-01-20
                            • 2021-10-25
                            • 2020-03-25
                            • 2020-01-12
                            • 1970-01-01
                            • 1970-01-01
                            • 2015-07-22
                            • 1970-01-01
                            相关资源
                            最近更新 更多