python nosetests设置测试描述

时间:2014-06-17 17:54:08

标签: python nosetests

我正在python中创建测试(我必须)以使用如下所示的nosetests运行:

def my_verification_method(param):
    """ description """
    assert param>0, "something bad..."

def test_apps():
    """ make tests on the fly """
    param1 = 1
    my_verification_method.__doc__ = "test with param=%i" % param1
    yield my_verification_method, param1
    param1 = 2
    my_verification_method.__doc__ = "test with param=%i" % param1
    yield my_verification_method, param1

问题在于鼻子打印:

make tests on the fly ... ok
make tests on the fly ... ok

这不是我想要的。我希望测试的输出说:

test with param=1 ... ok
test with param=2 ... ok

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

以下是如何做你想要的,但它会绕过yield测试生成。从本质上讲,您使用下面的unittest.TestCase方法即时填空populate()

from unittest import TestCase

from nose.tools import istest


def my_verification_method(param):
    """ description """
    print "this is param=", param
    assert param > 0, "something bad..."


def method_name(param):
    """ this is how you name the tests from param values """
    return "test_with_param(%i)" % param


def doc_name(param):
    """ this is how you generate doc strings from param values """
    return "test with param=%i" % param


def _create(param):
    """ Helper method to make functions on the fly """

    @istest
    def func_name(self):
        my_verification_method(param)

    return func_name


def populate(cls, params):
    """ Helper method that injects tests to the TestCase class """

    for param in params:
        _method = _create(param)
        _method.__name__ = method_name(param)
        _method.__doc__ = doc_name(param)
        setattr(cls, _method.__name__, _method)


class AppsTest(TestCase):
    """ TestCase Container """

    pass

test_params = [-1, 1, 2]
populate(AppsTest, test_params)

你应该得到:

$ nosetests doc_test.py -v
test with param=-1 ... FAIL
test with param=1 ... ok
test with param=2 ... ok

您需要更改方法名称和文档字符串才能正确填充您的班级。

编辑:func_name应该有self作为参数,因为它现在是一个类方法。