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.

InformationsquelleAutor Reid Mac | 2012-04-13
Schreibe einen Kommentar