我是 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 列表中?
我有同样的问题,但我的根本原因是不同的。
作为 OP,我得到了 Ran 0 tests
。
但事实证明,测试类中的测试方法必须以关键字 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 开头。
如果您将 yourapp/tests
包/样式用于单元测试,请确保您的 tests
文件夹中有一个 __init__.py
(因为这就是使它成为 Python 模块的原因!)。
my_apps/app_name/
",那么您应该在 my_apps/
中创建 __init__.py
文件。
我可以为特定应用程序运行测试,例如
python project/manage.py test app_name
但是当我跑步时
python project/manage.py test
找到 0 个测试
弄清楚我需要在与 manage.py 相同的目录中运行它
所以解决方案是, cd 到项目目录并运行
python manage.py test
python project/manage.py test project/
python src/manage.py test
提供解决方法并运行所有测试,请分享并更新 aswer。非常感谢该解决方案对我有用。
就我而言,应用程序文件夹本身缺少 __init__.py
。这会导致测试将使用 python manage.py test project.app_name
而不是使用 python manage.py test
运行的行为。
project/
app_name/
__init__.py # this was missing
project/apps/core
,而 project/apps
中没有 __init__.py
。
tests
子文件夹,但忘记在该方向下方包含一个 __init__.py
。添加它就可以了!
__init__.py
添加到应用程序有效。最初我只是在测试文件夹中检查 __init__.py
。
当您使用 tests
模块而不是 tests.py
时,也可能会发生这种情况。在这种情况下,您需要将所有测试类导入测试模块的 __init__.py
,例如
tests/
__init__.py
somemodule.py
在您的 __init__.py
中,您现在需要像这样导入 somemodule
:
from .somemodule import *
如果您的 tests.py 中有语法错误,也会发生这种情况。
在我的例子中,我输入了 def
而不是 class
。代替
class TestDisplayWeight(TestCase): # correct!
我有
def TestDisplayWeight(TestCase): # wrong!
解决了。
事实证明我已经完成了 django-admin.py startproject pyDietTracker
但没有完成 python manage.py startapp myApp
。返回并执行此操作后,它确实按记录工作。看来我有很多关于阅读以及 Django 中站点和应用程序之间的区别的知识。
感谢您对 S.Lott 和 Emil Stensröm 的帮助。我希望我能接受你的两个答案,因为他们都得到了很多帮助。
最重要的一课测试仅在应用程序级别而不是站点级别有效
这是我刚刚拥有的另一个:检查您的测试文件不可执行。我的 virtualbox 将它们自动挂载为可执行文件,因此测试发现完全错过了它们。在有人告诉我问题出在解决方法之前,我必须将它们添加到相关的 __init__.py
文件中,但现在它们已被删除,并且不可执行并且一切都_just_works。
就我而言,我想念以 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'...
当我在同一个 Django 应用程序目录中有一个 test.py 文件和一个 test/ 子目录时,我就发生了这种情况。我想无论我是在寻找测试模块(在 test.py 中)还是测试包(在 test/subdir 中),我都在混淆 python 或测试运行程序。
我知道我在这一点上迟到了,但我也遇到了麻烦
Found 0 test(s).
System check identified no issues (1 silenced).
----------------------------------------------------------------------
Ran 0 tests in 0.000s
OK
我已经遵循了所有步骤,但我仍然面临同样的问题。我的修复是我错过了测试目录中的 __init__.py
文件。添加文件并重新运行命令解决了我的问题。
强调一下:
确保您有 __init__.py
个文件
如果您尝试在主应用程序中运行测试,例如 my_app/my_app/ ,请确保您已检查以下内容:
应用程序名称列在 settings.py 中的 INSTALLED_APPS 中确保您的 DATABASES['default'] 在 settings.py 中设置正确 该应用程序有一个 models.py (即使您不使用,至少需要一个空的在那里)
使用此语法
python manage.py test
而不是 ./manage.py test
为我解决了这个问题。
请参阅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
我遇到了同样的问题,原来我将 __init__
保存为 python 文件,但它没有将 .py
放在其名称的末尾。我在文件名的末尾添加了 .py
。后来就好了
(换句话说,我创建了 __init__
而不是 __init__.py
)
在同一个文件中,我有两个具有相同名称的测试类,当然这会阻止所有测试运行。
我在我的测试类中创建了一个名为 run
的方法,结果证明这是一个非常糟糕的主意。 Python 可以看到我想运行测试,但无法运行。这个问题略有不同,但结果是一样的——它看起来好像找不到测试。
请注意,显示了以下消息: You want to run the existing test: <unittest.runner.TextTestResult run=0 errors=0 failures=0>
运行 --help
并查找详细信息。把它调到最大。
我运行 manage.py test --verbose
并在顶部找到了这个调试输出:
>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
修复了它。
有同样的问题,这是因为我的文件名中有一个 -
字符。我的文件名是 route-tests.py
并将其更改为 route_tests.py
如果您在升级到 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
即可使其再次工作。
Django 引擎搜索带有 test_
前缀的文件和文件夹(在 tests
文件夹内)。就我而言,这是一个简单的解决方案。
因此,请务必签出以它开头的文件/文件夹名称。
我有同样的问题,它是由项目根目录的 init.py 引起的 - 删除它,所有测试再次运行良好。
这已经晚了。但您可以在导入模型前简单地添加您的应用名称。喜欢
from myapp.models import something
这对我有用。
在 Django 中,测试类中的方法必须以“test”关键字开头。例如 test_is_true()。像 is_true() 这样的方法名称将不会执行。
test*.py
这就是 django 选择测试套件文件的方式。 django doc