Параллельный запуск тестов. Python реализация

Robot Framework позволяет объединить отчёты от разных тестов в один. Для этого используется утилита rebot. Ниже представлен код python-программы, реализующий параллельный запуск двух тестов и объединение их отчетов.

# -*- coding: utf-8 -*-
import sys, time
from subprocess import Popen, list2cmdline
from robot import rebot

def exec_commands(cmds):
    ''' Exec commands in parallel
    '''
    if not cmds: return # empty list

    def done(p):
        return p.poll() is not None

    processes = []
    while True:
        while cmds:
            task = cmds.pop()
            print list2cmdline(task)
            processes.append(Popen(task))
        for p in processes:
            if done(p):
                processes.remove(p)
        if not processes and not cmds:
            break
        else:
            time.sleep(0.05)

path_to_test1 = 'C:/test_p1.txt'
path_to_test2 = 'C:/test_p2.txt'
commands = [
    ['c:/Python27/Scripts/pybot.bat', '--test', 'math_p1','--outputdir','c:/TMP','--output','test_set1_output.xml' ,'--report','test_set1_report.html','--log','test_set1_log.html',path_to_test1],
    ['c:/Python27/Scripts/pybot.bat', '--test', 'math_p2','--outputdir','c:/TMP','--output','test_set2_output.xml' ,'--report','test_set2_report.html','--log','test_set2_log.html',path_to_test2],
]
exec_commands(commands)
print "Merge test reports"
rebot('c:/TMP/test_set1_output.xml', 'c:/TMP/test_set2_output.xml', report='c:/TMP/common_report.html', log='c:/TMP/common_log.html',xunit='c:/TMP/xunit.xml')​

Здесь:

commands - команды запуска тестов, где каждый параметр является элементом списка
В итоге получаем общий отчёт, из которого видно, что оба тесты были запущены одновреммено