我是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')
Run Code Online (Sandbox Code Playgroud)
我已经通过继承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',
)
Run Code Online (Sandbox Code Playgroud)
为了让测试运行,我正在运行 manage.py test pyDietTracker
Edu*_*rdo 146
我有同样的问题,但我的问题不同.
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'
Run Code Online (Sandbox Code Playgroud)
另外,与你的测试文件必须先从test关键字.
Dav*_*Lam 61
如果您正在使用yourapp/tests包/样式进行单元测试,请确保其中有一个__init__.py(因为这就是使其成为Python模块的原因!).
cod*_*thm 22
我可以为特定应用程序运行测试,例如
python project/manage.py test app_name
Run Code Online (Sandbox Code Playgroud)
但是当我跑
python project/manage.py test
Run Code Online (Sandbox Code Playgroud)
发现了0个测试
弄清楚我需要在manage.py所在的目录中运行它
所以解决方案是,cd到项目目录并运行
python manage.py test
Run Code Online (Sandbox Code Playgroud)
小智 11
解决了这个问题.
事实证明我已经完成django-admin.py startproject pyDietTracker但没有python manage.py startapp myApp.返回并执行此操作后,它确实按照记录的方式工作.看起来我有很多东西要学习阅读以及Django中的网站和应用程序之间的区别.
谢谢你的帮助S.Lott和EmilStenström.我希望我能接受你的答案,因为他们都得到了很多帮助.
最重要的课程测试仅适用于应用程序级别而非网站级别
Fli*_*imm 11
在我的情况下,我输入def而不是class.代替
class TestDisplayWeight(TestCase): # correct!
Run Code Online (Sandbox Code Playgroud)
我有
def TestDisplayWeight(TestCase): # wrong!
Run Code Online (Sandbox Code Playgroud)
当您使用tests模块而不是模块时,也可能发生这种情况tests.py.在这种情况下,您需要将所有测试类导入到__init__.py测试模块中,例如
tests/
__init__.py
somemodule.py
Run Code Online (Sandbox Code Playgroud)
在你的__init__.py,你现在需要导入somemodule这样的:
from .somemodule import *
Run Code Online (Sandbox Code Playgroud)
我知道我现在迟到了,但我也遇到了麻烦
Found 0 test(s).
System check identified no issues (1 silenced).
----------------------------------------------------------------------
Ran 0 tests in 0.000s
OK
Run Code Online (Sandbox Code Playgroud)
我已按照所有步骤进行操作,但仍然面临同样的问题。我的修复是我错过了__init__.py测试目录中的文件。添加文件并重新运行命令解决了我的问题。
稍微强调一下:
确保您有__init__.py文件
就我而言,应用文件夹本身缺少__init__.py。这将导致测试将运行的行为,python manage.py test project.app_name但不会运行python manage.py test。
project/
app_name/
__init__.py # this was missing
Run Code Online (Sandbox Code Playgroud)
这是我刚刚遇到的另一个问题:检查您的测试文件是否不可执行。我的虚拟机将它们自动挂载为可执行文件,因此测试发现完全错过了它们。__init__.py在有人告诉我问题是什么作为解决方法之前,我不得不将它们添加到相关文件中,但现在它们已被删除,并且不可执行且一切正常。
小智 5
就我而言,我想念以test_开始我的函数名称, 并在运行我的测试时使用:
python manage.py test myapp
Run Code Online (Sandbox Code Playgroud)
结果是:
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'...
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
之后的结果是:
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'...
Run Code Online (Sandbox Code Playgroud)