为什么鼻子测试没有捕捉到我想要的东西?

时间:2012-03-07 04:37:25

标签: python nose

我正在使用learn python the hard way 2nd edition来自学编程。在exercise 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. 的点子
  3. http://pypi.python.org/pypi/distribute分发
  4. 来自http://pypi.python.org/pypi/nose/
  5. 的鼻子 来自http://pypi.python.org/pypi/virtualenv
  6. 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:import NAME

    然后他解释说“这是关于单元测试的好处,因为它们捕获了这些错误(zeds错误显然是因为他没有重命名导入NAME来导入foobar)

    所以我在运行nosetests时没有得到错误(即使我没有将NAME重命名为foobar)以使其进一步复杂化zed说,nosetests应该只从父目录运行,即骨架或foobar,而不是像NAME这样的孩子...但是当我从名字

    运行nosetest时
    drewvcomp/project/foobar/name: >>> nosetests 
    

    它运行得很好。

    所以在仔细阅读了鼻子测试并且没有真正看到我应该想出来解决这个问题后,我只是删除了我的整个项目文件夹

    rm -rf项目

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

    下面的建议让我觉得可能正在通过python检查项目(以及其中的所有内容?)。在这种情况下,当我在foobar中运行nosetests时,它是可以的,因为它能够导入名为NAME的模块(存在于原始骨架目录中)。

    所以:

      
        
          

    导入系统       sys.path中       ['','/ usr / local / lib / python2.7 / did-package','/ usr / local / lib / python2.7 / _dist-package / 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-dadload','/ usr / local / lib / python2.7 / did-package','/ usr / lib / python2.7 / record-package' ,'/ usr / lib / python2.7 / did-package / PIL','/ usr / lib / python2.7 / did-package / gst-10.10','/ usr / lib / python2.7 / dad -packages /gtk-2.0','/ usr / lib / pymodules / python2.7','/ usr / lib / python2.7 / did-package /ubuntu -sso-client','/ usr / lib / python2.7 / dist-packages / ubuntuone-client','/ usr / lib / python2.7 / dad-packages /ubuntuone-control -panel','/ usr / lib / python2.7 / dad -packages /ubuntuone-couch',' /usr/lib/python2.7/dist-packages/ubuntuone-installer','/ usr / lib / python2.7 / record-packages /ubuntuone-storage-protocol“,'/ var / src / Django-1.3.1 ','/ usr / lib / python2.7 / did-package','/ usr / lib / python2.7 / did-package / wx-1.8-gtk2-unicode']

        
      

    糟糕!我需要清理它!我真的不需要他们的其他原件和django(我应该在哪里安装?...)

    如果你能够阅读所有这些内容,如果你能在本章的第6步提供一些建议,我会永远爱你:

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

    并且通过建议我的意思是......因为

    setup install 
    

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

2 个答案:

答案 0 :(得分:0)

我认为这是正在发生的事情:

他试图教两件事。

  1. 具有文件__init__.py的目录可以作为模块导入 蟒。
  2. 使用单元测试会警告您错误,因此是一种很好的做法。
  3. 如果你经常做某事,你可能想要创建一个模板结构。
  4. 现在在他的例子中,他创建了一个这样的文件结构:

    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/
                ..
    

    现在他的unitests抱怨,因为他还没有更新他的import声明。因此它尝试导入NAME,但正如您所见,没有目录NAME包含__init__.py

    所以我想,在实际练习之后,您错过了将NAME重命名为somethingelse的步骤,这就是您以后无法重现的原因。


    <强>更新

    使用:

    import sys
    print sys.path
    

    import imp
    print imp.find_module("NAME")
    

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

答案 1 :(得分:0)

我认为到目前为止,问题的最后部分尚未得到答复:

  

如果你能够阅读所有这些内容,如果你能在本章的第6步提供一些建议,我会永远爱你:

     

使用setup.py安装并使用pip

卸载

stackoverflow上的另一个问题中有一个related answer。我认为你问题的答案最后会出现。我认为“使用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