14

現在のプロジェクトでDjango-noseを使用しようとしていますが、テストを実行するためにnoseを取得する方法がわかりません。そこで、鼻を知るために簡単なDjango1.4.1プロジェクトを開始しました。しかし、この単純なテストプロジェクトでも、実行することはできませんでした。

先に進む前に:Stackoverflowには、たとえば次のような同様の質問がたくさんあることを知っています。

テストがどこにあるかをDjango-noseに伝えるにはどうすればよいですか?

しかし、グーグルで調べた後、ブログの投稿とStackOverflowの回答を読んだ後でも、実行できませんでした。

テストプロジェクトの設定方法

  1. 仮想環境を作成します。
  2. pip install django django-nose nose
  3. でプロジェクトを作成しますdjango-admin.py startproject djangonosetest
  4. アプリを作成するmanage.py startapp testapp
  5. settings.pyを編集します。

    • ENGINEに設定django.db.backends.sqlite3
    • 追加django_nosetestappINSTALLED_APPS
    • を追加しましTEST_RUNNER = 'django_nose.NoseTestSuiteRunner'た。
  6. 走るmanage.py test

しかし、私が得たのはこの出力だけでした:

nosetests --verbosity 1
Creating test database for alias 'default'...

----------------------------------------------------------------------
Ran 0 tests in 0.000s

OK
Destroying test database for alias 'default'...

ただし、少なくともデフォルトのテストケースを実行する必要があります。

実行python manage.py test djangonosetest.testapp.tests:SimpleTestすると、テストが実行されます。しかし、私が持っているすべてのテストファイルに対してそれをしなければならなかったとしたら、それは少しやり過ぎのようです。しかし、それはテストを実行できることを証明しています。

私が実行したときmanage.py test -v 3(冗長レベルが高い)、これが表示されました:

nose.selector: INFO: /Users/Jens/Projects/Django/djangonosetest/djangonosetest/settings.py is executable; skipped
nose.selector: INFO: /Users/Jens/Projects/Django/djangonosetest/djangonosetest/settings.pyc is executable; skipped
nose.selector: INFO: /Users/Jens/Projects/Django/djangonosetest/djangonosetest/urls.py is executable; skipped
nose.selector: INFO: /Users/Jens/Projects/Django/djangonosetest/djangonosetest/wsgi.py is executable; skipped
nose.selector: INFO: /Users/Jens/Projects/Django/djangonosetest/djangonosetest/testapp/models.py is executable; skipped
nose.selector: INFO: /Users/Jens/Projects/Django/djangonosetest/djangonosetest/testapp/models.pyc is executable; skipped
nose.selector: INFO: /Users/Jens/Projects/Django/djangonosetest/djangonosetest/testapp/views.py is executable; skipped
nose.selector: INFO: /Users/Jens/Projects/Django/djangonosetest/djangonosetest/testapp/tests.py is executable; skipped
nose.selector: INFO: /Users/Jens/Projects/Django/djangonosetest/djangonosetest/testapp/tests.pyc is executable; skipped
nose.selector: INFO: /Users/Jens/Projects/Django/djangonosetest/manage.py is executable; skipped

鼻は間違いなく私のtests.pyを見つけますが、何らかの理由でそれをスキップしています。

フォルダ構造

djangonosetest/
    djangonosetest/
        __init__.py
        settings.py
        testapp/
            __init__.py
            models.py
            tests.py
            views.py
        urls.py
        wsgi.py
    manage.py

settings.py

DEBUG = True
TEMPLATE_DEBUG = DEBUG

ADMINS = (
    # ('Your Name', 'your_email@example.com'),
)

MANAGERS = ADMINS

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
        'NAME': '',                      # Or path to database file if using sqlite3.
        'USER': '',                      # Not used with sqlite3.
        'PASSWORD': '',                  # Not used with sqlite3.
        'HOST': '',                      # Set to empty string for localhost. Not used with sqlite3.
        'PORT': '',                      # Set to empty string for default. Not used with sqlite3.
    }
}

# Local time zone for this installation. Choices can be found here:
# http://en.wikipedia.org/wiki/List_of_tz_zones_by_name
# although not all choices may be available on all operating systems.
# In a Windows environment this must be set to your system time zone.
TIME_ZONE = 'America/Chicago'

# Language code for this installation. All choices can be found here:
# http://www.i18nguy.com/unicode/language-identifiers.html
LANGUAGE_CODE = 'en-us'

SITE_ID = 1

# If you set this to False, Django will make some optimizations so as not
# to load the internationalization machinery.
USE_I18N = True

# If you set this to False, Django will not format dates, numbers and
# calendars according to the current locale.
USE_L10N = True

# If you set this to False, Django will not use timezone-aware datetimes.
USE_TZ = True

# Absolute filesystem path to the directory that will hold user-uploaded files.
# Example: "/home/media/media.lawrence.com/media/"
MEDIA_ROOT = ''

