2017-08-25 9 views
0

strdictを引数とするパラメータ化されたテストがあるため、pytestでIDを生成できるようにすると名前がかなり奇妙に見えます。pytestカスタムID関数でパラメータ化されたテスト

私は関数を使用してカスタムIDを生成しますが、意図したとおりに機能していないようです。

def id_func(param): 
    if isinstance(param, str): 
     return param 


@pytest.mark.parametrize(argnames=('date', 'category_value'), 
         argvalues=[("2017.01", {"bills": "0,10", "shopping": "100,90", "Summe": "101,00"}), 
            ("2017.02", {"bills": "20,00", "shopping": "10,00", "Summe": "30,00"})], 
         ids=id_func) 
def test_demo(date, category_value): 
    pass 

私はそれがこの

test_file.py::test_demo[2017.01] PASSED 
test_file.py::test_demo[2017.02] PASSED 

のようなものを返すだろうと考えましたが、それは、これを返します。

test_file.py::test_demo[2017.01-category_value0] PASSED 
test_file.py::test_demo[2017.02-category_value1] PASSED 

誰かがこれに間違っていることを教えてもらえますか、これを達成する方法はありますか?

アップデート:私は問題で何を実現 、if_funcは、各パラメータのために呼び出され、私は任意のパラメータのデフォルト機能のためstrを返さない場合に呼び出されます。私は修正がありますが、それはまた醜いです。

def id_func(param): 
    if isinstance(param, str): 
     return param 
    return " " 

は、今では(すなわちreturn "")は、デフォルトの表現をとる

test_file.py::test_demo[2017.01- ] PASSED 
test_file.py::test_demo[2017.02- ] PASSED 

問題は、私は空の文字列を返す場合でもあり、このようなものを返します。誰かがなぜ私に知らせることができますか?

答えて

2

一つの方法は、あなたのargvalues別の変数に移動して、このようなテストを書くことです:

import pytest 


my_args = [ 
     ("2017.01", {"bills": "0,10", "shopping": "100,90", "Summe": "101,00"}), 
     ("2017.02", {"bills": "20,00", "shopping": "10,00", "Summe": "30,00"}) 
] 


@pytest.mark.parametrize(
    argnames=('date', 'category_value'), argvalues=my_args, 
    ids=[i[0] for i in my_args] 
) 
def test_demo(date, category_value): 
    pass 

テスト実行:

$ pytest -v tests.py 
================= test session starts ================= 
platform linux2 -- Python 2.7.12, pytest-3.2.1, py-1.4.34, pluggy-0.4.0 -- /home/kris/.virtualenvs/2/bin/python2 
cachedir: .cache 
rootdir: /home/kris/projects/tmp, inifile: 
collected 2 items          

tests.py::test_demo[2017.01] PASSED 
tests.py::test_demo[2017.02] PASSED 

============== 2 passed in 0.00 seconds =============== 

私は(それが機能では不可能だと思いますidfn)、オブジェクトのラベルを生成していない場合、デフォルトのpytest表現が使用されるためです。
詳細はpytest siteを確認してください。

関連する問題