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,)