【问题标题】:python nose `ValueError: no such test method in <class 'my_test.check_error_test'>: runTest`python鼻子`ValueError:<class'my_test.check_error_test'>中没有这样的测试方法:runTest`
【发布时间】:2014-09-24 20:18:57
【问题描述】:

我有一个可以使用 Nose 运行的测试套件。

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

我已将__init__() 添加到我的 BaseTest.py 和我的个人测试中。但是,我得到ValueError: no such test method in &lt;class 'my_test.check_error_test'&gt;: runTest

从谷歌搜索来看,这似乎与单元测试加载器有关。但是鼻子以前总是照顾所有的装载机。

我猜这与我在 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'。因此它包含

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

【问题讨论】:

标签: python nose nosetests python-unittest


【解决方案1】:

我只会使用内置的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)

外壳输出:

$nosetests my_test.py --pdb -s

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

OK

【讨论】:

    【解决方案2】:

    您可以使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 来实例化您的测试,但在我看来这似乎是一个更简单的选择。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-03
      • 1970-01-01
      • 2012-10-03
      • 2013-08-11
      • 1970-01-01
      相关资源
      最近更新 更多