如何在使用nosetests时指定文件中的单个测试?

116

我有一个名为test_web.py的文件,包含一个名为TestWeb的类以及许多命名为test_something()的方法。

我可以这样运行类中的每个测试:

$ nosetests test_web.py 
...
======================================================================
FAIL: checkout test
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/Users/me/path/here/test_web.py", line 187, in test_checkout
...

但是我似乎无法运行单个测试,当我在相同的目录下运行这些测试时会收到“没有这样的测试”错误:

$ nosetests test_web.py:test_checkout
$ nosetests TestWeb:test_checkout

这里可能出了什么问题?


除非您能发布测试用例或SSCCE,否则我无法帮助您。我刚刚在我的机器上尝试了您使用的语法,并且它可以正常工作。 - Jeff Tratner
6个回答

174

您必须这样指定:nosetests <file>:<Test_Case>.<test_method>,或者

nosetests test_web.py:TestWeb.test_checkout

请查看文档


6
为什么图书馆使用“:”而不是“。”? ;) - omikron
3
也许是为了更容易区分模块和类之间的差别? - Chris
@omikron 当我指定文件时,我没有遇到任何导入错误。 - gabeio
2
哇,那真是太糟糕了,经典的 Python 库,根本不考虑现有接口。 - Dagrooms

21

您还可以指定一个模块:

nosetests tests.test_integration:IntegrationTests.test_user_search_returns_users

2
我不知道这是Python的不同版本还是nosetests的问题,但是那种语法会失败。可行的方法是使用:nosetests tests/test_integration:IntegrationTests.test_user_search_returns_users,意思是 - 引用文件作为文件,而不是Python模块,使用/而不是. - dwanderson
1
@dwanderson 两种用法都应该可以,参见http://nose.readthedocs.io/en/latest/usage.html#selecting-tests。你的失败可能是由于`tests`不在你的设置中而引起的? - michaeljoseph
1
啊,没错,我忘记在“tests”目录下放置一个__init__.py文件了。干得好!谢谢。 - dwanderson

11

像其他答案所建议的那样,在命令行上指定名称是有效且有用的。但是,当我正处于编写测试的过程中时,我经常发现我只想运行正在处理的测试,而我必须在命令行上写入的名称变得相当长并且难以写入。在这种情况下,我更喜欢使用自定义装饰器和标识。

我将"工作进行中装饰器"(wipd)定义为:

from nose.plugins.attrib import attr
def wipd(f):
    return attr('wip')(f)

这定义了一个装饰器@wipd,它将在修饰的对象上设置wip属性。例如:

import unittest
class Test(unittest.TestCase):

    @wipd
    def test_something(self):
        pass

然后在命令行中可以使用-a wip来缩小测试的执行范围,仅限于被标记为@wipd的测试。

关于名称的说明...

我使用名称@wipd代替@wip作为装饰器名称,以避免出现这种问题:

import unittest
class Test(unittest.TestCase):

    from mymodule import wip    
    @wip
    def test_something(self):
        pass

    def test_something_else(self):
        pass
import 会将 wip 装饰器作为类的成员,并选择类中的所有测试。 attrib 插件会检查测试方法所在的父类是否存在选择的属性,而由 attrib 创建和测试的属性不存在于隔离空间中。因此,如果您使用 -a foo 进行测试,并且您的类包含 foo = "platypus",则插件将选择类中的所有测试。

6

要运行多个特定的测试,只需将它们添加到命令行中,用空格分隔即可。

nosetests test_web.py:TestWeb.test_checkout test_web.py:TestWeb.test_another_checkout

1
在我的测试中,使用模块名称指定测试不起作用

您必须指定实际的.py路径:

nosetests /path/to/test/file.py:test_function

这是使用 nose==1.3.7 的代码段。


0

我的需求是在另一个windows目录中运行测试文件中的单个测试 - 可以通过以下方式从anaconda命令提示符进行:

从以下位置运行nosetests:

(base) C:\Users\ABC\Documents\work\

但是test_MyTestFile.pymethodsFile.py在以下位置:

 (base) C:\Users\ABC\Documents\work\daily\

通过以下方式使用带有引号的路径运行单个测试:

(base) C:\Users\ABC\Documents\work>nosetests "daily\\test_MyTestFile.py:MyTestClass.test_add_integers"

test_MyTestFile.py 的内容如下:

import methodsFile
import unittest

class MyTestClass(unittest.TestCase):

    def test_add_integers(self):
        assert methodsFile.add(5, 3) == 8

    def test_add_integers_zero(self):
        assert methodsFile.add(3, 0) == 3

methodsFile.py看起来像这样:

def add(num1, num2):
        return num1 + num2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接