2012-02-27 2 views
0

Я пытаюсь проверить возможные условия гонки на моем сайте и поэтому хочу, чтобы два теста testNG (с использованием селена 2.0) выполнялись в двух разных браузерах точно в одно и то же время. Я использую плагин testNG для Eclipse (Indigo). Сроки важны, потому что я хочу видеть, что происходит, когда одновременно выполняются два обновления, и будет ли оно выдавать исключение. Я попытался установить атрибут «parallel» в testng.xml для классов, тестов и методов, но один тест всегда начинается впереди другого, поэтому они не синхронизированы. Также один тест может занять больше времени (на несколько миллисекунд), поэтому я не уверен, как правильно выбрать время.Сроки тестирования двух тестовых методов testNG для параллельного запуска и выполнения ТОЧНО в одно и то же время?

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

Класс 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 аннотации, вероятно, неверно, так как я не уверен, что будет best (@BeforeSuite, @BeforeMethod и т. д.)

My 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:[email protected]]" 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:[email protected]]" 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:[email protected]]" 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:[email protected]]" 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:[email protected]]" 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:[email protected]]" 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> 

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

+0

Спасибо за ответы ниже! Высокопроизводительный знак, я вижу вашу мысль. Я объясню, что я пытаюсь проверить: у меня есть набор данных в базе данных и два представления этих данных (центральный и клиентский). Очевидно, что эти два представления должны быть синхронизированы. Изменение, сделанное одним (пользователем), отражается в другом. Мой первый тестовый пример выше изменяет форму, как пользователь, и нажимает кнопку submit. Второй вызывает веб-действие, которое проверяет изменения для всех элементов и сохраняет их в БД. Если пользователь делает редактирование, и эта проверка происходит в то же время, может ли это редактирование быть потеряно? Редактирование не было бы проверено чеком? – user1088166

+0

Этот сценарий, который вы попытались объяснить, выглядит как ситуация [phantom read] (http://en.wikipedia.org/wiki/Isolation_ (database_systems) #Phantom_reads). Его можно легко преодолеть с помощью замков. Для получения дополнительной информации см. [Это] (http://docstore.mik.ua/orelly/java-ent/ebeans/ch08_03.htm). – Bala

+0

Также очень сложно воспроизвести такие ситуации в единичной тестовой среде, которая имеет дело с типично небольшими тестами (хотя и несовместимыми). – Bala

ответ

1

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

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

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

т.д.

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

1

Тестирование условий гонки не может быть детерминированным, как отмечает 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. Просто упомянул об этом, потому что вы используете селен.