0

ハブと 2 つのノードを備えた Selenium Grid2 があります。

ハブは以下によって運営されています。

java -jar selenium-server-standalone-2.32.0.jar -role hub -port 4444

ノードは以下によって運営されています。

java -jar selenium-server-standalone-2.32.0.jar -role node -hub http://10.20.46.171:4444/wd/hub -port 5555

ハブ コンソールでは、両方のノードが稼働中であることがわかります。

私のTestNB設定(testng.xml):

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Full suite" parallel="classes" thread-count="4">
  <parameter name="hubAddress" value="http://127.0.0.1:4444/wd/hub"></parameter>
  <test verbose="2" name="Full">
    <packages>
      <package name="com.example.tests">
      </package>
    </packages>
  </test>
</suite>

com/example/tests には、基本クラスの TestBase と、TestBase を拡張する 4 つの他のクラスがあります。

TestBase.java には、次のものがあります。

package com.example.tests;
import java.net.MalformedURLException;
import java.net.URL;

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.remote.RemoteWebDriver;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Parameters;

public class TestBase {

  protected WebDriver driver;

  @BeforeClass
  @Parameters("hubAddress")
  public void startDriver(String hubAddress) throws MalformedURLException {
    driver = new RemoteWebDriver(new URL(hubAddress), DesiredCapabilities.Firefox());
  }

  @AfterClass
  public void stopDriver() {
    driver.quit();
    driver = null;
  }

}

Test1.java には、次のものがあります。

package com.example.tests;
import org.testng.annotations.Test;

@Test
public class Test1 extends TestBase {

  public void test1() {
    driver.get("http://www.google.com/");
  }

}

Test2.java には、次のものがあります。

package com.example.tests;
import org.testng.annotations.Test;

@Test
public class Test2 extends TestBase {

  public void test2() {
    driver.get("http://www.facebook.com/");
  }

}

Test3.java には、次のものがあります。

package com.example.tests;
import org.testng.annotations.Test;

@Test
public class Test3 extends TestBase {

  public void test3() {
    driver.get("http://www.yahoo.com/");
  }

}

Test4.java には、次のものがあります。

package com.example.tests;
import org.testng.annotations.Test;

@Test
public class Test4 extends TestBase {

  public void test4() {
    driver.get("http://www.cnn.com/");
  }

}

これらすべてを Ant で実行します。コードの一部を次に示します。

   <target name="run-tests" depends="build">
        <testng classpathref="LoadTests.classpath">
            <xmlfileset dir="." includes="testng.xml"/>
        </testng>
    </target>

コマンドライン:

ant run-tests

現在の仕組み: Test1 は Node1 で実行され、Test2 は Node2 で (同時に) 実行されます。その後、Test3 は Node1 で実行され、Test4 は Node2 で (同時に) 実行されます。

望ましい動作: 4 つのテストすべてが 1 つのショットで同時に実行されます。1 つのノードで 2 つ (たとえば、Test1、Test3)、2 つ目のノードで他の 2 つ (Test2、Test4)。

質問:希望どおりに動作させるには、何を変更すればよいですか?

4

1 に答える 1

1

@BeforeClass の代わりに @BeforeMethod を使用してみてください。これによりメソッドごとにドライバーが作成されることはわかっていますが、 @Before*annotation* が基本クラス内で発生する場合、これが唯一の方法だと思います。

なぜこれが発生するのかよくわかりませんが、@BeforeMethodを使用する以外はあなたと同じように設定しており、並列スレッドを実行するときはすべて問題ありません

于 2013-09-06T09:32:35.430 に答える