私が実行している各単体テストは、Python コードをファイルに書き込んでから、モジュールとしてインポートしています。問題は、コードが変更されても、それ以降の import ステートメントでモジュールが変更されないことです。
私が必要としているのは、モジュールのリロードを強制するか、内部のバイトコード キャッシュをクリアする方法だと思います。何か案は?
ありがとう!
モジュールの再インポートは、すべてのエッジ ケースを正しく行うのが難しい作業です。reloadのドキュメントには、それらのいくつかが記載されています。何をテストするかによっては、たとえばsubprocessを介してそれぞれを実行することにより、インタープリターの個別の呼び出しでインポートをテストする方が良い場合があります。遅くなる可能性がありますが、より安全で正確なテストになる可能性があります。
を使用しreload()
ます。
以前にインポートしたモジュールを再ロードします。引数はモジュール オブジェクトである必要があるため、以前に正常にインポートされている必要があります。これは、外部エディターを使用してモジュール ソース ファイルを編集し、Python インタープリターを離れずに新しいバージョンを試したい場合に便利です。戻り値はモジュール オブジェクトです (モジュールの引数と同じ)。
ただし、モジュールはすでにロードされている必要があります。回避策は、結果を処理することNameError
です:
try:
reload(math)
except NameError:
import math
別の名前のモジュールにコードを記述します。既存のファイルに新しいコードを書き込んで、それを再度インポートしようとすると、うまく機能しません。
または、clobberすることもできますsys.modules
。例えば:
class MyTestCase(unittest.TestCase):
def setUp(self):
# Record sys.modules here so we can restore it in tearDown.
self.old_modules = dict(sys.modules)
def tearDown(self):
# Remove any new modules imported during the test run. This lets us
# import the same source files for more than one test.
for m in [m for m in sys.modules if m not in self.old_modules]:
del sys.modules[m]