在一台物理机器上并行执行Selenium脚本

时间:2018-04-13 14:13:20

标签: selenium selenium-webdriver browser-automation parallel-testing

我有一个基于Selenium WebDriver的混合框架。运行我现在拥有的测试套件大约需要2-3个小时。什么是开始并行运行测试的最佳方法在同一台机器上(即使我使用Selenium Grid,我可以在一台机器上最多有多少个节点,前提是我也必须使用与Hub相同的机器?)。我有使用一台物理机器的约束,我没有使用Test NG。

1 个答案:

答案 0 :(得分:1)

使用 failsafe plugin 使用 maven 运行它,方法是配置与多个线程并行运行。

下面是在 5 个线程中运行junit测试的示例代码,其中包含测试类(位于默认位置src/test/java并使用默认的类inclusion规则)并行运行。 webdriver中的BeforeClass被实例化,并在AfterClass方法中被销毁。 webdriver实例存储在静态ThreadLocal变量中,以便将它们分开。

pom.xml -

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-failsafe-plugin</artifactId>
            <version>2.21.0</version>

            <configuration>
                <parallel>classes</parallel> 
                <threadCount>5</threadCount>
            </configuration>

            <executions>
                <execution>
                    <id>integration-test</id>
                    <phase>integration-test</phase>
                    <goals>
                        <goal>integration-test</goal>
                    </goals>
                </execution>
                <execution>
                    <id>verify</id>
                    <phase>verify</phase>
                    <goals>
                        <goal>verify</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

BaseClass -

public class BaseTestIT {

    @BeforeClass
    public static void setup() {
        System.setProperty("webdriver.chrome.driver", "");
        WebDriver driver = new ChromeDriver();
        ThreadWebDriver.set(driver);
    }

    @AfterClass
    public static void teardown() {
        ThreadWebDriver.get().quit();
        ThreadWebDriver.remove();
    }
}

ThreadLocal -

public class ThreadWebDriver {

    private static final ThreadLocal<WebDriver> threadWebDriver = new InheritableThreadLocal<WebDriver>();

    private ThreadWebDriver() { }

    public static WebDriver get() {
        return threadWebDriver.get();
    }

    public static void set(WebDriver driver) {
        threadWebDriver.set(driver);
    }

    public static void remove() {
        threadWebDriver.remove();
    }    
}

TestOneClass - 这两种方法都将在同一个线程中运行。

public class FirstTestIT extends BaseTestIT {

    @Test
    public void testOne() {
        System.out.println(Thread.currentThread().getId());     
        WebDriver driver = ThreadWebDriver.get();
        driver.get("https://junit.org/junit4/");
        driver.manage().window().maximize();
    }

    @Test
    public void testTwo() {
        System.out.println(Thread.currentThread().getId());     
        WebDriver driver = ThreadWebDriver.get();
        driver.get("https://junit.org/junit5/");
        driver.manage().window().maximize();
    }
}

TestTwoClass - 单个方法将在单独的线程中运行。

public class ThirdTestIT extends BaseTestIT{

    @Test
    public void test() {
        System.out.println("third one");
        WebDriver driver = ThreadWebDriver.get();       
        driver.get("https://stackoverflow.com/questions/tagged/selenium");
        driver.manage().window().maximize();
    }
}

您甚至可以使用sharedwebdriver概念,其中只有在JVM关闭时才会关闭驱动程序。这个链接使用黄瓜,但很容易修改只是为了使用硒。删除前后挂钩并在junit挂钩中处理此部件。