だから私は並列パラメータ化されたテストを実行しようとしています。同じテストを提供されたパラメーターと並行して実行できるソリューションがあります。たとえば、次のようなものがあります。
@Test
public void someTest1(){
}
@Test
public void someTest2(){
}
someTest1()をすべてのパラメーターで同時に実行することはできますが、someTest2()は、実行する前にsomeTest1()がすべてのパラメーターで完了するのを待つ必要があります。someTest1()をすべてのパラメーターで実行し、someTest2()をすべてのパラメーターで同時に実行できるソリューションを誰かが知っているかどうか疑問に思いましたか?私はtempus-fugit同時テストランナーを試しました。これは、パラメーター化されていないテストに最適です...
以下は、現在各パラメーターテストを並行して実行するために持っているコードです。
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import org.junit.runners.Parameterized;
import org.junit.runners.model.RunnerScheduler;
/**
* Class used from the following source:
* http://jankesterblog.blogspot.com/2011/10
* /junit4-running-parallel-junit-classes.html
*
* @author Jan Kester
*
*/
public class Parallelized extends Parameterized {
private static class ThreadPoolScheduler implements RunnerScheduler {
private ExecutorService executor;
public ThreadPoolScheduler() {
String threads = System.getProperty("junit.parallel.threads", "16");
int numThreads = Integer.parseInt(threads);
executor = Executors.newFixedThreadPool(numThreads);
}
public void finished() {
executor.shutdown();
try {
executor.awaitTermination(12, TimeUnit.HOURS);
} catch (InterruptedException exc) {
throw new RuntimeException(exc);
}
}
public void schedule(Runnable childStatement) {
executor.submit(childStatement);
}
}
/**
* Instantiates a new parallelized.
*
* @param klass
* the klass
* @throws Throwable
* the throwable
*/
public Parallelized(Class<?> klass) throws Throwable {
super(klass);
setScheduler(new ThreadPoolScheduler());
}
}
以下のコードはテスト例です。BaseSuiteにはそれほど重要なものは含まれていません。これらはセレンで使用されているため、webDriverを設定するだけです。getAllButOpera()メソッドは、Internet Explorer、Firefox、およびChromeを含むブラウザータイプのコレクションを返します。これらのパラメータは、Firefox、つまりchromeで同じテストを同時に実行するために使用されます。クラスで2つのテストを同時に実行したいのですが、これが問題になっています。
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import java.util.Collection;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized.Parameters;
import org.openqa.selenium.WebDriver;
/**
* The Class SampleSuite1.
*
* @author Reid McPherson
*/
@RunWith(Parallelized.class)
public class SampleSuite1 {
WebDriver driver;
/**
* Data.
*
* @return the collection
*/
@Parameters
public static Collection<Object[]> data(){
List<Object[]> browsers = new ArrayList<Object[]>();
browsers.add(new String[]{"Firefox"});
browsers.add(new String[]{"Chrome"});
browsers.add(new String[]{"IE"});
return browsers;
}
/**
* Instantiates a new sample suite1.
*
* @param type
* the type
*/
public SampleSuite1(String type){
switch (type) {
case "FIREFOX":
driver = new FirefoxDriver();
break;
case "IE":
driver = new InternetExplorerDriver();
break;
case "CHROME":
System.setProperty("webdriver.chrome.driver", PATHTOCHROMEEXE);
driver = new ChromeDriver();
break;
case "OPERA":
driver = new OperaDriver();
break;
default:
throw new RuntimeException("Browser type unsupported");
}
// Set the timeout.
driver.manage().timeouts().implicitlyWait(60, TimeUnit.SECONDS);
}
/**
* Sets the up.
*/
@Before
public void setUp() {
driver.get("http://www.google.com");
}
/**
* Test navigation succeeded.
*/
@Test
@TestDescription("Navigation Test")
public void navigationShouldSucceed() {
String pageSource = driver.getPageSource();
assertTrue(pageSource.contains("Google"));
}
/**
* Test title.
*/
@Test
@TestDescription("This method tests the web page title.")
public void titleShouldBeGoogle() {
assertEquals(driver.getTitle(), "Google");
}
@After
public void finished(){
driver.close();
}
}