использовать модуль Subprocess для запуска тестовых пакетов phpunit - PullRequest
0 голосов
/ 27 ноября 2018

Я пытаюсь использовать подпроцессный и многопроцессорный модуль python для запуска модульных тестов php для покрытия.Выполнение автономного покрытия PHP для всей кодовой базы занимает много времени, поэтому я пытаюсь распараллелить его, запустив покрытие для разных наборов тестов и затем объединив результат.Для этого я использую Python Subprocess и Multiprocessing module, проблема, с которой я сталкиваюсь, заключается в том, что некоторые тестовые наборы работают правильно, но некоторые ошибаются.

Я получаю следующую ошибку Запуск PHP: ошибка apc_mmap, с кодом ошибки -9, -11 для некоторых процессов.Также для некоторых наборов тестов, в которых много тестовых примеров, например около 15 КБ, весь вывод прогона phpunit не поступает.

Я запускаю 6 подпроцессов одновременно, так как это доступно для cpu_coreв моей ВМ.

  1. Я инициализирую подпроцессы, используя следующую команду

    Popen(cmd, shell=True, close_fds=True, stdout=file1, stderr=subprocess.PIPE)
    
  2. И я использую pr.poll(), чтобы проверить, завершен ли процесс,

Я пытался изменить размер буфера до 1 при инициализации объекта Popen, но все еще не получил весь вывод класса 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()      
...