2017-08-25 2 views
0

J'ai un test paramétré qui prend str, et dict comme argument et donc le nom semble assez bizarre si j'autorise pytest à générer des identifiants.test paramétré par pytest avec la fonction id personnalisée

Donc, je pense à générer des ID personnalisés en utilisant la fonction, mais il semble que cela ne fonctionne pas comme prévu.

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 

je pensais que ce serait retourner quelque chose comme ça

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

mais il est de retour cela. Est-ce que quelqu'un pourrait me dire ce qui ne va pas avec ceci, ou y a-t-il un moyen de réaliser ceci?

Mise à jour: Je me rends compte, quel est le problème, if_func sera appelé pour chaque paramètre et si je ne reviendrai pas str pour toute fonction par défaut du paramètre sera appelé. J'ai corrigé mais c'est aussi moche.

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

Maintenant, il retourne quelque chose comme ça,

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

Le problème est même si je retourne une chaîne vide (à savoir return ""), il prend la représentation par défaut. quelqu'un pourrait-il me dire pourquoi?

Répondre

2

Une façon est de déplacer votre argvalues à une autre variable et d'écrire votre test comme celui-ci:

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 

exécution de test:

$ 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 =============== 

Je pense qu'il est impossible avec une fonction (idfn dans votre cas), car s'il ne génère pas d'étiquette pour un objet, la représentation pyest par défaut est utilisée.
Vérifiez pytest site pour plus de détails.