изменение порядка юнит-тестов в Python - PullRequest
32 голосов
/ 23 октября 2010

Как сделать так, чтобы модульные тесты в Python (с использованием unittest) выполнялись в порядке, указанном в файле?

Ответы [ 7 ]

28 голосов
/ 24 октября 2010

Вы можете изменить поведение сортировки по умолчанию, установив пользовательскую функцию сравнения.В unittest.py вы можете найти переменную класса unittest.TestLoader.sortTestMethodsUsing, которая по умолчанию установлена ​​на встроенную функцию cmp.

Например, вы можете изменить порядок выполнения ваших тестов, выполнив это:

import unittest
unittest.TestLoader.sortTestMethodsUsing = lambda _, x, y: cmp(y, x)
17 голосов
/ 23 октября 2010

Умное Именование.

class Test01_Run_Me_First( unittest.TestCase ):
    def test010_do_this( self ):
        assertTrue( True )
    def test020_do_that( self ):
        etc.

Это один из способов форсировать определенный заказ.

6 голосов
/ 29 августа 2013

Как сказано выше, обычно тесты в тестовых случаях должны тестироваться в любом (то есть случайном) порядке.

Однако, если вы хотите заказать тесты в тестовом примере, очевидно, это не тривиально.Тесты (имена методов) извлекаются из тестовых случаев с использованием dir(MyTest), который возвращает отсортированный список членов.Вы можете использовать умный (?) Хак, чтобы упорядочить методы по номерам строк.Это будет работать для одного теста:

if __name__ == "__main__":
    loader = unittest.TestLoader()
    ln = lambda f: getattr(MyTestCase, f).im_func.func_code.co_firstlineno
    lncmp = lambda a, b: cmp(ln(a), ln(b))
    loader.sortTestMethodsUsing = lncmp
    unittest.main(testLoader=loader, verbosity=2)
2 голосов
/ 24 октября 2010

Есть также тест-бегуны, которые делают это самостоятельно - я думаю, что py.test делает это.

1 голос
/ 07 февраля 2013

Используйте библиотеку хоботок , как я уже упоминал (см. Краткое описание там).

0 голосов
/ 06 июля 2018

хакерский путь (запустите этот файл в pycharm или другом модульном тестировщике)

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
import unittest


def make_suite():
    class Test(unittest.TestCase):
        def test_32(self):
            print "32"
        def test_23(self):
            print "23"

    suite = unittest.TestSuite()
    suite.addTest(Test('test_32'))
    suite.addTest(Test('test_23'))
    return suite

suite = make_suite()

class T(unittest.TestCase):
    counter = 0
    def __call__(self, *args, **kwargs):
        res = suite._tests[T.counter](*args, **kwargs)
        T.counter += 1
        return res

for t in suite._tests:
    name = "{}${}".format(t._testMethodName, t.__class__.__name__)
    setattr(T, name, t)
0 голосов
/ 07 мая 2015

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...