python nose`ValueError:<class'my_test.check_error_test'=“”>中没有这样的测试方法:runTest` </class>

时间:2014-08-01 15:18:16

标签: python nose nosetests python-unittest

我有一个与Nose一起运行的工作测试套件。

我最近意识到我需要在整个setUp()中添加内容,由每个单独测试中找到的变量触发(变量由我们的版本控制系统更新)。

我在我的BaseTest.py和我的个人测试中添加了__init__()。但是,我得到ValueError: no such test method in <class 'my_test.check_error_test'>: runTest

从谷歌搜索,看起来这与单元测试装载机有关。但是之前Nose总是照顾好所有的装载机。

我猜这与我在Nose设置之后触摸methodName属性这一事实有关,但我无法弄清楚我应该将它设置为什么,特别是因为我使用了各种Nose插件。或许还有更好的方法。我需要做些什么不同的事情?

BaseTest.py

import unittest

class BaseTest(unittest.TestCase):
    def __init__(self, methodName='runTest', p4rev=None):
        super(BaseTest, self).__init__(methodName)
        self.p4rev = p4rev

    def setUp(self):
        triggerSomething(p4rev)

My_test.py

from BaseTest import BaseTest

rev = '12345'

class CheckError_Test(BaseTest):
    def __init__(self, rev):
        super(CheckError_Test, self).__init__(p4rev=rev)

    dosomething()

注意:如果我没有使用super(BaseTest, self).__init__(methodName),则会收到错误消息:Attribute error: 'check_error_test' object has no attribute '_testMethodName'。因此将其纳入

要澄清:一条评论建议重复发帖,但链接的帖子是关于如何一般地运行测试,而这篇文章询问如何在运行时访问给定测试中的特定变量。

2 个答案:

答案 0 :(得分:2)

我会使用内置的attributes plugin来传递信息:

my_test.py中的

from base_test import BaseTest
from nose.plugins.attrib import attr

rev = '12345'

@attr(rev=rev)
class CheckError_Test(BaseTest):
    def test_me(self):
        assert self.rev == rev
base_test.py中的

import unittest

def triggerSomething(text):
    print "revision was set to",  text

class BaseTest(unittest.TestCase):
    def setUp(self):
        p4rev = getattr(self, 'rev')
        triggerSomething(p4rev)

shell输出:

$ nosetests my_test.py --pdb -s

revision was set to 12345
.
----------------------------------------------------------------------
Ran 1 test in 0.002s

OK

答案 1 :(得分:0)

您可以使BaseTest成为一个抽象类,要求派生类的实例设置self.p4rev

class BaseTest(unittest.TestCase):

    # Note: subclasses must provide the p4rev attribute
    def setUp(self):
        triggerSomething(self.p4rev)

然后在你的测试脚本中

from BaseTest import BaseTest

rev = '12345'

class CheckError_Test(BaseTest):
    def setUp(self):
        self.p4rev = rev
        BaseTest.setUp(self)  # Or use super() if you like

您可以选择使用ABCMeta类将BaseTest标记为更清晰的抽象类,并将p4rev定义为抽象属性。

我非常确定有哪些方法可以让nose使用客户TestLoader来实例化您的测试,但这似乎是一个更简单的选择。