使用Subprocess模块​​运行phpunit测试套件

时间:2018-11-27 01:48:38

标签: python multiprocessing subprocess

我正在尝试使用python子进程和mulitprocessing模块来运行php单元测试用例以进行覆盖。在整个代码库中独立运行PHP Coverage会花费很多时间,因此我试图通过为不同的测试套件运行Coverage然后合并结果来使其并行化。为此,我正在使用Python Subprocess和Multiprocessing模块,我面临的问题是某些测试套件运行正常,但有些却逐渐消失。

我遇到以下错误PHP启动:apc_mmap失败,某些进程的错误代码为-9,-11。另外,对于一些具有很多测试用例(例如15K左右)的测试套件,phpunit运行的全部输出都不会输入。

我一次运行6个子进程,这就是我的VM中可用的cpu_core。

  1. 我正在使用以下命令初始化子进程

    Popen(cmd, shell=True, close_fds=True, stdout=file1, stderr=subprocess.PIPE)
    
  2. 我正在使用pr.poll()检查该过程是否完成。

我在初始化Popen对象时尝试将bufsize更改为1,但仍然无法获得Popen类的全部输出。

有人可以建议我可能做错了什么吗?

这是示例代码-

import multiprocessing as mp
import subprocess
def createProcesses(testSuites):
    procs = []
    maxProcs = mp.cpu_count()
    logfile = open("./testFile.txt", "w+")
    for suites in testSuites:
        while len(procs) != maxProcs:
            manageProcs(procs)
        procs.append(createWorkerTestProcesses)
    while len(procs):
        manageProcs(procs, logfile)
    logfile.close()

def createWorkerTestProcesses(suite):
    f= open(suite+"txt", "w+")
    cmd = "php -d auto_prepend_file=/usr/local/www/data/tests/app_includes/auto_prepend_for_tests.php /usr/local/www/data/tests/sdk/bin/phpunit.phar --configuration phpunit.xml --testsuites " + suite
    p = subprocess.Popen(cmd, shell=True, close_fds=True, stdout=f, stderr=subprocess.PIPE)
    return p, f, suite

def manageProcs(proclist, logfile):
    for p, f, suite in proclist:
        if p.poll is not None:
            f.seek(0)
            logfile.write(f.read())
            f.close()
            proclist.remove((p,f,suite))
    sleep(0.5)

def main():

    createProcesses(testSuites)

main()      

0 个答案:

没有答案