создать набор тестов с тестовыми примерами, независимыми друг от друга?

Я разместил вопрос на форуме, чтобы узнать, как заставить набор тестов (с двумя тестовыми примерами) работать последовательно без перерывов. ссылка на предыдущий пост

Полезный ответ предположил, что

  • Создайте экземпляр драйвера один раз для каждого класса и поместите тестовые примеры в один и тот же класс, которые полагаются на использование одного и того же сеанса.

  • пользователь также предложил сделать тестовые случаи независимыми друг от друга.

    У меня есть 2 тестовых примера (чтобы поддерживать один и тот же сеанс входа в систему, я объединил 2 тестовых примера в один класс)

  • случай 1: сеанс аутентификации войдите на сайт, затем найдите участника и получите доступ к профилю участника

  • случай 2: в профиле участника перейдите на страницу профиля донора, затем добавьте залог, затем найдите сумму залога, зайдя на страницу конкретной кампании.

    Мой вопрос: как сделать тестовые случаи независимыми друг от друга, например, когда сеанс входа в систему завершился неудачно, набор все еще может выполнить testcase2. Моя мысль заключается в том, что мне нужно создать отдельный экземпляр драйвера в каждом тестовом классе (представлять каждый тестовый пример), поэтому, когда case1 терпит неудачу, case2 может продолжать работать. Пожалуйста, посоветуйте мне правильный способ сделать эту работу.

    Вот мой код для набора тестов

    драйвер для выполнения тестового класса

импортировать org.junit.runner.RunWith; импортировать org.junit.runners.Suite;

@RunWith(Suite.class)
@Suite.SuiteClasses
  (
    {
        SearchDonorSuzy.class

    }
  )

public class searchDonorAddPledge 
{

}

Код тестовых случаев включает аутентификацию, поиск участника, доступ к профилю донора, добавление залога и поиск суммы залога.

import org.junit.*;
import static org.junit.Assert.*;
import static org.hamcrest.CoreMatchers.*;
import org.openqa.selenium.*;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.support.ui.Select;

public class SearchDonorSuzy 
{
      private WebDriver driver;
      private String baseUrl;
      private boolean acceptNextAlert = true;
      private StringBuffer verificationErrors = new StringBuffer();

      @Before
      public void setUp() throws Exception {
        driver = new FirefoxDriver();
        baseUrl = "https://jlaustin.tcheetah.com/";
        driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
      }
         /*
          *test case 1: login + search member
          */
      @Test
      public void testSearchDonorSuzy() throws Exception {

        driver.get(baseUrl + "/?html=openid");
        driver.findElement(By.cssSelector("input[type=\"submit\"]")).click();
        driver.findElement(By.id("edit-name")).clear();
        driver.findElement(By.id("edit-name")).sendKeys("username");
        driver.findElement(By.id("edit-pass")).clear();
        driver.findElement(By.id("edit-pass")).sendKeys("password");
        driver.findElement(By.id("edit-submit")).click();
        driver.findElement(By.id("cmp_admin")).click();
        driver.findElement(By.id("quicksearch_anchor")).click();
        driver.findElement(By.cssSelector("img[alt=\"Member\"]")).click();
        driver.findElement(By.id("search_name")).clear();
        driver.findElement(By.id("search_name")).sendKeys("suzy");
        driver.manage().timeouts().implicitlyWait(6, TimeUnit.SECONDS);
        driver.findElement(By.cssSelector("input.btn")).click();
        driver.findElement(By.linkText("Balagia, Suzy")).click();
        /*
         * test case 2: access donor's profile and add a pledge
         */

        driver.findElement(By.xpath("(//a[contains(text(),'Donor')])[2]")).click();
        driver.findElement(By.linkText("Campaign Manager")).click();
        new Select(driver.findElement(By.id("campaign_id"))).selectByVisibleText("A Christmas Affair 2012");
        driver.findElement(By.xpath("//a[contains(text(),'Add\n            pledge')]")).click();
        driver.findElement(By.id("pledge_amount")).clear();
        driver.findElement(By.id("pledge_amount")).sendKeys("100.00");
        driver.findElement(By.id("pledge_notes")).clear();
        driver.findElement(By.id("pledge_notes")).sendKeys("test pledge");
        driver.findElement(By.cssSelector("input[type=\"image\"]")).click();
        /*
         * search donation amount in donation campaign page
         */
        driver.findElement(By.linkText("Donor")).click();
        driver.findElement(By.linkText("A Christmas Affair 2013")).click();
        new Select(driver.findElement(By.name("campaign_id"))).selectByVisibleText("A Christmas Affair 2012");
        driver.findElement(By.linkText("Donors")).click();
        driver.findElement(By.id("search_name")).clear();
        driver.findElement(By.id("search_name")).sendKeys("suzy");
        driver.findElement(By.cssSelector("input[type=\"image\"]")).click();
      }

