Плагин Nose для указания порядка выполнения модульного теста.

У меня есть желание использовать 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

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

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

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


person Jesse    schedule 08.06.2013    source источник
comment
Что ж, я думаю, этот вопрос можно игнорировать, плагин работает, как и ожидалось ... У меня был мозг, когда я запускал его из pychamr, где тестовый репортер был заказан по-другому. Однако тесты на самом деле заказываются, как и ожидалось, во время выполнения.   -  person Jesse    schedule 09.06.2013
comment
Я не хочу слишком много предполагать, так как не знаю вашей кодовой базы, но, основываясь на моем опыте автоматизированного тестирования, очень вероятно, что лучшим долгосрочным решением будет реструктуризация ваших тестов таким образом, чтобы они больше не зависят друг от друга. Вы можете повторять необходимые предварительные условия в функциях настройки или для последовательностей событий, которые действительно являются зависимыми, объединяя их в один тест. Также имейте в виду, что в качестве модульного теста вы, как правило, должны тестировать отдельные единицы функциональности и избегать внешнего ввода-вывода, где это возможно.   -  person GrandOpener    schedule 03.08.2013


Ответы (2)


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

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

Таким образом, простым решением может быть переименование тестов в вашем тестовом примере:

class Foo(unittest.TestCase):

    def test_01_foo(self):
        pass

    def test_02_boo(self):
        pass
person quornian    schedule 05.09.2013

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

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

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

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

person Mahsa Mortazavi    schedule 07.05.2015