【问题标题】:Unit testing and coverage-ing a function using multiprocessing.Process() in python在 python 中使用 multiprocessing.Process() 对函数进行单元测试和覆盖
【发布时间】:2021-06-08 16:44:04
【问题描述】:

我正在尝试使用 multiprocessing.Process() 测试可能崩溃的函数。如果函数在 10 分钟内没有理想地响应,下面编写的代码将重新启动调用,这完全可以正常工作,即使 self.assert... 测试工作正常。问题出在覆盖率上,出于某种原因,在我的文件上运行覆盖率表明 my_func 正在被调用,但在测试时它内部没有任何内容被覆盖,而测试(需要执行整个函数而不会崩溃) ) 正在过去。

        while True:
           p = multiprocessing.Process(
               target=my_func, args=(return_dict) # return_dict to get the return values
           )
           p.start()
           p.join(600)

           if p.is_alive():
               print(
                   "Taking too long, "
                   + "KILLING IT and starting AGAIN."
               )
               p.kill()
               p.join()
           else:
               break

我做错了什么吗?如果信息似乎不完整,请告诉我,我将添加我的测试和功能。

【问题讨论】:

    标签: python code-coverage python-multiprocessing python-unittest coverage.py


    【解决方案1】:

    Reference link

    为了覆盖在子进程中运行的代码,您需要实际指定它。

    1. 在您的文件中添加import coverage import 语句

    2. 在每个 multiprocessing.Process() 语句的顶部添加 coverage.process_startup(),在我的例子中是这样的 -

      coverage.process_startup()

      p = multiprocessing.Process( 目标=我的函数,参数=(return_dict) )

      ....其余代码

    3. 在您的根目录中创建一个.coveragerc 文件并添加以下行以指定覆盖子进程和多处理。

      [运行]

      并发=多处理

    4. 设置一个名为COVERAGE_PROCESS_START的路径变量来存储.coveragerc文件的位置

      设置 COVERAGE_PROCESS_START=%cd%\.coveragerc // Windows

      导出 COVERAGE_PROCESS_START=$PWD/.coveragerc // UNIX/LINUX

    5. 一切就绪,使用coverage run -m unittest 运行测试,注意现在生成了超过 1 个覆盖率报告文件。将它们组合起来运行coverage combine,最后运行coverage report报告报告

    【讨论】:

      猜你喜欢
      • 2021-07-18
      • 1970-01-01
      • 1970-01-01
      • 2013-07-08
      • 2021-09-10
      • 2013-03-17
      • 2017-10-07
      • 2016-05-04
      相关资源
      最近更新 更多