标签: nose

如何在Pylons中使用Nose运行单个测试

我有一个Pylons 1.0应用程序,在测试/功能目录中有一堆测试.我得到了奇怪的测试结果,我想只运行一次测试.鼻子文档说我应该能够在命令行传递测试名称,但无论我做什么,我都会得到ImportErrors

例如:

nosetests -x -s sometestname
Run Code Online (Sandbox Code Playgroud)

得到:

Traceback (most recent call last):
  File "/home/ben/.virtualenvs/tsq/lib/python2.6/site-packages/nose-0.11.4-py2.6.egg/nose/loader.py", line 371, in loadTestsFromName
   module = resolve_name(addr.module)
  File "/home/ben/.virtualenvs/tsq/lib/python2.6/site-packages/nose-0.11.4-py2.6.egg/nose/util.py", line 334, in resolve_name
   module = __import__('.'.join(parts_copy))
ImportError: No module named sometestname
Run Code Online (Sandbox Code Playgroud)

我得到了同样的错误

nosetests -x -s appname.tests.functional.testcontroller
Run Code Online (Sandbox Code Playgroud)

什么是正确的语法?

testing pylons nose nosetests

149
推荐指数
2
解决办法
6万
查看次数

Python鼻子导入错误

我似乎无法使用鼻子测试框架来识别文件结构中测试脚本下面的模块.我已经设置了一个最简单的例子来演示这个问题.我将在下面解释.

这是包文件结构:

./__init__.py
./foo.py
./tests
   ./__init__.py
   ./test_foo.py
Run Code Online (Sandbox Code Playgroud)

foo.py包含:

def dumb_true():
    return True
Run Code Online (Sandbox Code Playgroud)

tests/test_foo.py包含:

import foo

def test_foo():
    assert foo.dumb_true()
Run Code Online (Sandbox Code Playgroud)

两个init .py文件都是空的

如果我nosetests -vv在主目录(foo.py所在)中运行,我得到:

Failure: ImportError (No module named foo) ... ERROR

======================================================================
ERROR: Failure: ImportError (No module named foo)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/usr/lib/python/site-packages/nose-0.11.1-py2.6.egg/nose/loader.py", line 379, in loadTestsFromName
    addr.filename, addr.module)
  File "/usr/lib/python/site-packages/nose-0.11.1-py2.6.egg/nose/importer.py", line 39, in importFromPath
    return self.importFromDir(dir_path, fqname)
  File "/usr/lib/python/site-packages/nose-0.11.1-py2.6.egg/nose/importer.py", line 86, in importFromDir
    mod = load_module(part_fqname, fh, filename, desc)
  File …
Run Code Online (Sandbox Code Playgroud)

python nose python-import

117
推荐指数
4
解决办法
5万
查看次数

使用nosetests设置断点--pdb选项

nosetests --pdb让我停止错误或失败,但这对我的需求来说已经太迟了.在执行期间单步执行代码可帮助我调试问题所在.

但是,nosetests是有用的,因为它们允许依赖于相对导入的测试(即在包中进行测试).

如何在执行测试之前设置断点?目前我正在使用:

python -m pdb /path/to/my/nosetests testfile.py
Run Code Online (Sandbox Code Playgroud)

这种解决方案是不够的.Nosetests干扰pdb输出,我的键盘控制(例如箭头键)被破坏.

使用import pdb; pdb.set_trace()似乎是一个好主意,但是nosetests阻止了我对pdb控制台的访问.

python testing nose pdb

82
推荐指数
3
解决办法
2万
查看次数

鼻子vs pytest - 应该让我选择的(主观)差异是什么?

我已经开始研究一个相当大的(多线程)Python项目,其中包含大量(单元)测试.最重要的问题是运行应用程序需要预设环境,该环境由上下文管理器实现.到目前为止,我们使用了单元测试运行器的修补版本,它将在此管理器中运行测试,但这不允许在不同测试模块之间切换上下文.

鼻子和pytest都支持这样的东西,因为它们支持许多粒度的固定装置,所以我们正在考虑切换到鼻子或pytest.这两个库都支持"标记"测试并仅运行这些标记的子集,这也是我们也想做的事情.

