2011-07-22 8 views
1

Unit testing frameworkを使用するGUIアプリケーションをプログラミングしました。 アプリケーションは、見つかったすべての単体テストをツリービューで表示します。 単体テスト名をクリックすると、プログラムはこのテストを実行し、結果を表示します。 それは動作します!ユニットテストフレームワーク:新しいプロセスでテストを実行する

しかし、今私はすべてのテストケースを新しいプロセスで実行したいと思います。 私は "Working Thread"(モジュールスレッディング)を作成しましたが、このスレッドも同じプロセスで実行されています。

モジュール "マルチプロセッシング"が解決策ですが、実装に問題があります。私は自分の機能に私の「テストコードを実行し、」入れてみました :

item = self.GetSelection() 
name = self.GetItemText(item) 
p = multiprocessing.Process(target=ExecuteTest, args=(name, item)) 
p.daemon = True 
p.start() 

をしかし、私はエラーを得ました。

Traceback (most recent call last): 
    File "C:\a\b\c\hhh\a.py", line 577, in OnLeftDClick 
    p.start() 
    File "C:\Python26\lib\multiprocessing\process.py", line 104, in start 
    self._popen = Popen(self) 
    File "C:\Python26\lib\multiprocessing\forking.py", line 239, in __init__ 
    dump(process_obj, to_child, HIGHEST_PROTOCOL) 
    File "C:\Python26\lib\multiprocessing\forking.py", line 162, in dump 
    ForkingPickler(file, protocol).dump(obj) 
    File "C:\Python26\lib\pickle.py", line 224, in dump 
    self.save(obj) 
    File "C:\Python26\lib\pickle.py", line 331, in save 
    self.save_reduce(obj=obj, *rv) 
    File "C:\Python26\lib\pickle.py", line 419, in save_reduce 
    save(state) 
    File "C:\Python26\lib\pickle.py", line 286, in save 
    f(self, obj) # Call unbound method with explicit self 
    File "C:\Python26\lib\pickle.py", line 649, in save_dict 
    self._batch_setitems(obj.iteritems()) 
    File "C:\Python26\lib\pickle.py", line 681, in _batch_setitems 
    save(v) 
    File "C:\Python26\lib\pickle.py", line 286, in save 
    f(self, obj) # Call unbound method with explicit self 
    File "C:\Python26\lib\pickle.py", line 548, in save_tuple 
    save(element) 
    File "C:\Python26\lib\pickle.py", line 331, in save 
    self.save_reduce(obj=obj, *rv) 
    File "C:\Python26\lib\pickle.py", line 419, in save_reduce 
    save(state) 
    File "C:\Python26\lib\pickle.py", line 286, in save 
    f(self, obj) # Call unbound method with explicit self 
    File "C:\Python26\lib\pickle.py", line 649, in save_dict 
    self._batch_setitems(obj.iteritems()) 
    File "C:\Python26\lib\pickle.py", line 686, in _batch_setitems 
    save(v) 
    File "C:\Python26\lib\pickle.py", line 331, in save 
    self.save_reduce(obj=obj, *rv) 
    File "C:\Python26\lib\pickle.py", line 396, in save_reduce 
    save(cls) 
    File "C:\Python26\lib\pickle.py", line 286, in save 
    f(self, obj) # Call unbound method with explicit self 
    File "C:\Python26\lib\pickle.py", line 748, in save_global 
    (obj, module, name)) 
pickle.PicklingError: Can't pickle <type 'PySwigObject'>: it's not found as __builtin__.PySwigObject 

Traceback (most recent call last): 
    File "<string>", line 1, in <module> 
    File "C:\Python26\lib\multiprocessing\forking.py", line 342, in main 
    self = load(from_parent) 
    File "C:\Python26\lib\pickle.py", line 1370, in load 
    return Unpickler(file).load() 
    File "C:\Python26\lib\pickle.py", line 858, in load 
    dispatch[key](self) 
    File "C:\Python26\lib\pickle.py", line 880, in load_eof 
    raise EOFError 
EOFError 

誰でも知っていますか?

答えて

1

明らかに、あなたは選択可能ではないものを漬けようとしています(wxオブジェクトのようです)。パラメータとして「シンプルな」オブジェクト(つまり、内部にグラフィックオブジェクトがない)だけを使用しようとすると、よりうまくいくはずです。 Python nose unitestライブラリを見て、マルチプロセスでテストを自動的に実行できるようにすることもできます。

-1

forkを使用して子プロセスを生成します。これはあなたの仕事が必要ですが、うまくいくでしょう。

メモ:multiprocessnigモジュールはforkを使用して実装されています。


更新:あなたのコードをよく見た後、それはitem viariableがpickleableではないようだ(その単語のですか?)。私はあなたがそれを必要とは思わない、何か簡単なもの(値か何らかの並べ替え)で置き換えることができる。

+0

「pickleable(それは単語ですか?」)、「pythonic」はどうですか?または 'voooooooooooom' – SingleNegationElimination

0

テストを実行する別のスクリプトを作成してから、subprocessモジュールを使用してそのスクリプトを呼び出し、実行するテストの名前を付けることをお勧めします。

ボーナスは、継続的な統合サーバー、夜間ビルド、またはGUIを必要としない他のバッチタイプのプロセスで同じスクリプトを使用できることです。

関連する問題