2016-01-31 2 views
0

В настоящее время я сравниваю реализацию дерева AVL, которое я сделал против небалансного двоичного дерева поиска, используя pytest-benchmark. Кажется, это работает для меня до сих пор, но я столкнулся с проблемой. Чтобы закрепить тестовый файл, я обнаружил, что могу читать parametrize tests, а также group the output of the benchmark для удобства чтения, но я не могу сделать это одновременно.Группировка параметризованных тестов с помощью pytest

Мой текущий вставки тест:

# always the same for repeatability 
random.seed(0x1C2C6D66) 

def insertRandomOrder(t, n): 
    tree = t() 
    for i in range(0,n): 
    tree.insert(random.randint(0,0x7FFFFFFF),i) 

def insertDescendingOrder(t, n): 
    tree = t() 
    for i in range(0,n): 
    tree.insert(n-i,i) 

def insertOutInOrder(t, n): 
    tree = t() 
    for i in range(0,n): 
    idx = (i%2)*n + (1-2*(i%2))*i 
    tree.insert(idx,i) 

def insertAscendingOrder(t, n): 
    tree = t() 
    for i in range(0,n): 
    tree.insert(i,i) 

types = [BaseTree, AvlTree] 
sizes = [100,300,1000] 
cases = [insertAscendingOrder, insertDescendingOrder, insertOutInOrder, insertRandomOrder] 

@pytest.mark.parametrize('t', types) 
@pytest.mark.parametrize('n', sizes) 
@pytest.mark.parametrize('case', cases) 
def test_insert_benchmark(benchmark, t, n, case): 
    benchmark(case, t, n) 

А вот выход:

output from parametrized pytest-benchmark run

Кто-нибудь знает пути, где я мог бы группировать выход, но говорить, что case от моего пример? Или еще лучше, по (case,n) кортежу?

+0

Существует поддержка определенной группировки паров в главной ветви. Просто 'pip install https: // github.com/ionelmc/pytest-benchmark/archive/master.zip', а затем используйте' --benchmark-group-by = param: case'. Я думаю, мы могли бы поддержать ситуацию «case, n' ... – ionelmc

+0

Я видел параметр param, но не знал о опции': 'в основной ветке. Я получаю несвязанную ошибку в главной ветке, хотя, когда я пытаюсь запустить тест. «Файл» xxx \ python35 \ lib \ site-packages \ pytest_benchmark \ storage.py строка 41 'if candid.is_file():' "," OSError: [WinError 123] Неверное имя файла, имя каталога или тома : '[0-9] [0-9] [0-9] [0-9] _ *' "(работает на компьютере под управлением Windows 10 ... Я попробую еще раз, когда вернусь домой на предпочитаемый Linux Dev Environment) –

+1

FYI, я исправил проблему Windows, и у вас может быть '--benchmark-group-by = param: foo, param: bar' now (в главной ветке) – ionelmc

ответ

1

Было a useful comment, в котором говорилось, что главная ветвь pytest находится в процессе поддержки этой точной функции, но мне не удалось заставить ее работать (пальцы скрещены для следующего выпуска).

Тем временем я выяснил эту удобную работу. Я могу группироваться по case, но не по (case,n) с помощью этого метода. Я добавил декоратор @benchmark_this над каждым тестовым случаем, чтобы обернуть звонок benchmark. Это очень удобно даже без дополнительной выгоды от группировки по тестовому сценарию!

def benchmark_this(test): 
    def wrapper(benchmark, t, n): 
    benchmark(test, None, t, n) 
    return wrapper 

types = [BaseTree, AvlTree] 
sizes = [100,300,1000] 

@pytest.mark.parametrize('t', types) 
@pytest.mark.parametrize('n', sizes) 
@benchmark_this 
def test_insertRandomOrder(benchmark, t, n): 
    random.seed(0x1C2C6D66) 
    tree = t() 
    for i in range(n): 
    tree.insert(random.randint(0, 0x7FFFFFFF), i) 

@pytest.mark.parametrize('t', types) 
@pytest.mark.parametrize('n', sizes) 
@benchmark_this 
def test_insertDescendingOrder(benchmark, t, n): 
    tree = t() 
    for i in range(n): 
    tree.insert(n-i, i) 

# ... 

Вызванный с

py.test --benchmark-group-by=func

Смежные вопросы