package net.thucydides.core.batches.integration; import net.thucydides.core.batches.SystemVariableBasedBatchManager; import net.thucydides.core.util.MockEnvironmentVariables; import org.junit.Before; import org.junit.Test; import org.junit.runners.model.InitializationError; import java.util.ArrayList; import java.util.List; import java.util.concurrent.atomic.AtomicInteger; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.hasItems; import static org.hamcrest.Matchers.is; public class WhenCoordinatingTestBatches { MockEnvironmentVariables environmentVariables; @Before public void initMocks() { environmentVariables = new MockEnvironmentVariables(); } @Test public void should_keep_a_counter_of_tests_being_executed() { SystemVariableBasedBatchManager batchManager = new SystemVariableBasedBatchManager(environmentVariables); assertThat(batchManager.getCurrentTestCaseNumber(), is(0)); batchManager.registerTestCase(WhenCoordinatingTestBatches.class); assertThat(batchManager.getCurrentTestCaseNumber(), is(1)); } @Test public void by_default_all_tests_should_run() { SystemVariableBasedBatchManager batchManager = new SystemVariableBasedBatchManager(environmentVariables); int executedTests = 0; for(int i = 0; i < 50; i++) { if (batchManager.shouldExecuteThisTest(1)) { executedTests++; } } assertThat(executedTests, is(50)); } @Test public void should_flag_every_n_tests_to_be_run() { environmentVariables.setProperty("thucydides.batch.size", "10"); environmentVariables.setProperty("thucydides.batch.number", "1"); SystemVariableBasedBatchManager batchManager = new SystemVariableBasedBatchManager(environmentVariables); List<Integer> executedTests = new ArrayList<Integer>(); for(int testNumber = 1; testNumber <= 50; testNumber++) { batchManager.registerTestCase("Test Case " + testNumber); if (batchManager.shouldExecuteThisTest(1)) { executedTests.add(testNumber); } } assertThat(executedTests.size(), is(5)); assertThat(executedTests, hasItems(1,11,21,31,41)); } @Test public void should_support_the_old_batch_count_property() { environmentVariables.setProperty("thucydides.batch.count", "10"); environmentVariables.setProperty("thucydides.batch.number", "1"); SystemVariableBasedBatchManager batchManager = new SystemVariableBasedBatchManager(environmentVariables); List<Integer> executedTests = new ArrayList<Integer>(); for(int testNumber = 1; testNumber <= 50; testNumber++) { batchManager.registerTestCase("Test Case " + testNumber); if (batchManager.shouldExecuteThisTest(1)) { executedTests.add(testNumber); } } assertThat(executedTests.size(), is(5)); assertThat(executedTests, hasItems(1,11,21,31,41)); } @Test public void should_flag_every_2nd_tests_to_be_run() { environmentVariables.setProperty("thucydides.batch.size", "10"); environmentVariables.setProperty("thucydides.batch.number", "2"); SystemVariableBasedBatchManager batchManager = new SystemVariableBasedBatchManager(environmentVariables); List<Integer> executedTests = new ArrayList<Integer>(); for(int testNumber = 1; testNumber <= 50; testNumber++) { batchManager.registerTestCase("Test Case " + testNumber); if (batchManager.shouldExecuteThisTest(1)) { executedTests.add(testNumber); } } assertThat(executedTests.size(), is(5)); assertThat(executedTests, hasItems(2,12,22,32,42)); } @Test public void should_handle_tests_being_run_in_parallel() { environmentVariables.setProperty("thucydides.batch.size", "10"); SystemVariableBasedBatchManager batchManager = new SystemVariableBasedBatchManager(environmentVariables); List<Integer> executedTests = new ArrayList<Integer>(); for(int testNumber = 1; testNumber <= 50; testNumber++) { batchManager.registerTestCase("Test Case " + testNumber); if (batchManager.shouldExecuteThisTest(1)) { executedTests.add(testNumber); } } assertThat(executedTests.size(), is(5)); assertThat(executedTests, hasItems(10,20,30,40,50)); } public class TestRunnerThread extends Thread { List<Integer> executedTests = new ArrayList<Integer>(); private final SystemVariableBasedBatchManager batchManager; public TestRunnerThread(final SystemVariableBasedBatchManager batchManager) throws InitializationError { this.batchManager = batchManager; executedTests = new ArrayList<Integer>(); } public void run() { runFiftyTestCases(batchManager, executedTests); } public List<Integer> getExecutedTests() { return executedTests; } } private AtomicInteger counter = new AtomicInteger(1); private void runFiftyTestCases(SystemVariableBasedBatchManager batchManager, List<Integer> executedTests) { for(int testNumber = 0; testNumber < 50; testNumber++) { batchManager.registerTestCase("Test Case " + counter.getAndIncrement()); if (batchManager.shouldExecuteThisTest(1)) { executedTests.add(testNumber); } } } @Test public void the_test_runner_executes_the_steps_in_batches() throws InitializationError, InterruptedException { List<List<Integer>> executedTestResults = new ArrayList<List<Integer>>(); for(int i = 1; i <= 10; i++) { MockEnvironmentVariables threadVariables = new MockEnvironmentVariables(); threadVariables.setProperty("thucydides.batch.count", "10"); threadVariables.setProperty("thucydides.batch.number", Integer.toString(i)); SystemVariableBasedBatchManager batchManager = new SystemVariableBasedBatchManager(threadVariables); List<Integer> executedTests = new ArrayList<Integer>(); executedTestResults.add(executedTests); runFiftyTestCases(batchManager, executedTests); } assertThat(executedTestResults.get(0), hasItems(0,10,20,30,40)); assertThat(executedTestResults.get(1), hasItems(1,11,21,31,41)); assertThat(executedTestResults.get(2), hasItems(2,12,22,32,42)); assertThat(executedTestResults.get(3), hasItems(3,13,23,33,43)); assertThat(executedTestResults.get(4), hasItems(4,14,24,34,44)); assertThat(executedTestResults.get(5), hasItems(5,15,25,35,45)); assertThat(executedTestResults.get(6), hasItems(6,16,26,36,46)); assertThat(executedTestResults.get(7), hasItems(7,17,27,37,47)); assertThat(executedTestResults.get(8), hasItems(8,18,28,38,48)); assertThat(executedTestResults.get(9), hasItems(9,19,29,39,49)); } @Test public void the_test_runner_executes_the_steps_in_batches_when_tests_are_run_in_parallel() throws InitializationError, InterruptedException { List<TestRunnerThread> threads = new ArrayList<TestRunnerThread>(); for(int i = 1; i <= 10; i++) { MockEnvironmentVariables threadVariables = new MockEnvironmentVariables(); threadVariables.setProperty("thucydides.batch.count", "10"); threadVariables.setProperty("thucydides.batch.number", Integer.toString(i)); SystemVariableBasedBatchManager batchManager = new SystemVariableBasedBatchManager(threadVariables); threads.add(new TestRunnerThread(batchManager)); } for(TestRunnerThread thread : threads) { thread.start(); } for(TestRunnerThread thread : threads) { thread.join(); } assertThat(threads.get(0).getExecutedTests(), hasItems(0,10,20,30,40)); assertThat(threads.get(1).getExecutedTests(), hasItems(1,11,21,31,41)); assertThat(threads.get(2).getExecutedTests(), hasItems(2,12,22,32,42)); assertThat(threads.get(3).getExecutedTests(), hasItems(3,13,23,33,43)); assertThat(threads.get(4).getExecutedTests(), hasItems(4,14,24,34,44)); assertThat(threads.get(5).getExecutedTests(), hasItems(5,15,25,35,45)); assertThat(threads.get(6).getExecutedTests(), hasItems(6,16,26,36,46)); assertThat(threads.get(7).getExecutedTests(), hasItems(7,17,27,37,47)); assertThat(threads.get(8).getExecutedTests(), hasItems(8,18,28,38,48)); assertThat(threads.get(9).getExecutedTests(), hasItems(9,19,29,39,49)); } }