我一直在仔细查看nose和pytest的文档,据我所知,这些库中较大的部分基本上支持相同的功能,除了它可能命名不同,或者需要稍微不同的语法.另外,我注意到可用插件的一些小差异(鼻子有多进程支持,例如pytest似乎没有)

所以看起来,魔鬼在细节上,这意味着(通常至少)个人品味,我们最好选择最适合我们个人品味的图书馆.

所以我要问一个主观的论证,为什么我应该选择鼻子或pytest来选择最适合我们需要的图书馆/社区组合.

python nose pytest

80
推荐指数
1
解决办法
3万
查看次数

如何从"python setup.py test"运行unittest发现?

我正在试图找出如何python setup.py test运行等效的python -m unittest discover.我不想使用run_tests.py脚本,我不想使用任何外部测试工具(如nosepy.test).如果解决方案仅适用于python 2.7,那就没问题.

setup.py,我想我需要在配置中的test_suite和/或test_loader字段中添加一些东西,但我似乎无法找到一个正常工作的组合:

config = {
    'name': name,
    'version': version,
    'url': url,
    'test_suite': '???',
    'test_loader': '???',
}
Run Code Online (Sandbox Code Playgroud)

这可能只使用unittest内置于python 2.7?

仅供参考,我的项目结构如下:

project/
  package/
    __init__.py
    module.py
  tests/
    __init__.py
    test_module.py
  run_tests.py <- I want to delete this
  setup.py
Run Code Online (Sandbox Code Playgroud)

更新:这是可能的,unittest2但我想找到相同的东西只使用unittest

来自https://pypi.python.org/pypi/unittest2

unittest2包括一个非常基本的setuptools兼容的测试收集器.在setup.py中指定test_suite ='unittest2.collector'.这将使用包含setup.py的目录中的默认参数启动测试发现,因此它可能是最有用的示例(请参阅unittest2/collector.py).

现在,我只是使用一个名为的脚本run_tests.py,但我希望通过转向仅使用的解决方案来摆脱这个问题python setup.py test.

这是run_tests.py我希望删除的:

import unittest

if __name__ == …
Run Code Online (Sandbox Code Playgroud)

python unit-testing nose pytest unittest2

72
推荐指数
4
解决办法
5万
查看次数

Python使用nose导入测试 - 对于当前包上面的模块导入,最佳做法是什么

这是一个经常以不同形式提出的问题,并经常得到"大声笑你没有做好"的回答.很确定这是因为人们(包括我)有一个常识场景试图用作实现,解决方案并不明显(如果你之前没有这样做过).

会接受一个"让飞出瓶子"的答案.

特定

project/
    __init__.py
    /code
        __init__.py
        sut.py
    /tests
        __init__.py
        test_sut.py
Run Code Online (Sandbox Code Playgroud)

tests_sut.py开始的位置:

import code.sut
Run Code Online (Sandbox Code Playgroud)

在根目录中运行nosetests会导致:

ImportError: No module named code.sut
Run Code Online (Sandbox Code Playgroud)

旅行途径:

a)做亲戚使用

from ..code import sut
Run Code Online (Sandbox Code Playgroud)

b)将项目的根添加到PYTHONPATH

c)使用

sys.path.append
Run Code Online (Sandbox Code Playgroud)

在每个测试模块的开头导入之前添加..路径.

d)只记得做一个

setup.py 
Run Code Online (Sandbox Code Playgroud)

在项目上,在运行测试之前将模块安装到站点包中.


因此,要求是在测试包根目录下面有可以访问项目的测试.上面的每一个对我来说都不觉得"自然",已经证明有问题或者看起来太辛苦了!

在java中这是有效的,但基本上是通过构建工具/ IDE将所有类放在类路径上.也许问题是我期待Python的"魔力"?在Flask webframework测试中已经注意到,选项d)似乎是首选.

在任何情况下,下面的陈述推荐一个首选的解决方案将消除我自己的"不自然"的感觉.

python testing nose python-import

