5

私はPythonが初めてで、機能テスト環境をセットアップしようとしています。テスト環境は、DBus を介して信号を受信し、それらを評価します。DBus シグナリングは GLib MainLoop を使用します。ループをカプセル化する次のクラスがあります。

class SignalLoop(threading.Thread):
    def __init__(self):
        threading.Thread.__init__(self)
        self.__l = gobject.MainLoop()        
    def run(self):
        self.__l.run()
    def quit(self):
        self.__l.quit() 

そして、私が試したDBus処理を行うモジュールで:

class __ModuleInitializer:
    def __init__(self):
        print('Module was initialized')
        gobject.threads_init()
        sl = SignalLoop()
        sl.start()

    def __del__(self):
        print('Module was deinitialized')
        sl.quit()

__module_init = __ModuleInitializer()

私も次のことを試しました:

  • setUp/tearDownModule() は機能しません-少なくともpython 2.5.2では
  • __init__() および __del__() メソッドを使用し、すべてのテストケースを単一のクラスに配置します。__del__() が呼び出されることはなく、このソリューションは多くのテスト ケースに対応できません。

コードを実行すると、sl.qui() が実行されず、理由がわかりません。コンソールから実行する場合、メインが返されないため、メインを強制終了する必要があります。ただし、これは PyDev テスト ランナーにとっては問題ではありません。

テスト環境を破壊するために使用できるフックはありますか? 単一のテストといくつかのテストも実行できるようにしたいので、メソッド自体に「ハッキング」することはオプションではありません。

手伝ってくれませんか?

4

3 に答える 3

5

セットアップおよびティアダウン メソッド中にメイン ループを開始および停止しません。代わりに、非同期リクエスト(または何でも)を作成し、結果が到着するまでメインループの反復を繰り返し実行します。

例:

make_asynchronous_request()
main_context = GLib.MainContext.default()
while main_context.pending():
    main_context.iteration(False)
assert(result_is_ok())
于 2012-12-06T16:03:05.827 に答える
3

ptomato の回答を使用して、自分に合った回答を作成しました。違いは、おそらくいくつかの python バージョンによるものです。私の場合、動作するコードは次のとおりです。

make_asynchronous_request()
main_context = GLib.MainLoop.get_context()
while main_context.pending():
    main_context.iteration(False)
assert(result_is_ok())
于 2013-04-19T13:38:05.483 に答える
0

SignalLoopクラスをdaemonスレッドとして定義する必要があると思います。これにより、シグナル ループ スレッドがまだ実行中であっても、終了時にプログラムを閉じることができます。プログラムが終了すると、__module_initオブジェクトはガベージ コレクションされ、その__del__関数が呼び出されます。

http://docs.python.org/2.6/library/threading.html#threading.Thread.daemonのドキュメントdaemon

于 2012-12-05T19:09:20.613 に答える