Синхронизировать два метода тестирования testNG для параллельной работы и ТОЧНО в одно и то же время? - PullRequest
0 голосов
/ 27 февраля 2012

Я пытаюсь проверить возможные условия гонки на своем сайте и поэтому хочу, чтобы два метода тестирования testNG (используя селен 2.0) выполнялись в двух разных браузерах одновременно. Я использую плагин testNG для Eclipse (Индиго). Время важно, потому что я хочу посмотреть, что произойдет, когда два обновления будут выполнены одновременно, и вызовет ли оно исключение. Я попытался установить атрибут «параллельный» в testng.xml для классов, тестов и методов, но один тест всегда начинается раньше другого, поэтому они не синхронизированы. Кроме того, выполнение одного теста может занять больше времени (на несколько миллисекунд), поэтому я не уверен, как правильно выбрать время.

На данный момент у меня есть тесты в двух разных классах, так как это дает мне самый близкий результат к тому, что я хочу.

Класс 1:

public class SyncTest {

WebDriver driver;
WebElement element;


@BeforeMethod
public void setUp() throws Exception {

    driver = new FirefoxDriver();

}


@Test(timeOut = 15000)
public void testSync() throws Exception {
    driver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);
    //Login
    driver.get("http://mySite.com");
    driver.findElement(By.name("username")).sendKeys("admin");
    driver.findElement(By.name("password")).sendKeys("admin");
    try {
    element = driver.findElement(By.id("centralLogin_0"));
    element.click();
    } catch (Exception e){
        System.out.println("Error submitting: " + e.toString());
    }

    //open issue
    driver.findElement(By.linkText("Sync Test")).click();
    driver.switchTo().frame("mobile_vault");
    //Change status
    Select select = new Select(driver.findElement(By.id("statusSelect")));
    //select.deselectAll();
    select.selectByVisibleText("Open");
    List <WebElement> elements;
    //driver.findElement(By.className("button nextDialogue")).click();
    try {
    driver.findElement(By.cssSelector("div.button.nextDialogue > div")).click();
    } catch (Exception e){
        System.out.println("Not found");
    }

    Thread.sleep(2000);    
   try {
    driver.findElement(By.xpath("//form[@id='frmcall']/fieldset/div[14]/div[2]/div[1]")).click();
   } catch (Exception e) {
       System.out.println("Not Found");
       System.out.println(e.toString());
   }

   Thread.sleep(3000);
   driver.navigate().refresh();





}





@AfterMethod
public void tearDown() {
    driver.quit();
}

}

Это класс 2:

public class NewSyncTest {

WebDriver driver;
WebElement element;

  @Test
  public void testF() throws Exception {

      driver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);

  //Login
  driver.get("http://mySite.com");
  driver.findElement(By.name("username")).sendKeys("admin");
  driver.findElement(By.name("password")).sendKeys("admin");

  try {
    element = driver.findElement(By.id("centralLogin_0"));
    element.click();
    } catch (Exception e){
        System.out.println("Error submitting: " + e.toString());
    }


    //open admin page
    driver.get("http://mySite.com/admin");

    Thread.sleep(2000);



try {

    driver.findElement(By.cssSelector("input[type='submit']")).click();

} catch (Exception e){
        System.out.println("Not found");
    }



  }
  @BeforeMethod
  public void beforeMethod() {

  driver = new FirefoxDriver();
  }

  @AfterMethod
  public void afterMethod() {

  driver.quit();
  }

}

Я понимаю, что я использую аннотации testNG, вероятно, неправильно, поскольку я не уверен, что будет лучше (@BeforeSuite, @BeforeMethod и т. Д.)

Мой testng.xml выглядит так:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Suite" parallel="classes">
<test name="Test" preserve-order="false">
<classes>
  <class name="syncTest.SyncTest"/>
  <class name = "syncTest.NewSyncTest"/>


</classes>
</test>
</suite>

