1

私のプログラムは、構成のために python スクリプトを読み取ります。lab.pyこれまでのところ、次のように呼び出されるスクリプトをロードしています。

self.lab_file = "/not/interesting/path/lab.py"
sys.path.insert(0, os.path.dirname(self.lab_file))
import lab as _config

しかし、単体テストを行っていると、奇妙な動作が発生します。

  • このコードを呼び出す単体テストを 1 つだけ起動すると、成功します
  • いくつかの単体テストを起動すると、それぞれがこのコードを独立して呼び出し、いくつかのテストが失敗しました

で問題を追跡するloggingと、ラボ スクリプトは初回のみインポートされるようです。この動作は python に関して一貫しているように見えますが、単体テストが互いに分離されていると想定していました。私は間違っていますか?テストがインポートに関して独立していない場合、毎回スクリプトを強制的にロードするテストを作成するにはどうすればよいですか?

4

3 に答える 3

1

noseこのフラグで実行すると役立つかもしれません:

--with-isolation

ノーズドックから

プラグイン IsolationPlugin を有効にする: 分離プラグインを有効にして、外部モジュールへの変更を単一のテスト モジュールまたはパッケージに分離します。分離プラグインは、各テスト モジュールまたはパッケージの実行後に sys.modules の内容をテスト前の状態にリセットします。このプラグインは、カバレッジ プラグインと一緒に使用しないでください。また、モジュールのリロードによって望ましくない副作用が発生する可能性がある場合には使用しないでください。[NOSE_WITH_ISOLATION]

于 2013-09-19T20:43:02.733 に答える
1

sys.modules からモジュールを削除することをお勧めします

 import sys
 if 'lab' in sys.modules:
     del sys.modules['lab']
 import lab as _config

モジュールが既にインポートされている場合、インポートはsys.modulesをチェックするため、インポートを削除するだけでは機能しません。

インポートしてからリロードすると、最初にモジュールが sys.modules からローカル名前空間にロードされ、次にファイルからモジュールがリロードされるため、機能します。

于 2013-09-19T20:34:11.553 に答える