Package net.thucydides.core.batches.integration

Source Code of net.thucydides.core.batches.integration.WhenUseTestCountBasedBatchStrategy$TestRunnerThread

package net.thucydides.core.batches.integration;

import net.thucydides.core.batches.TestCountBasedBatchManager;
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.Arrays;
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 WhenUseTestCountBasedBatchStrategy {
  private MockEnvironmentVariables environmentVariables;
  private List<Integer> testCountInTestCase;
  private AtomicInteger counter = new AtomicInteger(1);

  @Before
  public void initMocks() {
    environmentVariables = new MockEnvironmentVariables();
    testCountInTestCase = Arrays.asList(3, 8, 1, 9, 1, 2, 1);
  }

  @Test
  public void should_keep_a_counter_of_tests_being_executed() {
    TestCountBasedBatchManager batchManager = new TestCountBasedBatchManager(environmentVariables);

    assertThat(batchManager.getCurrentTestCaseNumber(), is(0));

    batchManager.registerTestCase(WhenUseTestCountBasedBatchStrategy.class);

    assertThat(batchManager.getCurrentTestCaseNumber(), is(1));
  }

  @Test
  public void by_default_all_tests_should_run() {
    TestCountBasedBatchManager batchManager = new TestCountBasedBatchManager(environmentVariables);

    int executedTests = 0;
    for (int i = 0; i < 50; i++) {
      if (batchManager.shouldExecuteThisTest(i)) {
        executedTests++;
      }
    }

    assertThat(executedTests, is(50));
  }

  @Test
  public void should_split_tests_between_batches_optimally() {
    List<List<Integer>> executedTestResults = new ArrayList<List<Integer>>();
    for (int i = 1; i <= 3; i++) {
      MockEnvironmentVariables threadVariables = new MockEnvironmentVariables();
      threadVariables.setProperty("thucydides.batch.count", "3");
      threadVariables.setProperty("thucydides.batch.number", Integer.toString(i));
      TestCountBasedBatchManager batchManager = new TestCountBasedBatchManager(threadVariables);
      List<Integer> executedTests = new ArrayList<Integer>();
      executedTestResults.add(executedTests);
      runPreparedTestCases(batchManager, executedTests);
    }

    assertThat(executedTestResults.get(0), hasItems(2));
    assertThat(executedTestResults.get(1), hasItems(3, 4));
    assertThat(executedTestResults.get(2), hasItems(1, 5, 6, 7));
  }

  @Test
  public void should_split_tests_between_batches_optimally_when_tests_are_run_in_parallel() throws InitializationError, InterruptedException {
    List<TestRunnerThread> threads = new ArrayList<TestRunnerThread>();
   
    for (int i = 1; i <= 3; i++) {
      MockEnvironmentVariables threadVariables = new MockEnvironmentVariables();
      threadVariables.setProperty("thucydides.batch.count", "3");
      threadVariables.setProperty("thucydides.batch.number", Integer.toString(i));
      TestCountBasedBatchManager batchManager = new TestCountBasedBatchManager(threadVariables);
      threads.add(new TestRunnerThread(batchManager));
    }
   
    for(TestRunnerThread thread : threads) {
            thread.start();
        }

        for(TestRunnerThread thread : threads) {
            thread.join();
        }

    assertThat(threads.get(0).getExecutedTests(), hasItems(2));
    assertThat(threads.get(1).getExecutedTests(), hasItems(3, 4));
    assertThat(threads.get(2).getExecutedTests(), hasItems(1, 5, 6, 7));
  }

  private void runPreparedTestCases(TestCountBasedBatchManager batchManager, List<Integer> executedTests) {
    for (int testNumber = 1; testNumber <= testCountInTestCase.size(); testNumber++) {
      batchManager.registerTestCase("Test Case " + counter.getAndIncrement());
      if (batchManager.shouldExecuteThisTest(testCountInTestCase.get(testNumber - 1))) {
        executedTests.add(testNumber);
      }
    }
  }

  class TestRunnerThread extends Thread {
    private final TestCountBasedBatchManager batchManager;
    private List<Integer> executedTests = new ArrayList<Integer>();

    public TestRunnerThread(final TestCountBasedBatchManager batchManager) throws InitializationError {
      this.batchManager = batchManager;
      executedTests = new ArrayList<Integer>();
    }

    public void run() {
      runPreparedTestCases(batchManager, executedTests);
    }

    public List<Integer> getExecutedTests() {
      return executedTests;
    }
  }
}
TOP

Related Classes of net.thucydides.core.batches.integration.WhenUseTestCountBasedBatchStrategy$TestRunnerThread

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.