Python Нос `ValueError: такого тестового метода нет в‹ class 'my_test.check_error_test' ›: runTest`

У меня есть рабочий набор тестов, который работает с Nose.

Недавно я понял, что мне нужно добавить кое-что к моему общему setUp(), поскольку это запускается переменной, обнаруженной в каждом отдельном тесте (переменная обновляется нашей системой контроля версий).

Я добавил __init__() в свой BaseTest.py и свой индивидуальный тест. Однако я получаю ValueError: no such test method in <class 'my_test.check_error_test'>: runTest

Судя по поиску в Google, похоже, что это связано с загрузчиком unittest. Но раньше Нос всегда заботился обо всех погрузчиках.

Я предполагаю, что это связано с тем фактом, что я касаюсь атрибута methodName после того, как Нос установил его, но я не могу понять, что мне нужно установить, ОСОБЕННО, поскольку я использую различные плагины для носа. Или, может быть, есть способ получше. Что мне нужно сделать по-другому?

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'. Следовательно, его включение

Для уточнения: один комментарий предполагает дублирование сообщения, однако связанное сообщение посвящено тому, как запускать тесты в целом, в то время как это сообщение спрашивает, как получить доступ к определенным переменным в рамках данного теста во время выполнения.


person dbJones    schedule 01.08.2014    source источник
comment
Если rev присутствует в My_test.py, почему вы не можете просто получить к нему доступ как к глобальной переменной, вместо того, чтобы пытаться встроить его в тестовые классы?   -  person chepner    schedule 01.08.2014
comment
Похоже, это приведет к циклической зависимости. Bast_Test класс нуждается в my_test.rev для своего setUp(). Но my_test нужно Bast_Test.setUp(), чтобы бежать ...   -  person dbJones    schedule 01.08.2014
comment
возможный дубликат ValueError: такого метода тестирования в ‹Класс 'myapp.tests.SessionTestCase'›: runTest   -  person brandizzi    schedule 19.08.2015


Ответы (2)


Я бы просто использовал встроенный плагин атрибутов для передачи информации вниз:

в 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
person Oleksiy    schedule 01.08.2014

Вы можете сделать 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 для создания экземпляров ваших тестов, но это кажется мне более простой альтернативой.

person chepner    schedule 01.08.2014