# URL that handles the media served from MEDIA_ROOT. Make sure to use a
# trailing slash.
# Examples: "http://media.lawrence.com/media/", "http://example.com/media/"
MEDIA_URL = ''

# Absolute path to the directory static files should be collected too.
# Don't put anything in this directory yourself; store your static files
# in apps' "static/" subdirectories and in STATICFILES_DIRS.
# Example: "/home/media/media.lawrence.com/static/"
STATIC_ROOT = ''

# URL prefix for static files.
# Example: "http://media.lawrence.com/static/"
STATIC_URL = '/static/'

# Additional locations of static files
STATICFILES_DIRS = (
    # Put strings here, like "/home/html/static" or "C:/www/django/static".
    # Always use forward slashes, even on Windows.
    # Don't forget to use absolute paths, not relative paths.
)

# List of finder classes that know how to find static files in
# various locations.
STATICFILES_FINDERS = (
    'django.contrib.staticfiles.finders.FileSystemFinder',
    'django.contrib.staticfiles.finders.AppDirectoriesFinder',
#    'django.contrib.staticfiles.finders.DefaultStorageFinder',
)

# Make this unique and don't share it with anybody.
SECRET_KEY = 'ikh^t)49eincyww4@nq(o)go_129zdr87*im00m^+h@_n!w4ec'

# List of callables that know how to import templates from various sources.
TEMPLATE_LOADERS = (
    'django.template.loaders.filesystem.Loader',
    'django.template.loaders.app_directories.Loader',
#     'django.template.loaders.eggs.Loader',
)

MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    # Uncomment the next line for simple clickjacking protection:
    # 'django.middleware.clickjacking.XFrameOptionsMiddleware',
)

ROOT_URLCONF = 'djangonosetest.urls'

# Python dotted path to the WSGI application used by Django's runserver.
WSGI_APPLICATION = 'djangonosetest.wsgi.application'

TEMPLATE_DIRS = (
    # Put strings here, like "/home/html/django_templates" or "C:/www/django/templates".
    # Always use forward slashes, even on Windows.
    # Don't forget to use absolute paths, not relative paths.
)

INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    # Uncomment the next line to enable the admin:
    # 'django.contrib.admin',
    # Uncomment the next line to enable admin documentation:
    # 'django.contrib.admindocs',
    'django_nose',
    'djangonosetest.testapp',
)

# A sample logging configuration. The only tangible logging
# performed by this configuration is to send an email to
# the site admins on every HTTP 500 error when DEBUG=False.
# See http://docs.djangoproject.com/en/dev/topics/logging for
# more details on how to customize your logging configuration.
LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'filters': {
        'require_debug_false': {
            '()': 'django.utils.log.RequireDebugFalse'
        }
    },
    'handlers': {
        'mail_admins': {
            'level': 'ERROR',
            'filters': ['require_debug_false'],
            'class': 'django.utils.log.AdminEmailHandler'
        }
    },
    'loggers': {
        'django.request': {
            'handlers': ['mail_admins'],
            'level': 'ERROR',
            'propagate': True,
        },
    }
}

TEST_RUNNER = 'django_nose.NoseTestSuiteRunner'

テストコード

テストコードは、Djangoが作成するデフォルトのTestCaseです。

"""
This file demonstrates writing tests using the unit test module. These will pass
when you run "manage.py test".

Replace this with more appropriate tests for your application.
"""

from Django.test import TestCase


class SimpleTest(TestCase):
    def test_basic_addition(self):
        """
        Tests that 1 + 1 always equals 2.
        """
        self.assertEqual(1 + 1, 2)

では、Django-nose / noseにテストの場所をどのように伝えるのですか?

アップデート

興味深いGoogleグループの投稿とその件に関するStackoverflowの回答が見つかった場合:

どちらも、noseが実行可能ファイルをスキップするという事実に要約されます。そういうわけで私は得るtests.py is executable; skipped。問題は、ファイルが実行可能ではないことです。

----------+ 1 Jens  staff  383 13 Okt 00:01 tests.py

ux、gx、oxでも試してみましたが、とにかく鼻が飛んでしまいました。これはバグだと感じます。ファイルはノーズにあり、実行可能ではありませんが、スキップされます。

回避策は、-exeスイッチを使用することです。実行manage.py test --exeするとテストが実行されます。他の回避策よりは優れていますが、その解決策に完全に満足しているわけではありません。

4

2 に答える 2

3

今日も同じ問題があり、修正しました。

試す:

chmod a-x djangonosetest/djangonosetest/testapp/*.py
于 2013-07-19T09:43:12.673 に答える
1

Django 1.4 では、プロジェクト ルートを指定しない場合、インストールされたアプリでプロジェクトを指定する必要があるのではないかと思います。ただの代わりに'testapp'、試してみてください'djangonosetest.testapp'

https://docs.djangoproject.com/en/dev/ref/settings/#std:setting-INSTALLED_APPS例を参照してください。

于 2012-10-12T23:07:38.223 に答える