这是一个后续行动 前一个问题 矿井。

在前一个问题,方法是探讨实施基本上是相同的测试整个家庭的功能,确保试验并没有停留在的第一个功能失败。

我的首选解决方案使用的一元类动态插入测试纳入一个单元测试.测试用例.不幸的是,鼻子没有选择这是因为静态的鼻子扫描的测试案例。

我怎么得到的鼻子发现和运行这样的测试用例?请参阅 在这里, 对于一个例子测试用例中的问题。

有帮助吗?

解决方案

鼻子上有一个"测试发电机"的特征对于这样的东西。你写的一个发电机的功能,产量每一个"测试的情况下"的功能,你想让它运行,以及其args.按照你以前的例子中,这可以检查各职能在一个独立的试验:

import unittest
import numpy

from somewhere import the_functions

def test_matrix_functions():
    for function in the_functions:
        yield check_matrix_function, function

def check_matrix_function(function)
    matrix1 = numpy.ones((5,10))
    matrix2 = numpy.identity(5)
    output = function(matrix1, matrix2)
    assert matrix1.shape == output.shape, \
           "%s produces output of the wrong shape" % str(function)

其他提示

鼻子不能扫描测试静态的,所以你 可以 利用元类魔法使测试的鼻子发现。

最难的部分是,标准元类技术不设置func_name属性是否正确,这是我的鼻子看起来时,检查方法是否在你的类别测试。

这里有一个简单元类.它看起来通过的func字典,并增加了一个新的方法为每一个方法,它认为,声称方法,发现有文档字符串.这些新的合成方法的名称 "test_%d" %i.

import new
from inspect import isfunction, getdoc

class Meta(type):
    def __new__(cls, name, bases, dct):

        newdct = dct.copy()
        for i, (k, v) in enumerate(filter(lambda e: isfunction(e[1]), dct.items())):
            def m(self, func):
                assert getdoc(func) is not None

            fname = 'test_%d' % i
            newdct[fname] = new.function(m.func_code, globals(), fname,
                (v,), m.func_closure)

        return super(Meta, cls).__new__(cls, 'Test_'+name, bases, newdct)

现在,让我们创建一个新的类使用这元类

class Foo(object):
    __metaclass__ = Meta

    def greeter(self):
        "sdf"
        print 'Hello World'

    def greeter_no_docstring(self):
        pass

在运行时, Foo 实际上将被命名为 Test_Foo 并将 greeter, greeter_no_docstring, test_1test_2 作为其方法。当我运行 nosetests 在这个文件,这里的输出:

$ nosetests -v test.py
test.Test_Foo.test_0 ... FAIL
test.Test_Foo.test_1 ... ok

======================================================================
FAIL: test.Test_Foo.test_0
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/Library/Frameworks/EPD64.framework/Versions/7.3/lib/python2.7/site-packages/nose/case.py", line 197, in runTest
    self.test(*self.arg)
  File "/Users/rmcgibbo/Desktop/test.py", line 10, in m
    assert getdoc(func) is not None
AssertionError

----------------------------------------------------------------------
Ran 2 tests in 0.002s

FAILED (failures=1)

这元类是不是真的有用的,但如果不使用 Meta 不如一个适当的元类,但为更多的功能性元类(即需要一个类作为一个参数和返回一个新的类,一个是重新命名这样的鼻子会发现它的),那么它 有用的。我已经用这种方法自动测试,将文档字符串坚持顽固标准的一部分的鼻子。

还有,我有一个很大的麻烦,得到适当的关闭工作与新的。功能,这就是为什么使用这个代码 m(self, func) 哪里 func 由是默认的说法。它将更多的自然使用一种封闭了 value, 但这似乎并没有工作。

你可以尝试产生的测试用例的类型()

class UnderTest_MixIn(object):

    def f1(self, i):
        return i + 1

    def f2(self, i):
        return i + 2

SomeDynamicTestcase = type(
    "SomeDynamicTestcase", 
    (UnderTest_MixIn, unittest.TestCase), 
    {"even_more_dynamic":"attributes .."}
)

# or even:

name = 'SomeDynamicTestcase'
globals()[name] = type(
    name, 
    (UnderTest_MixIn, unittest.TestCase), 
    {"even_more_dynamic":"attributes .."}
)

这应该是创建时的鼻子试图进你的test_module因此,它应该的工作。

这种方法的优点是,可以创建多种组合测试的动态。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top