diff --git a/README.md b/README.md index 4022e362cd..12ddad6e45 100644 --- a/README.md +++ b/README.md @@ -169,6 +169,14 @@ flank: ## Default: false # smart-flank-disable-upload: false + ## Enable using average time from previous tests duration when using SmartShard and tests did not run before. + ## Default: false + # use-average-test-time-for-new-tests: true + + ## Set default test time used for calculating shards. + ## Default: 120.0 + # default-test-time: 15 + ## Disables sharding. Useful for parameterized tests. # disable-sharding: false @@ -385,6 +393,14 @@ flank: ## Default: false # smart-flank-disable-upload: false + ## Enable using average time from previous tests duration when using SmartShard and tests did not run before. + ## Default: false + # use-average-test-time-for-new-tests: true + + ## Set default test time used for calculating shards. + ## Default: 120.0 + # default-test-time: 15 + ## Disables sharding. Useful for parameterized tests. # disable-sharding: false diff --git a/test_runner/flank.ios.yml b/test_runner/flank.ios.yml index f0e7f5db55..0993182c70 100644 --- a/test_runner/flank.ios.yml +++ b/test_runner/flank.ios.yml @@ -101,6 +101,14 @@ flank: ## Default: false # smart-flank-disable-upload: false + ## Enable using average time from previous tests duration when using SmartShard and tests did not run before. + ## Default: false + # use-average-test-time-for-new-tests: true + + ## Set default test time used for calculating shards. + ## Default: 120.0 + # default-test-time: 15 + ## Disables sharding. Useful for parameterized tests. # disable-sharding: false diff --git a/test_runner/flank.yml b/test_runner/flank.yml index 9dca0ee356..436d9cf966 100644 --- a/test_runner/flank.yml +++ b/test_runner/flank.yml @@ -161,6 +161,14 @@ flank: ## Default: false # smart-flank-disable-upload: false + ## Enable using average time from previous tests duration when using SmartShard and tests did not run before. + ## Default: false + # use-average-test-time-for-new-tests: true + + ## Set default test time used for calculating shards. + ## Default: 120.0 + # default-test-time: 15 + ## Disables sharding. Useful for parameterized tests. # disable-sharding: false diff --git a/test_runner/src/main/kotlin/ftl/args/AndroidArgs.kt b/test_runner/src/main/kotlin/ftl/args/AndroidArgs.kt index faa66e1362..03133a3a43 100644 --- a/test_runner/src/main/kotlin/ftl/args/AndroidArgs.kt +++ b/test_runner/src/main/kotlin/ftl/args/AndroidArgs.kt @@ -58,6 +58,8 @@ AndroidArgs num-test-runs: $repeatTests smart-flank-gcs-path: $smartFlankGcsPath smart-flank-disable-upload: $smartFlankDisableUpload + default-test-time: $defaultTestTime + use-average-test-time-for-new-tests: $useAverageTestTimeForNewTests files-to-download:${ArgsToString.listToString(filesToDownload)} test-targets-always-run:${ArgsToString.listToString(testTargetsAlwaysRun)} disable-sharding: $disableSharding diff --git a/test_runner/src/main/kotlin/ftl/args/CommonArgs.kt b/test_runner/src/main/kotlin/ftl/args/CommonArgs.kt index 7112851a31..dff7e91f5e 100644 --- a/test_runner/src/main/kotlin/ftl/args/CommonArgs.kt +++ b/test_runner/src/main/kotlin/ftl/args/CommonArgs.kt @@ -34,5 +34,7 @@ data class CommonArgs( override val ignoreFailedTests: Boolean, override val keepFilePath: Boolean, override val outputStyle: OutputStyle, - override val disableResultsUpload: Boolean + override val disableResultsUpload: Boolean, + override val defaultTestTime: Double, + override val useAverageTestTimeForNewTests: Boolean, ) : IArgs diff --git a/test_runner/src/main/kotlin/ftl/args/CreateCommonArgs.kt b/test_runner/src/main/kotlin/ftl/args/CreateCommonArgs.kt index 82180b6a27..0838411662 100644 --- a/test_runner/src/main/kotlin/ftl/args/CreateCommonArgs.kt +++ b/test_runner/src/main/kotlin/ftl/args/CreateCommonArgs.kt @@ -41,7 +41,9 @@ fun CommonConfig.createCommonArgs( filesToDownload = flank.filesToDownload!!, disableSharding = flank.disableSharding!!, localResultDir = flank.localResultsDir!!, - disableResultsUpload = flank.disableResultsUpload!! + disableResultsUpload = flank.disableResultsUpload!!, + defaultTestTime = flank.defaultTestTime!!, + useAverageTestTimeForNewTests = flank.useAverageTestTimeForNewTests!! ).apply { ArgsHelper.createJunitBucket(project, smartFlankGcsPath) } diff --git a/test_runner/src/main/kotlin/ftl/args/IArgs.kt b/test_runner/src/main/kotlin/ftl/args/IArgs.kt index 1e2cc949d4..d7aa8f2725 100644 --- a/test_runner/src/main/kotlin/ftl/args/IArgs.kt +++ b/test_runner/src/main/kotlin/ftl/args/IArgs.kt @@ -59,6 +59,9 @@ interface IArgs { val inVirtualRange: Boolean get() = maxTestShards in AVAILABLE_VIRTUAL_SHARD_COUNT_RANGE + val defaultTestTime: Double + val useAverageTestTimeForNewTests: Boolean + fun useLocalResultDir() = localResultDir != defaultLocalResultsDir companion object { diff --git a/test_runner/src/main/kotlin/ftl/args/IosArgs.kt b/test_runner/src/main/kotlin/ftl/args/IosArgs.kt index fdf625b3db..98449288b3 100644 --- a/test_runner/src/main/kotlin/ftl/args/IosArgs.kt +++ b/test_runner/src/main/kotlin/ftl/args/IosArgs.kt @@ -43,6 +43,8 @@ IosArgs num-test-runs: $repeatTests smart-flank-gcs-path: $smartFlankGcsPath smart-flank-disable-upload: $smartFlankDisableUpload + default-test-time: $defaultTestTime + use-average-test-time-for-new-tests: $useAverageTestTimeForNewTests test-targets-always-run:${ArgsToString.listToString(testTargetsAlwaysRun)} files-to-download:${ArgsToString.listToString(filesToDownload)} keep-file-path: $keepFilePath diff --git a/test_runner/src/main/kotlin/ftl/config/common/CommonFlankConfig.kt b/test_runner/src/main/kotlin/ftl/config/common/CommonFlankConfig.kt index fbbf20384c..824006927c 100644 --- a/test_runner/src/main/kotlin/ftl/config/common/CommonFlankConfig.kt +++ b/test_runner/src/main/kotlin/ftl/config/common/CommonFlankConfig.kt @@ -7,6 +7,7 @@ import ftl.args.ArgsHelper import ftl.args.yml.IYmlKeys import ftl.config.Config import ftl.config.FtlConstants +import ftl.shard.DEFAULT_TEST_TIME_SEC import picocli.CommandLine /** Flank specific parameters for both iOS and Android */ @@ -140,6 +141,20 @@ data class CommonFlankConfig @JsonIgnore constructor( @set:JsonProperty("disable-results-upload") var disableResultsUpload: Boolean? by data + @set:CommandLine.Option( + names = ["--default-test-time"], + description = ["Set default test time used for calculating shards."] + ) + @set:JsonProperty("default-test-time") + var defaultTestTime: Double? by data + + @set:CommandLine.Option( + names = ["--use-average-test-time-for-new-tests"], + description = ["Enable using average time from previous tests duration when using SmartShard and tests did not run before."] + ) + @set:JsonProperty("use-average-test-time-for-new-tests") + var useAverageTestTimeForNewTests: Boolean? by data + constructor() : this(mutableMapOf().withDefault { null }) companion object : IYmlKeys { @@ -184,6 +199,8 @@ data class CommonFlankConfig @JsonIgnore constructor( keepFilePath = false outputStyle = null disableResultsUpload = false + defaultTestTime = DEFAULT_TEST_TIME_SEC + useAverageTestTimeForNewTests = false } } } diff --git a/test_runner/src/main/kotlin/ftl/shard/Shard.kt b/test_runner/src/main/kotlin/ftl/shard/Shard.kt index 19350fe858..76b1a77433 100644 --- a/test_runner/src/main/kotlin/ftl/shard/Shard.kt +++ b/test_runner/src/main/kotlin/ftl/shard/Shard.kt @@ -45,7 +45,7 @@ fun createShardsByShardCount( val maxShards = maxShards(args.maxTestShards, forcedShardCount) val previousMethodDurations = createTestMethodDurationMap(oldTestResult, args) - val testCases = createTestCases(testsToRun, previousMethodDurations) + val testCases = createTestCases(testsToRun, previousMethodDurations, args) .sortedByDescending(TestMethod::time) // We want to iterate over testcase going from slowest to fastest val testCount = getNumberOfNotIgnoredTestCases(testCases) diff --git a/test_runner/src/main/kotlin/ftl/shard/ShardCount.kt b/test_runner/src/main/kotlin/ftl/shard/ShardCount.kt index a6b6eeb10e..914ec5dd8a 100644 --- a/test_runner/src/main/kotlin/ftl/shard/ShardCount.kt +++ b/test_runner/src/main/kotlin/ftl/shard/ShardCount.kt @@ -26,14 +26,26 @@ private fun calculateShardCount( testsToRun: List, oldTestResult: JUnitTestResult, args: IArgs -): Int = calculateShardCount( - args = args, - testsTotalTime = testTotalTime(testsToRun, createTestMethodDurationMap(oldTestResult, args)), - testsToRunCount = testsToRun.size -) - -private fun testTotalTime(testsToRun: List, previousMethodDurations: Map): Double = - testsToRun.sumByDouble { flankTestMethod -> getTestMethodTime(flankTestMethod, previousMethodDurations) } +): Int { + val previousMethodDurations = createTestMethodDurationMap(oldTestResult, args) + return calculateShardCount( + args = args, + testsTotalTime = testTotalTime(testsToRun, previousMethodDurations, args.fallbackTestTime(previousMethodDurations)), + testsToRunCount = testsToRun.size + ) +} + +private fun testTotalTime( + testsToRun: List, + previousMethodDurations: Map, + defaultTestTime: Double +) = testsToRun.sumByDouble { flankTestMethod -> + getTestMethodTime( + flankTestMethod, + previousMethodDurations, + defaultTestTime + ) +} private fun calculateShardCount( args: IArgs, diff --git a/test_runner/src/main/kotlin/ftl/shard/TestCasesCreator.kt b/test_runner/src/main/kotlin/ftl/shard/TestCasesCreator.kt index 4a4995a59a..6e930829b8 100644 --- a/test_runner/src/main/kotlin/ftl/shard/TestCasesCreator.kt +++ b/test_runner/src/main/kotlin/ftl/shard/TestCasesCreator.kt @@ -1,5 +1,6 @@ package ftl.shard +import ftl.args.IArgs import ftl.util.FlankTestMethod data class TestMethod( @@ -7,6 +8,21 @@ data class TestMethod( val time: Double ) -fun createTestCases(testsToRun: List, previousMethodDurations: Map): List { - return testsToRun.map { TestMethod(it.testName, getTestMethodTime(it, previousMethodDurations)) } +fun createTestCases( + testsToRun: List, + previousMethodDurations: Map, + args: IArgs, +): List { + val defaultTestTime = args.fallbackTestTime(previousMethodDurations) + return testsToRun + .map { + TestMethod( + name = it.testName, + time = getTestMethodTime( + flankTestMethod = it, + previousMethodDurations = previousMethodDurations, + defaultTestTime = defaultTestTime + ) + ) + } } diff --git a/test_runner/src/main/kotlin/ftl/shard/TestMethodTime.kt b/test_runner/src/main/kotlin/ftl/shard/TestMethodTime.kt index a1f4cc7779..c70c1f55f6 100644 --- a/test_runner/src/main/kotlin/ftl/shard/TestMethodTime.kt +++ b/test_runner/src/main/kotlin/ftl/shard/TestMethodTime.kt @@ -1,18 +1,26 @@ package ftl.shard -import com.google.common.annotations.VisibleForTesting +import ftl.args.IArgs import ftl.util.FlankTestMethod -// When a test does not have previous results to reference, fall back to this run time. -@VisibleForTesting -const val DEFAULT_TEST_TIME_SEC = 120.0 +fun getTestMethodTime( + flankTestMethod: FlankTestMethod, + previousMethodDurations: Map, + defaultTestTime: Double +) = if (flankTestMethod.ignored) IGNORE_TEST_TIME else previousMethodDurations.getOrElse(flankTestMethod.testName) { + defaultTestTime +} + +fun IArgs.fallbackTestTime( + previousMethodDurations: Map +) = if (useAverageTestTimeForNewTests) previousMethodDurations.averageTestTime(defaultTestTime) else defaultTestTime + +private fun Map.averageTestTime(defaultTestTime: Double) = values + .filter { it > IGNORE_TEST_TIME } + .average() + .takeIf { !it.isNaN() } + ?: defaultTestTime -@VisibleForTesting const val IGNORE_TEST_TIME = 0.0 -fun getTestMethodTime(flankTestMethod: FlankTestMethod, previousMethodDurations: Map): Double { - return if (flankTestMethod.ignored) IGNORE_TEST_TIME else previousMethodDurations.getOrDefault( - flankTestMethod.testName, - DEFAULT_TEST_TIME_SEC - ) -} +const val DEFAULT_TEST_TIME_SEC = 120.0 diff --git a/test_runner/src/test/kotlin/ftl/args/AndroidArgsTest.kt b/test_runner/src/test/kotlin/ftl/args/AndroidArgsTest.kt index 08a8b665a0..7a1f601bd1 100644 --- a/test_runner/src/test/kotlin/ftl/args/AndroidArgsTest.kt +++ b/test_runner/src/test/kotlin/ftl/args/AndroidArgsTest.kt @@ -108,6 +108,8 @@ class AndroidArgsTest { max-test-shards: 7 shard-time: 60 num-test-runs: 8 + default-test-time: 15.0 + use-average-test-time-for-new-tests: true files-to-download: - /sdcard/screenshots - /sdcard/screenshots2 @@ -317,6 +319,8 @@ AndroidArgs num-test-runs: 8 smart-flank-gcs-path:${' '} smart-flank-disable-upload: false + default-test-time: 15.0 + use-average-test-time-for-new-tests: true files-to-download: - /sdcard/screenshots - /sdcard/screenshots2 @@ -382,6 +386,8 @@ AndroidArgs num-test-runs: 1 smart-flank-gcs-path: smart-flank-disable-upload: false + default-test-time: 120.0 + use-average-test-time-for-new-tests: false files-to-download: test-targets-always-run: disable-sharding: false @@ -1676,6 +1682,61 @@ AndroidArgs """.trimIndent() AndroidArgs.load(yaml) } + + @Test + fun `should set defaultTestTime`() { + val yaml = """ + gcloud: + app: $appApk + test: $testApk + flank: + max-test-shards: -1 + default-test-time: 15 + """.trimIndent() + val args = AndroidArgs.load(yaml) + assertEquals(args.defaultTestTime, 15.0, 0.01) + } + + @Test + fun `should set defaultTestTime to default value if not specified`() { + val yaml = """ + gcloud: + app: $appApk + test: $testApk + flank: + max-test-shards: -1 + use-average-test-time-for-new-tests: true + """.trimIndent() + val args = AndroidArgs.load(yaml) + assertEquals(args.defaultTestTime, 120.0, 0.01) + } + + @Test + fun `should useAverageTestTimeForNewTests set to true`() { + val yaml = """ + gcloud: + app: $appApk + test: $testApk + flank: + max-test-shards: -1 + use-average-test-time-for-new-tests: true + """.trimIndent() + val args = AndroidArgs.load(yaml) + assertTrue(args.useAverageTestTimeForNewTests) + } + + @Test + fun `should useAverageTestTimeForNewTests set to false by defaul`() { + val yaml = """ + gcloud: + app: $appApk + test: $testApk + flank: + max-test-shards: -1 + """.trimIndent() + val args = AndroidArgs.load(yaml) + assertFalse(args.useAverageTestTimeForNewTests) + } } private fun AndroidArgs.Companion.load(yamlData: String, cli: AndroidRunCommand? = null): AndroidArgs = diff --git a/test_runner/src/test/kotlin/ftl/args/IosArgsTest.kt b/test_runner/src/test/kotlin/ftl/args/IosArgsTest.kt index b29ae89aae..0dab070d92 100644 --- a/test_runner/src/test/kotlin/ftl/args/IosArgsTest.kt +++ b/test_runner/src/test/kotlin/ftl/args/IosArgsTest.kt @@ -14,6 +14,7 @@ import ftl.test.util.TestHelper.assert import ftl.test.util.TestHelper.getPath import ftl.test.util.assertThrowsWithMessage import ftl.util.FlankConfigurationError +import org.junit.Assert import org.junit.Assert.assertEquals import org.junit.Assert.assertFalse import org.junit.Assume @@ -68,6 +69,8 @@ class IosArgsTest { max-test-shards: 7 shard-time: 60 num-test-runs: 8 + default-test-time: 15.0 + use-average-test-time-for-new-tests: true files-to-download: - /sdcard/screenshots test-targets-always-run: @@ -219,6 +222,8 @@ IosArgs num-test-runs: 8 smart-flank-gcs-path:${' '} smart-flank-disable-upload: false + default-test-time: 15.0 + use-average-test-time-for-new-tests: true test-targets-always-run: - a/testGrantPermissions - a/testGrantPermissions2 @@ -272,6 +277,8 @@ IosArgs num-test-runs: 1 smart-flank-gcs-path: smart-flank-disable-upload: false + default-test-time: 120.0 + use-average-test-time-for-new-tests: false test-targets-always-run: files-to-download: keep-file-path: false @@ -960,6 +967,61 @@ IosArgs """.trimIndent() IosArgs.load(yaml) } + + @Test + fun `should set defaultTestTime`() { + val yaml = """ + gcloud: + test: $testPath + xctestrun-file: $testPath + flank: + max-test-shards: -1 + default-test-time: 15 + """.trimIndent() + val args = IosArgs.load(yaml) + assertEquals(args.defaultTestTime, 15.0, 0.01) + } + + @Test + fun `should set defaultTestTime to default value if not specified`() { + val yaml = """ + gcloud: + test: $testPath + xctestrun-file: $testPath + flank: + max-test-shards: -1 + use-average-test-time-for-new-tests: true + """.trimIndent() + val args = IosArgs.load(yaml) + assertEquals(args.defaultTestTime, 120.0, 0.01) + } + + @Test + fun `should useAverageTestTimeForNewTests set to true`() { + val yaml = """ + gcloud: + test: $testPath + xctestrun-file: $testPath + flank: + max-test-shards: -1 + use-average-test-time-for-new-tests: true + """.trimIndent() + val args = IosArgs.load(yaml) + Assert.assertTrue(args.useAverageTestTimeForNewTests) + } + + @Test + fun `should useAverageTestTimeForNewTests set to false by defaul`() { + val yaml = """ + gcloud: + test: $testPath + xctestrun-file: $testPath + flank: + max-test-shards: -1 + """.trimIndent() + val args = IosArgs.load(yaml) + assertFalse(args.useAverageTestTimeForNewTests) + } } private fun IosArgs.Companion.load(yamlData: String, cli: IosRunCommand? = null): IosArgs = diff --git a/test_runner/src/test/kotlin/ftl/cli/firebase/test/android/AndroidRunCommandTest.kt b/test_runner/src/test/kotlin/ftl/cli/firebase/test/android/AndroidRunCommandTest.kt index 0cd8459736..ae3e4d59c7 100644 --- a/test_runner/src/test/kotlin/ftl/cli/firebase/test/android/AndroidRunCommandTest.kt +++ b/test_runner/src/test/kotlin/ftl/cli/firebase/test/android/AndroidRunCommandTest.kt @@ -467,4 +467,20 @@ class AndroidRunCommandTest { assertThat(cmd.obfuscate).isTrue() } + + @Test + fun `default-test-time parse`() { + val cmd = AndroidRunCommand() + CommandLine(cmd).parseArgs("--default-test-time=15") + + assertThat(cmd.config.common.flank.defaultTestTime).isEqualTo(15.0) + } + + @Test + fun `use-average-test-time-for-new-tests parse`() { + val cmd = AndroidRunCommand() + CommandLine(cmd).parseArgs("--use-average-test-time-for-new-tests") + + assertThat(cmd.config.common.flank.useAverageTestTimeForNewTests).isTrue() + } } diff --git a/test_runner/src/test/kotlin/ftl/cli/firebase/test/ios/IosRunCommandTest.kt b/test_runner/src/test/kotlin/ftl/cli/firebase/test/ios/IosRunCommandTest.kt index 87c47744e3..d71ababfca 100644 --- a/test_runner/src/test/kotlin/ftl/cli/firebase/test/ios/IosRunCommandTest.kt +++ b/test_runner/src/test/kotlin/ftl/cli/firebase/test/ios/IosRunCommandTest.kt @@ -321,4 +321,20 @@ class IosRunCommandTest { assertThat(cmd.obfuscate).isTrue() } + + @Test + fun `default-test-time parse`() { + val cmd = IosRunCommand() + CommandLine(cmd).parseArgs("--default-test-time=15") + + assertThat(cmd.config.common.flank.defaultTestTime).isEqualTo(15.0) + } + + @Test + fun `use-average-test-time-for-new-tests parse`() { + val cmd = IosRunCommand() + CommandLine(cmd).parseArgs("--use-average-test-time-for-new-tests") + + assertThat(cmd.config.common.flank.useAverageTestTimeForNewTests).isTrue() + } } diff --git a/test_runner/src/test/kotlin/ftl/shard/ShardTest.kt b/test_runner/src/test/kotlin/ftl/shard/ShardTest.kt index 674f655dbe..1db0f0f58a 100644 --- a/test_runner/src/test/kotlin/ftl/shard/ShardTest.kt +++ b/test_runner/src/test/kotlin/ftl/shard/ShardTest.kt @@ -178,7 +178,7 @@ class ShardTest { @Test fun `tests annotated with @Ignore should have time 0 and do not hav impact on sharding`() { - val androidMockedArgs = mockk() + val androidMockedArgs = mockk(relaxed = true) every { androidMockedArgs.maxTestShards } returns 2 every { androidMockedArgs.shardTime } returns 10 @@ -205,7 +205,7 @@ class ShardTest { @Test fun `tests annotated with @Ignore should not produce additional shards`() { - val androidMockedArgs = mockk() + val androidMockedArgs = mockk(relaxed = true) every { androidMockedArgs.maxTestShards } returns IArgs.AVAILABLE_PHYSICAL_SHARD_COUNT_RANGE.last every { androidMockedArgs.shardTime } returns -1 diff --git a/test_runner/src/test/kotlin/ftl/shard/ShardTestCommon.kt b/test_runner/src/test/kotlin/ftl/shard/ShardTestCommon.kt index 53674f9c73..6538d918a7 100644 --- a/test_runner/src/test/kotlin/ftl/shard/ShardTestCommon.kt +++ b/test_runner/src/test/kotlin/ftl/shard/ShardTestCommon.kt @@ -33,5 +33,7 @@ internal fun mockArgs(maxTestShards: Int, shardTime: Int = 0): IArgs { val mockArgs = mockk() every { mockArgs.maxTestShards } returns maxTestShards every { mockArgs.shardTime } returns shardTime + every { mockArgs.defaultTestTime } returns 120.0 + every { mockArgs.useAverageTestTimeForNewTests } returns false return mockArgs } diff --git a/test_runner/src/test/kotlin/ftl/shard/TestCasesCreatorTest.kt b/test_runner/src/test/kotlin/ftl/shard/TestCasesCreatorTest.kt index db4d4d9e54..d59a281c92 100644 --- a/test_runner/src/test/kotlin/ftl/shard/TestCasesCreatorTest.kt +++ b/test_runner/src/test/kotlin/ftl/shard/TestCasesCreatorTest.kt @@ -1,8 +1,11 @@ package ftl.shard import com.google.common.truth.Truth.assertThat +import ftl.args.IArgs import ftl.test.util.FlankTestRunner import ftl.util.FlankTestMethod +import io.mockk.every +import io.mockk.mockk import org.junit.Test import org.junit.runner.RunWith @@ -21,9 +24,13 @@ internal class TestCasesCreatorTest { // given val ignoredTestMethods = testMethods.map { it.copy(ignored = true) } val expectedTestTime = IGNORE_TEST_TIME + val args = mockk { + every { useAverageTestTimeForNewTests } returns true + every { defaultTestTime } returns 10.0 + } // when - val createdTestCases = createTestCases(ignoredTestMethods, mapOf()) + val createdTestCases = createTestCases(ignoredTestMethods, mapOf(), args) // then createdTestCases.forEach { @@ -32,12 +39,40 @@ internal class TestCasesCreatorTest { } @Test - fun `should create test cases with default time for test methods not found in map`() { + fun `should create test cases with provided default time for test methods not found in map`() { // given - val expectedTestTime = DEFAULT_TEST_TIME_SEC + val expectedTestTime = 10.0 + val args = mockk { + every { useAverageTestTimeForNewTests } returns false + every { defaultTestTime } returns 10.0 + } // when - val createdTestCases = createTestCases(testMethods, mapOf()) + val createdTestCases = createTestCases(testMethods, mapOf(), args) + + // then + createdTestCases.forEach { + assertThat(it.time).isEqualTo(expectedTestTime) + } + } + + @Test + fun `should create test cases with average time of previous methods for test methods not found in map`() { + // given + val previousTestMethods = mapOf( + "oldA" to 12.0, + "oldB" to 6.0, + "oldC" to 18.0, + "oldD" to 12.0, + ) + val expectedTestTime = previousTestMethods.values.average() + val args = mockk { + every { useAverageTestTimeForNewTests } returns true + every { defaultTestTime } returns 10.0 + } + + // when + val createdTestCases = createTestCases(testMethods, previousTestMethods, args) // then createdTestCases.forEach { @@ -50,9 +85,13 @@ internal class TestCasesCreatorTest { // given val previousTestTimeSeconds = 12.0 val previousMapDuration = testMethods.associate { it.testName to previousTestTimeSeconds } + val args = mockk { + every { useAverageTestTimeForNewTests } returns true + every { defaultTestTime } returns 10.0 + } // when - val createdTestCases = createTestCases(testMethods, previousMapDuration) + val createdTestCases = createTestCases(testMethods, previousMapDuration, args) // then createdTestCases.forEach {