Je voudrais écrire des tests d'unité pour tester si une dépendance existe entre deux packages Python. E.G.:
a/ __init__.py models.py views.py ... b/ __init__.py models.py views.py ...
Etre à vérifier que les modules dans l'emballage Je voudrais avoir ce test d'unité parce que je Voulez-vous être sûr que je peux utiliser le package B code> n'importent rien des modules dans le package
A code>. La seule solution que j'ai jusqu'à présent est de numériser les fichiers et de vérifier qu'il n'y a pas de "à partir d'un" ou "Importer A" dans le code source. Y a-t-il d'autres moyens de faire ça? Une des exigences est que
a / code> et
b / code> doit être dans le même niveau de répertoire. P>
B code> dans d'autres projets sans package
a code>, et ne pas avoir d'autres développeurs d'écrire du code qui rendra
B code> dépendant du
A code>. p> p>
3 Réponses :
Python est trop dynamique pour le faire 100% correctement. Considérez que vous pouvez importer des modules en appelant Et il est techniquement possible pour un module d'appeler une fonction d'un autre module, qui importe un module et le renvoie. Donc, vous définitivement em> ne pouvez pas le faire en analysant simplement le paquet et ensuite il y a Le plus proche que vous puissiez obtenir est probablement d'essayer de rendre votre exercice de test d'unité Si, toutefois, tout votre propre code et vous savez que vous ne faites pas ce genre de merde wacky, puis un script simple qui analyse les fichiers pour __ importer __ code>, qui prend un argument de chaîne afin que le nom du module à l'importation puisse être construit au moment de l'exécution. En outre,
__ importer __ code> est une fonction, il pourrait donc être lié à d'autres noms, de sorte que vous ne pouvez même pas être sûr de détecter tous les cas lorsque quelque chose em> est importé. < / p>
B code>. P>
exécuté code> pour exécuter le code python arbitraire construit à l'exécution ... p>
B code> lorsque
a code> est sur le
pythonpath code>, et aussi lorsque
A code> n'est pas sur le
pythonpath code>. Toujours pas infaillible, car cela ne vous dit que
B code> terminé tous les tests sans
A code> sur le
pythonpath code>, pas si cela n'a pas besoin de
A code> pour n'importe quoi. Et si vous êtes vraiment malchanceux,
B code> fait quelque chose de vraiment stupide et de tripdles avec
sys.path code> en vol et gère pour importer
A code> en quelque sorte. p>
importation code> est probablement votre meilleur pari. Cela fonctionnerait probablement très très souvent sur le code aléatoire des autres personnes. Il n'est tout simplement pas possible de faire le travail parfaitement avec une généralité complète. P>
import sys sys.modules['a'] = None import b # run unit tests for b to try and catch local import statements in b's functions
Il y a des modules comme couverture.py capable de vérifier quel code a été exécuté lors d'un test. Par conséquent, il doit y avoir un moyen de vérifier quel module de code fait partie duquel a été exécuté lors d'un test. Cette approche devrait fonctionner, indépendamment de la nature dynamique de Python, contrairement à ce que le @ben dit dans sa réponse. P>
Cependant, je ne suis pas au courant d'un module qui vous permet de sortir de la boîte. Cela ressemble donc à beaucoup de travaux manuels, mais aussi une bonne possibilité de libérer un nouvel utilitaire de test pour cela. P>