Python 单元测试框架:在新流程中运行测试
我编写了一个GUI应用程序,它使用。 应用程序在树状视图中显示所有找到的单元测试。 如果单击单元测试名称,程序将运行此测试并显示结果。 它起作用了 但是现在我希望每个测试用例都在一个新的进程中运行。 我创建了一个“工作线程”(使用模块线程),但该线程也在同一进程中运行 “多处理”模块是解决方案,但我的实现遇到了问题。 我将“测试执行代码”放在自己的函数中,并尝试:Python 单元测试框架:在新流程中运行测试,python,unit-testing,multiprocessing,Python,Unit Testing,Multiprocessing,我编写了一个GUI应用程序,它使用。 应用程序在树状视图中显示所有找到的单元测试。 如果单击单元测试名称,程序将运行此测试并显示结果。 它起作用了 但是现在我希望每个测试用例都在一个新的进程中运行。 我创建了一个“工作线程”(使用模块线程),但该线程也在同一进程中运行 “多处理”模块是解决方案,但我的实现遇到了问题。 我将“测试执行代码”放在自己的函数中,并尝试: item = self.GetSelection() name = self.GetItemText(item) p = multi
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
回溯(最近一次呼叫最后一次):
文件“C:\a\b\C\hhh\a.py”,第577行,在onleftd中单击
p、 开始()
文件“C:\Python26\lib\multiprocessing\process.py”,第104行,在开始处
self.\u popen=popen(self)
文件“C:\Python26\lib\multiprocessing\forking.py”,第239行,在\uuu init中__
转储(进程对象、到子进程、最高\u协议)
文件“C:\Python26\lib\multiprocessing\forking.py”,第162行,在转储中
ForkingPickler(文件、协议).dump(obj)
文件“C:\Python26\lib\pickle.py”,第224行,位于转储文件中
自我保存(obj)
文件“C:\Python26\lib\pickle.py”,第331行,保存
自我保存(obj=obj,*rv)
文件“C:\Python26\lib\pickle.py”,第419行,在save\u reduce中
保存(状态)
文件“C:\Python26\lib\pickle.py”,第286行,保存
f(self,obj)#用显式self调用未绑定方法
保存目录中第649行的文件“C:\Python26\lib\pickle.py”
self.\u batch\u setitems(obj.iteritems())
文件“C:\Python26\lib\pickle.py”,第681行,在批处理设置项中
保存(v)
文件“C:\Python26\lib\pickle.py”,第286行,保存
f(self,obj)#用显式self调用未绑定方法
文件“C:\Python26\lib\pickle.py”,第548行,在save\u tuple中
保存(元素)
文件“C:\Python26\lib\pickle.py”,第331行,保存
自我保存(obj=obj,*rv)
文件“C:\Python26\lib\pickle.py”,第419行,在save\u reduce中
保存(状态)
文件“C:\Python26\lib\pickle.py”,第286行,保存
f(self,obj)#用显式self调用未绑定方法
保存目录中第649行的文件“C:\Python26\lib\pickle.py”
self.\u batch\u setitems(obj.iteritems())
文件“C:\Python26\lib\pickle.py”,第686行,在批处理设置项中
保存(v)
文件“C:\Python26\lib\pickle.py”,第331行,保存
自我保存(obj=obj,*rv)
文件“C:\Python26\lib\pickle.py”,第396行,在save\u reduce中
保存(cls)
文件“C:\Python26\lib\pickle.py”,第286行,保存
f(self,obj)#用显式self调用未绑定方法
文件“C:\Python26\lib\pickle.py”,第748行,在save\u global中
(对象、模块、名称))
pickle.PicklingError:无法pickle:找不到它作为_u内置的_u.PySwigObject
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“C:\Python26\lib\multiprocessing\forking.py”,第342行,在main中
self=加载(从父级)
加载文件“C:\Python26\lib\pickle.py”,第1370行
返回Unpickler(file.load())
加载文件“C:\Python26\lib\pickle.py”,第858行
调度[键](自身)
文件“C:\Python26\lib\pickle.py”,第880行,在load\u eof中
提高采收率
伊奥费罗
有人知道吗?使用生成子进程。这需要你做一些工作,但会奏效 注意:多进程模块是使用fork实现的
更新:仔细查看代码后,似乎
项
变量不可pickle(这是一个词吗?)。我认为您不需要它,因为您可以用更简单的东西(值或某种类型)来代替它。我建议您创建一个单独的脚本来运行测试,然后您可以使用子流程
模块来调用该脚本,为它指定要运行的测试的名称
好处是,您可以在不需要GUI的连续集成服务器、夜间构建或其他批处理类型的过程中使用相同的脚本。显然,您正在尝试“pickle”不可拾取的内容(似乎是wx对象)。尝试只使用“简单”对象(即内部没有图形对象)作为参数,这样会更好。 您还可以查看python库,它允许您在多进程中自动运行测试。“picklable(这是一个词吗?)“pythonic”呢?或者“哇”