Плагин "Нос" для указания порядка выполнения unit test - программирование
Подтвердить что ты не робот

Плагин "Нос" для указания порядка выполнения unit test

У меня есть желание использовать Nose для набора тестов для интеграции с проводкой. Тем не менее, порядок выполнения некоторых из этих тестов важен.

Сказав это, я подумал, что я подброшу быстрый плагин, чтобы украсить тест с помощью заказа, который я хочу выполнить: https://gist.github.com/Redsz/5736166

def Foo(unittest.TestCase):

    @step(number=1)
    def test_foo(self):
        pass

    @step(number=2)
    def test_boo(self):
        pass

Из рассмотрения встроенных плагинов, о которых я думал, я мог бы просто переопределить loadTestsFromTestCase и заказать тесты по номеру "украшенный" номер.:

def loadTestsFromTestCase(self, cls):
    """
    Return tests in this test case class. Ordered by the step definitions.
    """
    l = loader.TestLoader()
    tmp = l.loadTestsFromTestCase(cls)

    test_order = []
    for test in tmp._tests:
        order = test.test._testMethodName
        func = getattr(cls, test.test._testMethodName)
        if hasattr(func, 'number'):
            order = getattr(func, 'number')
        test_order.append((test, order))
    test_order.sort(key=lambda tup: tup[1])
    tmp._tests = (t[0] for t in test_order)
    return tmp

Этот метод возвращает тесты в желаемом порядке, однако, когда тесты выполняются носом, они не выполняются в этом порядке?

Возможно, мне нужно переместить эту концепцию заказа в другое место?

ОБНОВЛЕНИЕ. В соответствии с комментарием, который я сделал, плагин фактически работает как ожидалось. Я ошибался, чтобы доверять репортеру теста пичарм. Тесты выполняются, как ожидалось. Вместо того, чтобы снять вопрос, я решил, что оставлю его.

4b9b3361

Ответ 1

Из документации:

[...] нос выполняет функциональные тесты в том порядке, в котором они появляются в файле модуля. Тесты TestCase и другие тестовые классы выполняются в алфавитном порядке.

Поэтому простым решением может быть переименование тестов в вашем тестовом примере:

class Foo(unittest.TestCase):

    def test_01_foo(self):
        pass

    def test_02_boo(self):
        pass

Ответ 2

Я нашел решение для него с помощью плагина заказа PyTest, предоставленного здесь.

Попробуйте py.test YourModuleName.py -vv в CLI, и тест будет работать в том порядке, в котором они появились в вашем модуле (сначала test_foo, а затем test_bar)

Я сделал то же самое и отлично работал у меня.

Примечание. Вам необходимо установить пакет PyTest и импортировать его.