support/testing: run testcases in parallel

Let the user to pass -t to set the number of testcases to run
simultaneously.

When -j is not specified, calculate it to split the available cores
between the simultaneous testcases.

Example of auto calculated -j for cpu_count 8:
  -t -j  total
   1  9  9
   2  4  8
   3  3  9
   4  2  8
 >=5  1  t

Signed-off-by: Ricardo Martincoski <ricardo.martincoski@gmail.com>
Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
This commit is contained in:
Ricardo Martincoski 2017-06-28 23:45:48 -03:00 committed by Thomas Petazzoni
parent 1df8042ead
commit f98b93daaa
2 changed files with 18 additions and 1 deletions

View File

@ -2,5 +2,4 @@
plugins = nose2.plugins.mp plugins = nose2.plugins.mp
[multiprocess] [multiprocess]
processes = 1
always-on = True always-on = True

View File

@ -3,6 +3,7 @@ import argparse
import sys import sys
import os import os
import nose2 import nose2
import multiprocessing
from infra.basetest import BRTest from infra.basetest import BRTest
@ -23,6 +24,8 @@ def main():
parser.add_argument('-k', '--keep', parser.add_argument('-k', '--keep',
help='keep build directories', help='keep build directories',
action='store_true') action='store_true')
parser.add_argument('-t', '--testcases', type=int, default=1,
help='number of testcases to run simultaneously')
parser.add_argument('-j', '--jlevel', type=int, parser.add_argument('-j', '--jlevel', type=int,
help='BR2_JLEVEL to use for each testcase') help='BR2_JLEVEL to use for each testcase')
@ -72,15 +75,30 @@ def main():
BRTest.keepbuilds = args.keep BRTest.keepbuilds = args.keep
if args.testcases != 1:
if args.testcases < 1:
print "Invalid number of testcases to run simultaneously"
print ""
parser.print_help()
return 1
# same default BR2_JLEVEL as package/Makefile.in
br2_jlevel = 1 + multiprocessing.cpu_count()
each_testcase = br2_jlevel / args.testcases
if each_testcase < 1:
each_testcase = 1
BRTest.jlevel = each_testcase
if args.jlevel: if args.jlevel:
if args.jlevel < 0: if args.jlevel < 0:
print "Invalid BR2_JLEVEL to use for each testcase" print "Invalid BR2_JLEVEL to use for each testcase"
print "" print ""
parser.print_help() parser.print_help()
return 1 return 1
# the user can override the auto calculated value
BRTest.jlevel = args.jlevel BRTest.jlevel = args.jlevel
nose2_args = ["-v", nose2_args = ["-v",
"-N", str(args.testcases),
"-s", "support/testing", "-s", "support/testing",
"-c", "support/testing/conf/unittest.cfg"] "-c", "support/testing/conf/unittest.cfg"]