如何使用相同的dataprovider并行运行selenium测试

时间:2015-08-04 15:00:47

标签: java selenium-webdriver testng testng-dataprovider

我有一个场景,我需要使用相同的数据提供程序并行运行我的selenium测试。从我所读的内容来看,它是可能的,但无法让它工作。我在一台机器上运行一个集线器和一个节点,并在另一台机器上运行另一个节点。

我的DataProvider

// Data provider for Storage Rule Suite
@DataProvider(name = "StorageRuleDataProvider", parallel =true)
public static Object[][] getStorageData(Method m) {
    return TestUtil.getData(m.getName(), TestBase.storageSuite);
}

我的测试

@Test(groups = { "CreateNewStorageRule" }, dependsOnGroups = { "StoragePage" }, dataProviderClass = TestDataProvider.class, dataProvider = "StorageRuleDataProvider", threadPoolSize = 20)
public void createNewStorageRuleTest(Hashtable<String, String> data){}

XML

<suite name="Storage Rule Suite" parallel="tests" data-provider-thread-count="20"  >

当我在xml文件中运行测试时,我在每个节点上打开了两组浏览器,但是当它尝试登录时,有时它会在一个浏览器中输入两次凭据而在另一个浏览器中没有输入任何内容,有时甚至没有任何内容在一个浏览器上输入。

2 个答案:

答案 0 :(得分:1)

首先,您必须使用parallel="methods"并行运行@Test方法。第二:我有一个类似的问题,更多的测试方法在同一个浏览器中执行,我通过制作我的WebDriver ThreadSafe来解决它。

答案 1 :(得分:1)

您所描述的是非线程安全的Selenium测试自动化框架的经典示例。在大多数情况下,您可以通过在每个测试类中使用驱动程序的实例来解决此问题,并在单个线程中运行该类中的所有测试。

但是,如果要在多个并行线程中运行单个测试类的内容,则需要重新设计is-a&amp;在你的框架中有一个关系。以下是如何完成此操作的详细示例:

http://automatictester.co.uk/2015/04/11/parallel-execution-on-method-level-in-selenium-testng-framework

尽管如此,这可能会为您的测试自动化增加额外的工作和额外的复杂性。我想两次为什么你想并行使用数据提供程序运行Selenium测试方法,如果你真的需要这样做,试着回答这个问题。

根据我的经验,如果您开始将数据提供程序与Selenium结合使用,则可能会遇到整体测试方法的问题。也许你尝试在UI级别上自动化太多,而不是将测试推向堆栈,例如API级别。