почему тесты носа не ловят то, что я хочу? - PullRequest
0 голосов
/ 07 марта 2012

Я использую трудный путь изучения 2-го издания , чтобы научиться программировать. В упражнении 46 было дано указание сделать несколько вещей:

$ mkdir -p projects 
$ cd projects/
$ mkdir skeleton
$ cd skeleton
$ mkdir bin NAME tests docs

$ touch NAME/__init__.py
$ touch tests/__init__.py

вот содержимое setup.py:

попробовать: из настройки импорта настроек setuptools кроме ImportError: из distutils.core настройки импорта

config = {
    'description': 'My Project',
    'author': 'My Name',
    'url': 'URL to get it at.',
    'download_url': 'Where to download it.',
    'author_email': 'My email.',
    'version': '0.1',
    'install_requires': ['nose'],
    'packages': ['NAME'],
    'scripts': [],
    'name': 'projectname'
}

setup(**config)

Тесты / NAME_tests.py:

from nose.tools import *
import NAME

def setup():
    print "SETUP!"

def teardown():
    print "TEAR DOWN!"

def test_basic():
    print "I RAN!"

Затем установите несколько пакетов:

  1. пункт от http://pypi.python.org/pypi/pip
  2. распространять с http://pypi.python.org/pypi/distribute
  3. нос от http://pypi.python.org/pypi/nose/
  4. virtualenv от http://pypi.python.org/pypi/virtualenv

Все это я делал без особой суеты (однажды я переключился с Windows на Ubuntu).

Зед (автор LPTHW) затем говорит, что вы можете проверить, правильно ли вы все сделали, выполнив следующее:

 drewverlee@ubuntu:~/projects/skeleton$ nosetests
.
----------------------------------------------------------------------
Ran 1 test in 0.020s

OK
drewverlee@ubuntu:~/projects/skeleton$ 

Замечательно!

Но здесь есть проблема. В классе удеми (онлайн-урок) он копирует скелет в тестовый проект (cp -r skelton foobar) и делает примерно ...

zedscomp/projects/foobar: >>> nosetests

и Зед получает ошибку, например:

ImportError: Нет модуля с именем NAME

тогда Зед идет ...

grep -r "NAME" .

(что ему дает)

. / Tests / foobar_tests.py: импортировать NAME

Затем он объясняет, что «Это замечательная вещь в модульных тестах, потому что они ловят эти ошибки (ошибка zeds, по-видимому, в том, что он не переименовал import NAME для импорта foobar)

, поэтому я не получил эту ошибку, когда запускал тесты носа (хотя я и не переименовал NAME в foobar), что еще больше усложняло его. Зед сказал, что тесты носа должны запускаться только из родительского каталога, то есть скелета или foobar, а не из ребенок, как ИМЯ ... но когда я запускаю тестирование носа от имени

drewvcomp/project/foobar/name: >>> nosetests 

работает нормально.

Итак, после прочтения большого количества тестов на нос и не видя, что я должен был выяснить, чтобы решить эту проблему, я просто удалил всю папку проекта, используя

rm -rf project

и восстановил его. Но не повезло, проблема сохраняется.

Предложение, приведенное ниже, заставило меня задуматься о том, что, возможно, проекты (и все, что в нем есть?) Проверяются Python. В этом случае, когда я запускал тесты носа в foobar, это было нормально, потому что он мог импортировать модуль с именем NAME (который существует в исходной директории скелета).

Итак:

import sys sys.path ['', '/usr/local/lib/python2.7/dist-packages', '/usr/local/lib/python2.7/dist-packages/projectname-0.1-py2.7.egg', '/ usr / lib / python2.7 ',' /usr/lib/python2.7/plat-linux2 ',' /usr/lib/python2.7/lib-tk ',' /usr/lib/python2.7/lib -old ',' /usr/lib/python2.7/lib-dynload ',' /usr/local/lib/python2.7/dist-packages ',' /usr/lib/python2.7/dist-packages ' , '/usr/lib/python2.7/dist-packages/PIL', '/usr/lib/python2.7/dist-packages/gst-0.10', '/usr/lib/python2.7/dist-packages /gtk-2.0 ',' /usr/lib/pymodules/python2.7 ',' /usr/lib/python2.7/dist-packages/ubuntu-sso-client ',' /usr/lib/python2.7/ dist-packages / ubuntuone-client ',' /usr/lib/python2.7/dist-packages/ubuntuone-control-panel ',' /usr/lib/python2.7/dist-packages/ubuntuone-couch ',' /usr/lib/python2.7/dist-packages/ubuntuone-installer ',' /usr/lib/python2.7/dist-packages/ubuntuone-storage-protocol ',' /var/src/Django-1.3.1 ',' /usr/lib/python2.7/dist-packages ',' /usr/lib/python2.7/dist-packages/wx-2.8-gtk2-unicode']

Хлоп! Я должен убрать это! Мне действительно не нужно много другого, кроме оригинала и django (где мне это установить? ...)

также, если вам удастся прочитать все это, я буду любить вас вечно, если бы вы могли дать совет на шаге 6 в этой главе:

  • установить с помощью setup.py и удалить с помощью pip

и под советом я имею в виду как ... потому что

setup install 

дает мне package.egg-info, и я понятия не имею, что это такое!

Ответы [ 2 ]

0 голосов
/ 31 июля 2012

Думаю, что последняя часть вопроса осталась без ответа:

также, если бы вам удалось прочитать все это, я бы полюбил вас навсегда, если бы вы могли дать совет на шаге 6 в этой главе:

установить с помощью setup.py и удалить с помощью pip

Существует связанный ответ в другом вопросе по stackoverflow. Я думаю, что ответ на ваш вопрос приходит в конце. Я думаю, что "установить с помощью setup.py" он имеет в виду:

python setup.py sdist

Затем, если ваш модуль назывался NAME, вы запускаете:

sudo pip install NAME-0.1.tar.gz   # or a similar filename in the /dist/ directory that is created

Чтобы удалить, запустите:

sudo pip uninstall NAME
0 голосов
/ 07 марта 2012

Я думаю, что это происходит:

Он пытается научить 2 вещам.

  1. Каталог с файлом с именем __init__.py можно импортировать как модуль в питон.
  2. Использование модульных тестов предупреждает вас об ошибках и поэтому является хорошей практикой.
  3. Если вы часто делаете что-то, возможно, вы захотите создать структуру шаблона.

Теперь в своем примере он создает такую ​​файловую структуру:

skeleton/
         bin/
             ..
         NAME/
              __init__.py
              .. 
         tests/
               __init__.py
               .. 
         docs/
               ..

Затем он копирует эту структуру шаблона, делая что-то вроде:

cp -r skeleton foobar

так что в итоге вы получите почти то же самое:

foobar/
       bin/
           ..
       NAME/
            __init__.py
            .. 
       tests/
             __init__.py
             .. 
       docs/
            ..

Теперь у вас все еще есть каталог с именем NAME с __init__.py, который можно импортировать в python. Так что ваши юнит-тесты не жалуются.

Теперь, судя по тому, что вы говорите, он не только скопировал скелет, но и переименовал NAME во что-то другое, потому что он хотел использовать клонированный скелет для нового проекта или чего-то еще. Так что у него, вероятно, было что-то похожее на:

foobar/
       bin/
           ..
       someothername/
            __init__.py
            .. 
       tests/
             __init__.py
             .. 
       docs/
            ..

Теперь его единомышленники жаловались, потому что он еще не обновил свое заявление import. И поэтому он попытался импортировать NAME, но, как вы видите, каталог NAME не содержит __init__.py.

Так что, думаю, после живого упражнения вы пропустили шаг, где он переименовал NAME в somethingelse, и поэтому вы не смогли воспроизвести его позже.


Обновление:

использование:

import sys
print sys.path

и

import imp
print imp.find_module("NAME")

чтобы посмотреть, где ваш код находит модуль "ИМЯ"

...