Как я уже говорил, тесты никогда не выполняются точно параллельно, и я не знаю, как этого добиться :( Я также включу ниже testng-results.xml, отметьте время каждого метода тестирования:

<test name="Test" duration-ms="20264" started-at="2012-02-27T15:52:02Z" finished-    at="2012-02-27T15:52:23Z">
  <class name="syncTest.SyncTest">
    <test-method status="PASS" signature="setUp()[pri:0, instance:syncTest.SyncTest@3e9d75c5]" name="setUp" is-config="true" duration-ms="8475" started-at="2012-02-27T15:52:02Z" finished-at="2012-02-27T15:52:11Z">
    </test-method>
    <test-method status="PASS" signature="testSync()[pri:0, instance:syncTest.SyncTest@3e9d75c5]" name="testSync" duration-ms="11556" started-at="2012-02-27T15:52:11Z" finished-at="2012-02-27T15:52:22Z">
    </test-method>
    <test-method status="PASS" signature="tearDown()[pri:0, instance:syncTest.SyncTest@3e9d75c5]" name="tearDown" is-config="true" duration-ms="217" started-at="2012-02-27T15:52:22Z" finished-at="2012-02-27T15:52:23Z">
    </test-method>
  </class>
  <class name="syncTest.NewSyncTest">
    <test-method status="PASS" signature="beforeMethod()[pri:0, instance:syncTest.NewSyncTest@539ef8a0]" name="beforeMethod" is-config="true" duration-ms="4345" started-at="2012-02-27T15:52:02Z" finished-at="2012-02-27T15:52:07Z">
    </test-method>
    <test-method status="PASS" signature="testF()[pri:0, instance:syncTest.NewSyncTest@539ef8a0]" name="testF" duration-ms="9728" started-at="2012-02-27T15:52:07Z" finished-at="2012-02-27T15:52:16Z">
    </test-method>
    <test-method status="PASS" signature="afterMethod()[pri:0, instance:syncTest.NewSyncTest@539ef8a0]" name="afterMethod" is-config="true" duration-ms="231" started-at="2012-02-27T15:52:16Z" finished-at="2012-02-27T15:52:17Z">
    </test-method>
  </class>
</test>

Любые предложения приветствуются. Заранее спасибо! :)

Ответы [ 2 ]

1 голос
/ 28 февраля 2012

Тестирование на гоночные условия не может быть детерминированным, как отметили High Performance Mark.Если, с другой стороны, вы хотите протестировать один метод тестирования, выполняющийся параллельно в виде нескольких потоков, то вы можете попробовать что-то, как показано ниже.

public class ConcurrentTestRunnerTest {

    @Test(threadPoolSize = 3, invocationCount = 10,  timeOut = 10000)
    public void shouldRunInParallel1() {
        System.out.println("I'm running on thread " + Thread.currentThread().getName());
    }

    @Test(threadPoolSize = 3, invocationCount = 10,  timeOut = 10000)
    public void shouldRunInParallel2() {
        System.out.println("I'm running on thread " + Thread.currentThread().getName());
    }

}

Это гарантирует, что у вас будет столько женастраиваемые потоки выполняются параллельно.

IMO, вы должны быть в состоянии достичь таких результатов, используя некоторые инструменты тестирования производительности, такие как JMeter.Только что упомянул это, потому что вы используете селен.

1 голос
/ 27 февраля 2012

Попытка проверить условия гонки, когда два доступа происходят в одно и то же время, вероятно, бесполезное упражнение, но также бесполезно. Бесполезно, потому что вы никогда не достигнете этого, бесполезно, потому что гонки данных не возникают, когда доступ происходит «в одно и то же время», но когда атомарные операции (обычно чтение и запись) чередуются таким образом, что представления общих переменных что эти два процесса несовместимы.

Если у вас есть 2 процесса, каждый из которых выполняет, скажем, чтение с последующей записью из / в одну и ту же переменную, подумайте вместо всех способов, которыми могут произойти 4 атомных операции (R1 - чтение 1-го процесса и т. Д.):

R1,W1,R2,W2
R1,R2,W2,W1

и т.д.

Перепишите свои тесты, чтобы вы могли контролировать интервалы между R и W для каждого процесса, сделать эти интервалы достаточно длинными, чтобы контролировать чередование атомарных операций, и проверить, что ваша программа справляется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...