用nosetests运行Django测试

mil*_*los 9 python django nose django-nose

我的python应用程序测试是在远程服务器上使用命令执行的nosetests.我无法修改测试的启动方式,也无法为其添加选项.我有测试的Django应用程序,但测试不正常.

我的项目结构:

project
??? README.md
??? setup.py
??? mysite
?   ??? blog
?   ?   ??? __init__.py
?   ?   ??? models.py
?   ?   ??? tests.py
|   |   ??? ...
?   ??? db.sqlite3
?   ??? manage.py
?   ??? mysite
?   ?   ??? __init__.py
?   ?   ??? settings.py
|   |   ??? ...
Run Code Online (Sandbox Code Playgroud)

命令nosetestsproject目录中执行.我想要正确运行tests.py哪个有2个Django测试用例.我尝试tests在项目根目录中创建目录并使用以下方法调用测试DiscoverRunner:

os.environ['DJANGO_SETTINGS_MODULE'] = 'mysite.settings'
test_dir = os.path.dirname(os.path.dirname(__file__)) # one level up
sys.path.insert(0, os.path.join(test_dir, 'mysite'))

class ServerTest(unittest.TestCase):
    def test_runtests(self):
        django.setup()
        self.test_runner = DiscoverRunner(verbosity=1, interactive=True, failfast=False)
        failures = self.test_runner.run_tests(['mysite'])
        self.assertEqual(failures, 0)
Run Code Online (Sandbox Code Playgroud)

它的工作原理但问题是所有测试都被视为单个测试,并且服务器会生成错误的报告.

另一个解决方案:如果我添加空__init__.pyproject/mysite鼻子发现,tests.py但测试失败,因为'Apps are not loaded yet'这可能意味着我必须提前调用django.setup(),但我不知道如何做到这一点.我找到了一个鼻子插件,但是我不能在远程机器上安装插件或更改选项.

任何想法如何使我的任何方法解决问题?

Joh*_*fis 6

首先,django-nose如果你还没有这样做,你应该安装和配置:

pip install django-nose
Run Code Online (Sandbox Code Playgroud)

然后将其添加到您的INSTALLED_APPS:

INSTALLED_APPS = (
    ...
    'django_nose'
)

TEST_RUNNER = 'django_nose.NoseTestSuiteRunner'  
Run Code Online (Sandbox Code Playgroud)

现在,nosetests要使命令正确运行,您可以创建一个tests使用以下结构命名的文件夹:

project
??? mysite
?   ??? blog
?   ?   ??? __init__.py
?   ?   ??? models.py
|   |   ??? ...
?   ??? mysite
?   ?   ??? __init__.py
?   ?   ??? settings.py
|   |   ??? ...
?   ??? tests
?   ?   ??? __init__.py
?   ?   ??? test_a_whole_class_of_methods.py  
?   ?   ??? test_a_whole_view.py  
?   ?   ??? test_one_of_my_methods.py
?   ?   ??? test_another_one_of_my_methods.py  
|   |   ??? ...
?   ??? db.sqlite3
?   ??? manage.py
??? README.md
??? setup.py
Run Code Online (Sandbox Code Playgroud)

不要忘记__init__.py文件tests夹内的文件!

现在,当您nosetests从项目的根目录运行时,它将运行该tests文件夹中的每个测试:

~ $ cd path/to/project
path/to/project $ nosetests
Run Code Online (Sandbox Code Playgroud)