Python nosetests:当测试在多个进程中 运行 时,自定义插件的添加 ** 挂钩不会被调用
Python nosetests: add** hooks of custom plugin do not called when tests are run in multiple processes
尝试运行并行进行鼻子测试,并希望在测试结束时做一份总结报告运行。
想在运行-in report
方法的最后使用nose自定义插件收集所有测试执行数据和聚合报告。
此代码 运行s 并行测试并使用自定义插件并在 运行 末尾调用它的 report
方法,但在执行期间不会调用 add** 挂钩并且不会收集数据用于聚合。
谁能告诉我为什么在测试期间跳过了 addSuccess、addError 和 addFailure 方法 运行?
如果我删除这些选项 --processes=16
,--process-timeout=360
那么插件中的挂钩可以正常工作,但这段代码中的重点是并行测试 运行 所以我无法删除他们。
import nose
import os
from nose.plugins import Plugin
class ReportPlugin(Plugin):
name = 'reportplugin'
score = 2500
def options(self, parser, env):
super(ReportPlugin, self).options(parser, env)
def configure(self, options, conf):
super(ReportPlugin, self).configure(options, conf)
self.enabled = True
def addSuccess(self, test, capt=None):
print('*** SUCCESS')
self.handler("SUCCESS", test)
def addError(self, test, err, capt=None):
print('*** ERROR')
self.handler("ERROR", test)
def addFailure(self, test, err, capt=None, tb_info=None):
print('*** FAILURE')
self.handler("FAILURE", test)
def handler(self, status, test):
# handle test run, collect status in multiprocessing manager
def report(self, stream):
# make nice report
TODO_TESTS = 'test_file.py'
path_to_tests = os.path.join(os.path.dirname(__file__), TODO_TESTS)
if __name__ == '__main__':
nose.run(
argv=['nosetests', '--processes=16', '--process-timeout=360', '--nocapture', '--verbose',
'--stop', '--with-xunitmp', '--xunitmp-file=report.xml', path_to_tests],
addplugins=[ReportPlugin()],
)
在将插件入口点加载到 nose.plugins.0.10
命名空间后解决了这个问题
def load_entry_point(namespace, entry_name, class_path):
"""Function to load temporary entry point. Need to load plugins to nose."""
distribution = pkg_resources.Distribution(__file__)
entry_point = pkg_resources.EntryPoint.parse(f'{entry_name} = {class_path}', dist=distribution)
distribution._ep_map = {namespace: {entry_name: entry_point}}
pkg_resources.working_set.add(distribution)
load_entry_point('nose.plugins.0.10', 'multiprocess_report', 'run_tests:MultiprocessReport')
# ... setting test args for multiprocessing here.
nose.run(argv=test_run_args,)
尝试运行并行进行鼻子测试,并希望在测试结束时做一份总结报告运行。
想在运行-in report
方法的最后使用nose自定义插件收集所有测试执行数据和聚合报告。
此代码 运行s 并行测试并使用自定义插件并在 运行 末尾调用它的 report
方法,但在执行期间不会调用 add** 挂钩并且不会收集数据用于聚合。
谁能告诉我为什么在测试期间跳过了 addSuccess、addError 和 addFailure 方法 运行?
如果我删除这些选项 --processes=16
,--process-timeout=360
那么插件中的挂钩可以正常工作,但这段代码中的重点是并行测试 运行 所以我无法删除他们。
import nose
import os
from nose.plugins import Plugin
class ReportPlugin(Plugin):
name = 'reportplugin'
score = 2500
def options(self, parser, env):
super(ReportPlugin, self).options(parser, env)
def configure(self, options, conf):
super(ReportPlugin, self).configure(options, conf)
self.enabled = True
def addSuccess(self, test, capt=None):
print('*** SUCCESS')
self.handler("SUCCESS", test)
def addError(self, test, err, capt=None):
print('*** ERROR')
self.handler("ERROR", test)
def addFailure(self, test, err, capt=None, tb_info=None):
print('*** FAILURE')
self.handler("FAILURE", test)
def handler(self, status, test):
# handle test run, collect status in multiprocessing manager
def report(self, stream):
# make nice report
TODO_TESTS = 'test_file.py'
path_to_tests = os.path.join(os.path.dirname(__file__), TODO_TESTS)
if __name__ == '__main__':
nose.run(
argv=['nosetests', '--processes=16', '--process-timeout=360', '--nocapture', '--verbose',
'--stop', '--with-xunitmp', '--xunitmp-file=report.xml', path_to_tests],
addplugins=[ReportPlugin()],
)
在将插件入口点加载到 nose.plugins.0.10
命名空间后解决了这个问题
def load_entry_point(namespace, entry_name, class_path):
"""Function to load temporary entry point. Need to load plugins to nose."""
distribution = pkg_resources.Distribution(__file__)
entry_point = pkg_resources.EntryPoint.parse(f'{entry_name} = {class_path}', dist=distribution)
distribution._ep_map = {namespace: {entry_name: entry_point}}
pkg_resources.working_set.add(distribution)
load_entry_point('nose.plugins.0.10', 'multiprocess_report', 'run_tests:MultiprocessReport')
# ... setting test args for multiprocessing here.
nose.run(argv=test_run_args,)