      @After
      public void tearDown() throws Exception {
        //driver.quit();
        String verificationErrorString = verificationErrors.toString();
        if (!"".equals(verificationErrorString)) {
          fail(verificationErrorString);
        }
      }

      private boolean isElementPresent(By by) {
        try {
          driver.findElement(by);
          return true;
        } catch (NoSuchElementException e) {
          return false;
        }
      }

      private String closeAlertAndGetItsText() 
      {
        try 
        {
          Alert alert = driver.switchTo().alert();
          if (acceptNextAlert) 
          {
            alert.accept();
          } 
          else 
          {
            alert.dismiss();
          }
          return alert.getText();
        } 
        finally 
        {
          acceptNextAlert = true;
        }
      }

}

person user2061466    schedule 08.06.2013    source источник
comment
Какой у Вас вопрос?   -  person Software Engineer    schedule 09.06.2013
comment
@Инженер Доллери. Извините за путаницу, я добавил свой вопрос жирным шрифтом в исходное сообщение. Пожалуйста, дайте мне несколько предложений. Спасибо!   -  person user2061466    schedule 09.06.2013


Ответы (1)


Вы должны объявить свой веб-драйвер статическим, а затем использовать @BeforeClass, чтобы создать его экземпляр и войти в свое приложение. Вы должны сделать это в каждом тестовом классе, независимо от других. Таким образом, каждый тестовый пример имеет вход в систему по умолчанию. Затем вы можете сделать так, чтобы каждый тестовый метод (@Test) предполагал, что вы вошли в систему.

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

Хотя это не самая большая ваша проблема. Ваша самая большая проблема заключается в том, что вы заливаете бетоном весь свой пользовательский интерфейс, по крайней мере, в переносном смысле. Ваши разработчики могут в какой-то момент изменить кнопки отправки на якоря, скрыть каждую из них с помощью кнопки jquery-ui, а затем использовать javascript для вызова отправки формы, только если прошла какая-то базовая проверка (это очень распространено). Если это произойдет, поведение вашей системы не изменится, и пользовательский интерфейс будет выглядеть почти так же, но ваши тесты не пройдут. Наверное, много тестов. По этой и многим другим причинам профессиональные Java-разработчики редко приближаются к селену ближе чем на 10 футов. Это нарушает большинство принципов тестирования. (примечание: Java-разработчиков так много, что даже редкое использование инструмента может означать, что десятки тысяч людей занимаются именно этим). Вместо того, чтобы использовать селен, я бы посмотрел на BDD, используя jbehave и тестируя через ваш API, а не через ваш графический интерфейс.

Кстати: вам не следует использовать import xxx.* -- это разрешено, но считается плохой практикой.

person Software Engineer    schedule 09.06.2013
comment
@egineer Dollery Спасибо за ответ, я создал 2 отдельных класса, и в каждом классе у меня есть статическая переменная для веб-драйвера. После сеанса case1: Authentication я вышел из системы. затем в классе содержится случай 2. Я вошел на сайт, используя новую статическую переменную WebDriver. Это сработало, как и ожидалось. Спасибо! - person user2061466; 23.06.2013