Je me suis tapé le guide bien gras sur les unit-test et j'ai commencé à les implémenter dans mon code une fois que celui-ci était fini (oui je sais, d'un autre côté mieux vaut le faire maintenant que ne pas le faire).
J'ai commencé par faire une belle doc.
Puis j'ai ajouté des doctests.
Là j'attaque les tests "moins unitaires" avec pytest et mock, et comme le dit si bien Sam:
dès que vous allez vouloir faire des tests sérieux, vous allez vous heurter à la dure réalité.
La réalité est que pour tester, il vous faut la réalité.
J'ai donc lu l'article sur les mocks, j'ai regardé mon code, puis j'ai relu l'article, j'ai commencé à taper des trucs, puis j'ai relu l'article et ainsi de suite jusqu'à me décider à poster ici.
Le fait est que je ne panne pas comment adapter le mocking à mon code (sans doute pourri).
Un exemple avec une fonction qui me permet d'ouvrir un fichier CSV, extraire des données et constituer un set de résultat (j'appelle ça un set mais c'est une liste):
def get_subject_set_from_CSV_file(filename, n_subj=None):
"""
Extract IDs from a CSV file for a given number of subjects.\n
:param filename: the name of the CSV file.
:param n_subj: (optional) the number of subjects (if None, all subjects).
:type filename: string
:type n_subj: int
:returns: subject data.
:rtype: list of strings
"""
# Init
result_set = []
subj = 0
condition = 'True' if n_subj is None else 'subj<n_subj'
# Open the CSV file
with open(filename,'rb') as CSV_file:
CSV_reader = csv.reader(CSV_file,delimiter='\t')
# extract a set of subjects (may be all)
try:
while(eval(condition)):
# Append the current subject to the result list
result_set.append(CSV_reader.next())
subj += 1
except:
pass
# sort the subjects by type and age
result_set = sorted(result_set,key=itemgetter(6,4))
return result_set
Pour tester cette fonction j'ai écrit ça:
def test_get_subject_set_from_CSV_file():
s_set = au.get_subject_set_from_CSV_file(TEST_FILE,NB_SUBJ)
assert s_set == [['18', '72', '11232', '61158', '45.69', '89', '5', '0']]
avec TESTFILE le chemin vers un fichier existant et NBSUBJ un int.
Ca marche, mais je sais que ça ne marchera plus dès que le soft quittera ma machine. Je voudrais donc utiliser un mock mais je ne sais pas comment partir:
- est-ce que je mocke le TEST_FILE? et si oui, quelle est la sortie à laquelle m'attendre dans mon test?
- est-ce que je mocke les appels dans ma fonction, comme suggéré ici? dans ce cas je ne teste plus vraiment ma fonction mais les fonctions qu'elle appelle, et encore une fois je ne peux que vérifier qu'elles ont été appelées avec le bon paramètre (et honnêtement je ne vois pas bien l'intérêt)