Пропуснете единичен тест от приставка Nose2

Имам проблем с действителното пропускане на единичен тест от плъгин Nose2. Мога да маркирам теста като пропуснат и да видя причината в крайния резултат, но тестът продължава да работи. Този примерен код трябва основно да пропуска всеки тест, стига плъгинът да е активен.

from nose2.events import Plugin

class SkipAllTests(Plugin):
    def startTest(self, event):
        event.result.addSkip(event.test, 'skip it')
        event.handled = True

Ако извикам event.test.skipTest('reason'), той всъщност повдига изключението SkipTest, както би трябвало, просто изключението не е уловено от програмата за тестване, то просто повдига вътре в моя метод на кука startTest. Някакви идеи?


person Matt Dodge    schedule 08.07.2014    source източник


Отговори (1)


Не мисля, че всъщност можете да спрете изпълнението на тест с куката startTest. nose2 документа предлага използването на matchPath или getTestCaseNames, за да направите това. Ето работещ пример с използване на matchPath:

from nose2.events import Plugin

class SkipAllTests(Plugin):
    configSection = "skipper"
    commandLineSwitch = (None, 'skipper', "Skip all tests")

    def matchPath(self, event):
        event.handled = True
        return False

Документите matchPath всъщност изрично обясняват как може да се използва за спиране на изпълнението на тестове:

Приставките могат да използват тази кука, за да предотвратят зареждането на модулите на Python от тестовия зареждащ модул или да ги принудят да бъдат заредени от тестовия зареждащ механизъм. Задайте event.handled на True и върнете False, за да накарате зареждащото устройство да пропусне модула.

Използването на този метод ще предотврати зареждането на тестовия случай. Ако искате тестът действително да се показва в списъка като пропуснат, вместо изобщо да не се показва в списъка с тестове, можете да направите малко хакерство с StartTestEvent:

def dummy(*args, **kwargs):
    pass

class SkipAllTests(Plugin):
    configSection = "skipper"
    commandLineSwitch = (None, 'skipper', "Skip all tests")
    def startTest(self, event):
        event.test._testFunc = dummy
        event.result.addSkip(event.test, 'skip it')
        event.handled = True

Тук заместваме действителната функция, която тестът ще изпълни с фиктивна функция, която не прави нищо. По този начин, когато тестът се изпълни, той няма операции и след това съобщава, че е бил пропуснат.

person dano    schedule 11.07.2014
comment
Да, това също беше най-доброто нещо, което можах да измисля. За всички бъдещи зрители ще искате да се уверите, че сте закърпили и методите setUp и tearDown с фиктивната функция. Те все още биха се изпълнили, което може да е нежелателно - person Matt Dodge; 19.07.2014