Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 单元测试框架:在新流程中运行测试_Python_Unit Testing_Multiprocessing - Fatal编程技术网

Python 单元测试框架:在新流程中运行测试

Python 单元测试框架:在新流程中运行测试,python,unit-testing,multiprocessing,Python,Unit Testing,Multiprocessing,我编写了一个GUI应用程序,它使用。 应用程序在树状视图中显示所有找到的单元测试。 如果单击单元测试名称,程序将运行此测试并显示结果。 它起作用了 但是现在我希望每个测试用例都在一个新的进程中运行。 我创建了一个“工作线程”(使用模块线程),但该线程也在同一进程中运行 “多处理”模块是解决方案,但我的实现遇到了问题。 我将“测试执行代码”放在自己的函数中,并尝试: item = self.GetSelection() name = self.GetItemText(item) p = multi

我编写了一个GUI应用程序,它使用。 应用程序在树状视图中显示所有找到的单元测试。 如果单击单元测试名称,程序将运行此测试并显示结果。 它起作用了

但是现在我希望每个测试用例都在一个新的进程中运行。 我创建了一个“工作线程”(使用模块线程),但该线程也在同一进程中运行

“多处理”模块是解决方案,但我的实现遇到了问题。 我将“测试执行代码”放在自己的函数中,并尝试:

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”呢?或者“哇”