私は、PyGObject (Gtk の新しいイントロスペクション ベースのバインディング) を使用して小規模/中規模の GUI アプリケーションを作成中です。nose
モジュールをインポートし、さまざまな関数を呼び出して結果を確認するだけで、アプリのほとんどの機能をテストできる合理的なテスト スイートから始めました。
しかし、最近私はいくつかの Gtk 機能を利用し始めました。GLib.timeout_add_seconds
これは、タイマーが切れた後に指定されたコールバックを呼び出すだけの非常に単純なコールバック メカニズムです。私が今直面している問題は、アプリを使用するとコードが機能しているように見えることですが、テストスイートのカプセル化が不十分であるため、あるテストでクリーンな状態で開始されていることを確認すると、その状態が完全に踏みにじられていることがわかります。別のテストによって登録されたコールバック。具体的には、テストはファイルがロードされていないことを正常にチェックし、次にいくつかのファイルをロードし、ロード後にファイルが変更されていないことをチェックし、テストは失敗します!
何が起こっているのかを理解するのにしばらく時間がかかりましたが、基本的に、あるテストではいくつかのファイルが変更され (タイマーが開始されます)、保存せずにそれらが閉じられ、別のテストでは変更されていないファイルが再度開かれ、変更されていることがわかります。タイマーが切れた後、コールバックがファイルを変更しました。
モジュールをリロードするための Python のビルトインについて読んだことがreload()
ありますが、アプリをアンロードしてリロードし、新たなスタートを切ることができると期待していますが、機能していないようです。
アプリをサブプロセスとして起動し、いじってから、サブプロセスを終了して、新しい状態を保証する必要があるときに再起動する必要があるのではないかと心配しています。特にpygobjectコードの場合、これを簡単にするテストフレームワークはありますか?