繁体   English   中英

为什么鼻子测试不能抓住我想要的东西?

[英]why isn't nosetests catching what i want it to?

我正在使用学习python困难的方法第二版来教自己编程。 练习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. 来自http://pypi.python.org/pypi/virtualenv的 virtualenv

我所做的所有事情都没有大惊小怪(一旦我从Windows切换到Ubuntu)。

Zed(LPTHW的作者)然后说,您可以通过执行以下操作来测试您是否做对了所有事情:

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

OK
drewverlee@ubuntu:~/projects/skeleton$ 

精彩!

但这是问题所在。 在udemy类(在线教程类)中,他将骨架复制到测试项目中(cp -r skelton foobar),并且他的操作大致...

zedscomp/projects/foobar: >>> nosetests

和zed出现类似以下错误:

ImportError:没有名为NAME的模块

所以zed去了...

grep -r "NAME" .

(这给了他)

./tests/foobar_tests.py:导入名称

然后,他解释说:“这对单元测试来说是很棒的事情,因为它们捕获了这些错误(zeds错误显然是因为他没有重命名import NAME来导入foobar)

因此,当我运行鼻子测试时(即使我也没有将NAME重命名为foobar)使它进一步复杂化时,我也没有收到该错误。 NAME ...但是当我从名字跑鼻子

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

它运行得很好。

因此,在阅读了很多关于鼻子测试的内容之后,并没有真正看到我应该解决的问题,我只是使用删除了整个项目文件夹

rm -rf项目

并重建它。 但是没有运气,问题仍然存在。

下面的建议使我认为也许项目(以及其中的所有内容?)正在由python检查。 在这种情况下,当我在foobar中运行鼻子测试时就可以了,因为它能够导入名为NAME的模块(该模块存在于原始骨骼目录中)。

所以:

导入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”]

kes! 我需要清理! 除了原始的和django之外,我真的不需要太多其他东西了(我应该在哪里安装?...)

另外,如果您希望阅读所有这些内容,那么如果您可以在本章的第6步中提供一些建议,我将永远爱您:

  • 使用setup.py安装并使用pip卸载

通过建议,我的意思是……

setup install 

给我一个package.egg-info,我不知道那是什么!

我认为到目前为止,问题的最后一部分尚未得到解决:

另外,如果您希望阅读所有这些内容,那么如果您可以在本章的第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

我认为这是怎么回事:

他试图教两件事。

  1. 文件名为__init__.py目录可以作为python中的模块导入。
  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

所以我想,继现场练习中,你错过了一步,他改名NAMEsomethingelse ,这就是为什么你不能以后重现。


更新:

采用:

import sys
print sys.path

import imp
print imp.find_module("NAME")

看看您的代码在哪里找到模块“ NAME”

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM