Gleichzeitige JUnit-Tests mit Parametern
Also versuche ich parallel parametrisierte tests. Ich habe eine Lösung, wo die gleichen Tests können parallel ausgeführt werden mit den Parametern versorgt Sie zum Beispiel sagen, ich habe das folgende:
@Test
public void someTest1(){
}
@Test
public void someTest2(){
}
Bekomme ich someTest1() ausgeführt, mit der alle Parameter gleichzeitig, aber someTest2() müssen noch warten, bis someTest1 (), um alle Parameter vor der Ausführung. Ich Frage mich, ob jemand wusste eine Lösung ausführen zu können, someTest1() mit allen Parametern und someTest2() mit allen Parametern gleichzeitig? Ich habe versucht tempus-fugit gleichzeitigen test runner, die funktioniert gut für tests, die nicht parametrisiert werden...
Unten ist der code, den ich für derzeit laufen die einzelnen parameter test parallel.
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());
}
}
Den code unten ein Beispiel-test, BaseSuite nicht alles enthalten, von großer Bedeutung. Diese mit Selen, so dass es stellt nur die webDriver. Die getAllButOpera () - Methode gibt eine collection zurück, browser-Typen, enthalten Internet Explorer, Firefox und Chrome. Diese Parameter werden verwendet, um führen Sie den gleichen test auf firefox, ie und chrome gleichzeitig. Ich würde gerne die beiden tests in der Klasse zur gleichen Zeit das ist, was ich bin Probleme mit.
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();
}
}
- ich bin nicht auf der Suche, um sich zu qualifizieren für eine Antwort hier, aber das ist nicht der richtige Weg, um zu testen, Auger-code. wenn Sie erfahren möchten, wie Sie dies tun ich kann Sie zu dem entsprechenden Abschnitt der "java concurrency in der Praxis" - Buch.
- Der code, den ich am testen nicht gleichzeitig, ich will einfach nur, um die tests auszuführen gleichzeitig.
- gut, vielleicht bin ich falsch Ihre Absichten hier: ich gehe davon aus, dass der Grund dafür, dass Sie sich Fragen, wie die tests auszuführen, die gleichzeitig ist, weil Sie brauchen, um den code zu testen gleichzeitige Verhalten.
- Und dann das problem ist wahrscheinlich nicht der JUnit selbst, aber Webdriver. Schauen Sie, wie es zu konfigurieren, ausführen in mehreren Instanzen.
- Mein Ziel ist das testen einer website auf verschiedenen Browsern, ohne neu zu schreiben, den test für jeden browser. Ob Sie zur gleichen Zeit auftreten oder nicht, das ist nicht wirklich wichtig für mich im moment.
- Oboturov ich bin mit dem Selenium Grid, welches verwendet wird, um mehrere selenium-tests auf unterschiedlichen Browsern zur gleichen Zeit, so dass ist in Ordnung.
- Können Sie reinigen Sie Ihre Beispiel aus der private-code-Werkzeuge.* verwendet in SampleSuite1 Klasse?
- Ich glaube, ich habe entfernt es alle, lassen Sie mich wissen, wenn es etwas, was ich verpasst.
- Ich bin der Autor von tempus-fugit und würde glücklich sein, Sie zu integrieren, etwas in der Bibliothek zu unterstützen. Vielleicht lohnt sich das einreden offline (vor allem, wenn Sie haben es bereits gelöst!). Cheers
- Das wäre toll. Ich dachte ich hätte die Lösung, aber es ist mehr ein hack als eine Lösung. Im wesentlichen, es ist nicht garantiert, dass der gleiche test wird nicht ausgeführt, zur gleichen Zeit wie der andere läuft. Ich habe es gemacht, wo es eine größere chance, dass der gleiche test wird nicht zur gleichen Zeit laufen. Diese funktioniert jetzt, aber es wäre besser gewährleistet werden, dass der gleiche test wird nicht zur gleichen Zeit laufen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wie gesagt, die Frage ist bei der Umsetzung von JUnit.
Können Sie sehen, dass:
auf der anderen Seite:
daher sind Sie aus verschiedenen Hierarchien der Vererbung.
Und jetzt, was Sie haben, zu betrachten ist die Umsetzung des:
Methode. Für die org.junit.die Läufer.BlockJUnit4ClassRunner es ist:
generiert alle Methoden mit Annotationen. Aber für die org.junit.die Läufer.Parametrisierte es ist:
Des letzten und gibt nur Klassen.
Vorschlag: überschreiben Sie Ihre Parallelisiert Klasse mit der definition von
org.junit.runners.ParentRunner#getChildren from BlockJUnit4ClassRunner
.Parameterized
imParallelized
Klasse? Wie bekomme ich eineList<FrameworkMethod>
zu einemList<Runner>
Danke für die Hilfe, ich landete mit code aus hier zusätzlich zum ausführen der gleichzeitigen suites und es gab mir die Fähigkeit, um die tests auszuführen, die gleichzeitig, aber es wird nicht führen Sie den gleichen test bei der gleichen Zeit.
Ich bin auch mit dem code von Jeeunit... aber auch die version 1.0 hat einen bug.
In der ConcurrentRunnerScheduler die fertige Methode, die implementiert werden müssen.
So, ich zog den code und implementiert ihn wie die suiteFinished () - Methode:
Dies ist, was ich versucht habe, und es funktioniert wirklich gut für mich.