mirror of https://github.com/mongodb/mongo
129 lines
4.3 KiB
Python
129 lines
4.3 KiB
Python
"""Unit tests for suite_split_strategies.py."""
|
|
import unittest
|
|
|
|
import buildscripts.task_generation.suite_split_strategies as under_test
|
|
from buildscripts.util.teststats import TestRuntime
|
|
|
|
# pylint: disable=missing-docstring,invalid-name,unused-argument,no-self-use,protected-access,no-value-for-parameter
|
|
|
|
|
|
class TestDivideRemainingTestsAmongSuites(unittest.TestCase):
|
|
@staticmethod
|
|
def generate_tests_runtimes(n_tests):
|
|
tests_runtimes = []
|
|
# Iterating backwards so the list is sorted by descending runtimes
|
|
for idx in range(n_tests - 1, -1, -1):
|
|
name = "test_{0}".format(idx)
|
|
tests_runtimes.append(TestRuntime(name, 2 * idx))
|
|
|
|
return tests_runtimes
|
|
|
|
def test_each_suite_gets_one_test(self):
|
|
suites = [[] for _ in range(3)]
|
|
tests_runtimes = self.generate_tests_runtimes(3)
|
|
|
|
under_test.divide_remaining_tests_among_suites(tests_runtimes, suites)
|
|
|
|
for suite in suites:
|
|
self.assertEqual(len(suite), 1)
|
|
|
|
def test_each_suite_gets_at_least_one_test(self):
|
|
suites = [[] for _ in range(3)]
|
|
tests_runtimes = self.generate_tests_runtimes(5)
|
|
|
|
under_test.divide_remaining_tests_among_suites(tests_runtimes, suites)
|
|
|
|
for suite in suites:
|
|
self.assertGreaterEqual(len(suite), 1)
|
|
|
|
total_tests = sum(len(suite) for suite in suites)
|
|
self.assertEqual(total_tests, len(tests_runtimes))
|
|
|
|
|
|
class TestGreedyDivision(unittest.TestCase):
|
|
def test_if_less_total_than_max_only_one_suite_created(self):
|
|
max_time = 20
|
|
tests_runtimes = [
|
|
TestRuntime("test1", 5),
|
|
TestRuntime("test2", 4),
|
|
TestRuntime("test3", 3),
|
|
]
|
|
|
|
suites = under_test.greedy_division(tests_runtimes, max_time)
|
|
|
|
self.assertEqual(len(suites), 1)
|
|
for test in tests_runtimes:
|
|
self.assertIn(test.test_name, suites[0])
|
|
|
|
def test_if_each_test_should_be_own_suite(self):
|
|
max_time = 5
|
|
tests_runtimes = [
|
|
TestRuntime("test1", 5),
|
|
TestRuntime("test2", 4),
|
|
TestRuntime("test3", 3),
|
|
]
|
|
|
|
suites = under_test.greedy_division(tests_runtimes, max_time)
|
|
|
|
self.assertEqual(len(suites), 3)
|
|
|
|
def test_if_test_is_greater_than_max_it_goes_alone(self):
|
|
max_time = 7
|
|
tests_runtimes = [
|
|
TestRuntime("test1", 15),
|
|
TestRuntime("test2", 4),
|
|
TestRuntime("test3", 3),
|
|
]
|
|
|
|
suites = under_test.greedy_division(tests_runtimes, max_time)
|
|
|
|
self.assertEqual(len(suites), 2)
|
|
self.assertEqual(len(suites[0]), 1)
|
|
self.assertIn("test1", suites[0])
|
|
|
|
def test_max_sub_suites_options(self):
|
|
max_time = 5
|
|
max_suites = 2
|
|
tests_runtimes = [
|
|
TestRuntime("test1", 5),
|
|
TestRuntime("test2", 4),
|
|
TestRuntime("test3", 3),
|
|
TestRuntime("test4", 4),
|
|
TestRuntime("test5", 3),
|
|
]
|
|
|
|
suites = under_test.greedy_division(tests_runtimes, max_time, max_suites=max_suites)
|
|
|
|
self.assertEqual(len(suites), max_suites)
|
|
total_tests = sum(len(suite) for suite in suites)
|
|
self.assertEqual(total_tests, len(tests_runtimes))
|
|
|
|
def test_max_tests_per_suites_is_one(self):
|
|
max_time = 5
|
|
num_tests = 10
|
|
tests_runtimes = [TestRuntime(f"tests_{i}", i) for i in range(num_tests)]
|
|
|
|
suites = under_test.greedy_division(tests_runtimes, max_time, max_tests_per_suite=1)
|
|
|
|
self.assertEqual(len(suites), num_tests)
|
|
|
|
def test_max_tests_per_suites_is_less_than_number_of_tests(self):
|
|
max_time = 100
|
|
num_tests = 10
|
|
tests_runtimes = [TestRuntime(f"tests_{i}", 1) for i in range(num_tests)]
|
|
|
|
suites = under_test.greedy_division(tests_runtimes, max_time, max_tests_per_suite=2)
|
|
|
|
self.assertEqual(len(suites), num_tests // 2)
|
|
|
|
def test_max_suites_overrides_max_tests_per_suite(self):
|
|
max_time = 100
|
|
num_tests = 10
|
|
max_suites = 2
|
|
tests_runtimes = [TestRuntime(f"tests_{i}", 1) for i in range(num_tests)]
|
|
|
|
suites = under_test.greedy_division(tests_runtimes, max_time, max_suites=max_suites,
|
|
max_tests_per_suite=2)
|
|
|
|
self.assertEqual(len(suites), max_suites)
|