Est-ce que cet outil existe en Python ? 12
vendredi 1 mai 2015 à 10:35Le test unitaire le plus simple, c’est de vérifier que son API publique n’a pas changé.
Ça veut dire :
- vérifier que les modules ont bien les mêmes définitions (un nom qui était importable n’a pas disparu).
- vérifier que les fonctions et méthodes ont bien la même signature (les arguments avec le même nom n’ont pas changé de place, et les keywords arguments n’ont pas changé de nom).
- vérifier que les classes ont le même nom, les mêmes méthodes publiques avec les mêmes signatures et les mêmes attributs.
Ce sont des tests super cons qui demandent d’écrire du code du genre :
class Foo: bar = True def __init__(self, stuff=False): self.stuff def thing(self): return "doh" # et dans les tests self.assertTrue(hasattr(Foo, 'bar')) self.assertTrue(hasattr(Foo, 'thing')) self.assertTrue(hasattr(Foo(), 'stuff')) |
Et personne ne le fait, car déjà les tests c’est relou, mais écrire des tautologies à la main, c’est au dela du tolérable.
Pourtant, ce genre de tests m’aurait déjà sauvé les gosses plusieurs fois. Une faute de frappe qui se glisse, un attribut qu’on rend privé, un méthode qu’on déplace et on pense avoir tout refactoré, un pote qui change un truc qu’on utilisait, etc.
Je me demandais donc si il existait un truc qui permette de faire :
self.assertStablePublicAPI("package.module") # scanne tout le module et tous les objets self.assertStablePublicAPI("package.module:Class") # check juste la classe self.assertStablePublicAPI("package.module:func") # check juste la function |
Le but étant que quand on lance les test, ça check si ça rencontre un nouvel objet/attribut/param et sauvegarde tout un dans un JSON. Aux prochains tests, si on a modifier l’API publique, le test foire jusqu’à ce qu’on modifie explicitement le fichier JSON.
On doit bien entendu pouvoir régler le truc pour ignorer ou ajouter explicitement des choses à checker, par exemple par défaut ça ignore tous les machins avec des underscores dans le nom.
J’ai cherché sur le net, mais j’arrive pas à trouver ça. Des pistes ?