2016-01-31 19 views
0

我目前使用pytest-benchmark對基於非重新平衡二叉搜索樹的AVL樹的實現進行基準測試。到目前爲止,它似乎對我很好,但我遇到了一個問題。爲了整合測試文件,我發現我可以爲parametrize testsgroup 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

有在主分支具體PARAM分組的支持。 只需'pip安裝https:// github.com/ionelmc/pytest-benchmark/archive/master.zip',然後使用'--benchmark-group-by = param:case'。 我認爲我們可以支持'case,n'情況... – ionelmc

+0

我看到param選項,但不知道主分支中的':'選項。我在master分支中得到一個無關的錯誤,但是當我嘗試運行基準時。 「File」xxx \ python35 \ lib \ site-packages \ pytest_benchmark \ storage.py第41行if candidate.is_file():'「,」OSError:[WinError 123]文件名,目錄名稱或卷標語法不正確:'[0-9] [0-9] [0-9] [0-9] _ *'「(在Windows 10上運行...工作計算機。當我回到我的首選Linux上時,我會再試一次開發環境) –

+1

僅供參考,我已經解決了Windows問題,現在可以使用'--benchmark-group-by = param:foo,param:bar'(在master分支中) – 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