我有一个与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'
。因此将其纳入
要澄清:一条评论建议重复发帖,但链接的帖子是关于如何一般地运行测试,而这篇文章询问如何在运行时访问给定测试中的特定变量。
答案 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
来实例化您的测试,但这似乎是一个更简单的选择。