64
推荐指数
3
解决办法
2万
查看次数

如何在鼻子中设置self.maxDiff以获得完整的diff输出?

当使用带有Python 3.3.0的nose 1.2.1时,我有时会得到类似于下面的错误消息

======================================================================
FAIL: maxdiff2.test_equal
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/usr/local/lib/python3.3/site-packages/nose/case.py", line 198, in runTest
    self.test(*self.arg)
  File "/Users/loic/cmrsj/Calculus_II/scrap/maxdiff2.py", line 32, in test_equal
    assert_equal(str1, str2)
AssertionError: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec a
diam lectus.\n [truncated]... != 'Suspendisse lectus leo, consectetur in tempor sit
amet, placerat quis neque.\nE [truncated]...
Diff is 1780 characters long. Set self.maxDiff to None to see it.

----------------------------------------------------------------------
Ran 1 test in 0.064s

FAILED (failures=1)
Run Code Online (Sandbox Code Playgroud)

在许多情况下,为了弄清楚错误究竟是什么,我需要看到完整的diff输出.但是,我不知道如何设置它self.maxDiff.谷歌搜索鼻子和maxDiff没有帮助.在Python 2.7.1上使用相同版本的nose,将完整差异打印到屏幕上.

这是一个简单的脚本,在运行时生成上面的错误nosetests-3.3 …

python nose

63
推荐指数
4
解决办法
2万
查看次数

获取Python的unittest会导致tearDown()方法

是否有可能在tearDown()方法中获得测试结果(即是否所有断言都已通过)?我正在运行Selenium脚本,我想从tearDown()内部做一些报告,但我不知道这是否可行.

python unit-testing nose

62
推荐指数
6
解决办法
3万
查看次数

使用补丁模拟两个函数进行单元测试

我有一个函数我要单元测试包含调用其他两个函数.我不确定如何使用补丁同时模拟两个函数.我在下面提供了一个我的意思的例子.当我运行测试时,测试通过,但我觉得必须有一个更清洁的方法来做到这一点,我真的不明白有关f.close()的部分...

目录结构如下所示:

program/
  program/
    data.py
  tests/
    data_test.py
Run Code Online (Sandbox Code Playgroud)

data.py:

import cPickle

def write_out(file_path, data):
    f = open(file_path, 'wb')
    cPickle.dump(data, f)
    f.close()
Run Code Online (Sandbox Code Playgroud)

data_test.py:

from mock import MagicMock, patch

def test_write_out():
    path = '~/collection'
    mock_open = MagicMock()
    mock_pickle = MagicMock()
    f_mock = MagicMock()
    with patch('__builtin__.open', mock_open):
        f = mock_open.return_value
        f.method.return_value = path
        with patch('cPickle.dump', mock_pickle):
            write_out(path, 'data')
            mock_open.assert_called_once_with('~/collection', 'wb')
            f.close.assert_any_call()
            mock_pickle.assert_called_once_with('data', f)
Run Code Online (Sandbox Code Playgroud)

结果:

$ nosetests
.
----------------------------------------------------------------------
Ran 1 test in 0.008s
OK
Run Code Online (Sandbox Code Playgroud)

python testing unit-testing mocking nose

59
推荐指数
3
解决办法
5万
查看次数

在鼻子下测试Python代码时,我应该如何验证日志消息?

我正在尝试编写一个简单的单元测试,它将验证在某种情况下,我的应用程序中的类将通过标准日志记录API记录错误.我无法弄清楚测试这种情况最干净的方法是什么.

我知道鼻子已经通过它的日志插件捕获日志记录输出,但这似乎是作为失败测试的报告和调试帮助.

我能看到的两种方法是:

  • 模拟记录模块,以零散的方式(mymodule.logging = mockloggingmodule)或使用适当的模拟库.
  • 编写或使用现有的鼻插件来捕获输出并进行验证.

如果我采用前一种方法,我想知道将模拟出日志模块之前将全局状态重置为最简洁的方法.

期待您的提示和技巧......

python unit-testing mocking nose

57
推荐指数
6
解决办法
3万
查看次数