Перейти к содержимому

Фотография

Запуск тестов через JUnit4 в определенном порядке


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 19

#1 O'Leen

O'Leen

    Новый участник

  • Members
  • Pip
  • 55 сообщений
  • Город:Киев

Отправлено 01 марта 2013 - 10:50

Подскажите, пожалуйста, как можно запустить тесты через JUnit 4 в определенном порядке, и что для этого нужно.

И еще вопрос: тесты, которые вы пишете, они связанны между собой? Или же каждый тест является независимым и выполняется сам по себе?
  • 0

#2 tab15

tab15

    Активный участник

  • Members
  • PipPip
  • 128 сообщений

Отправлено 01 марта 2013 - 11:50

Создать TestSuite и запустить полагаю
import org.junit.runner.RunWith;
import org.junit.runners.Suite;
import org.junit.runners.Suite.SuiteClasses;

@RunWith(Suite.class)
@SuiteClasses({Test1.class, Test2.class, Test3.class})


public class TestSuite {
	public static void main(String[] args) {		
	}
}

  • 1

#3 user12

user12

    Специалист

  • Members
  • PipPipPipPipPip
  • 894 сообщений
  • ФИО:Виктор
  • Город:Минск


Отправлено 01 марта 2013 - 12:52

Подскажите, пожалуйста, как можно запустить тесты через JUnit 4 в определенном порядке, и что для этого нужно.

И еще вопрос: тесты, которые вы пишете, они связанны между собой? Или же каждый тест является независимым и выполняется сам по себе?


в JUnit тесты выполняются в том порядке, в котором они располагаются, в TestNG в порядке сортировки
Каждый тест-кейс должен быть независимым и выолняться сам по себе
  • 1

#4 O'Leen

O'Leen

    Новый участник

  • Members
  • Pip
  • 55 сообщений
  • Город:Киев

Отправлено 01 марта 2013 - 14:25

Создать TestSuite и запустить полагаю

import org.junit.runner.RunWith;
import org.junit.runners.Suite;
import org.junit.runners.Suite.SuiteClasses;

@RunWith(Suite.class)
@SuiteClasses({Test1.class, Test2.class, Test3.class})


public class TestSuite {
	public static void main(String[] args) {		
	}
}

Спасибо! Создала TestSuite по вашему примеру, при запуске первый тест выполняется, второй же неизбежно падает.. Сами тесты не зависимы друг от друга, если запускать оба теста отдельно - все работает. Почему второй тест валится сразу же, на первой строке? Может есть какие-то ньюансы?
  • 0

#5 tab15

tab15

    Активный участник

  • Members
  • PipPip
  • 128 сообщений

Отправлено 01 марта 2013 - 14:53

Напишите, что за ошибку выдает второй тест
  • 0

#6 O'Leen

O'Leen

    Новый участник

  • Members
  • Pip
  • 55 сообщений
  • Город:Киев

Отправлено 01 марта 2013 - 15:26

Напишите, что за ошибку выдает второй тест


org.openqa.selenium.remote.SessionNotFoundException: The FirefoxDriver cannot be used after quit() was called.

Я так понимаю, это из-за того, что в моем BasicTestCase есть такая штука
	@After
	public void tearDown() throws Exception {
		driver.quit();
        }

Но как выйти из этой ситуации?
  • 0

#7 appmen

appmen

    Опытный участник

  • Members
  • PipPipPipPip
  • 408 сообщений
  • ФИО:Victor

Отправлено 01 марта 2013 - 15:33

а анотация @before или @beforeclass не поможет?
  • 0

#8 tab15

tab15

    Активный участник

  • Members
  • PipPip
  • 128 сообщений

Отправлено 01 марта 2013 - 15:34

Похоже на то, что в каждом тесте(классе) вы вызываете один и тот же объект driver.
Как у вас осуществляется создание объекта driver?
  • 0

#9 O'Leen

O'Leen

    Новый участник

  • Members
  • Pip
  • 55 сообщений
  • Город:Киев

Отправлено 01 марта 2013 - 15:40

Похоже на то, что в каждом тесте(классе) вы вызываете один и тот же объект driver.
Как у вас осуществляется создание объекта driver?


через все тот же BasicTestCase, который наследуют все остальные тесты
public class BasicTestCase {
	
	protected static WebDriver driver;
	
	protected WebDriver getWebDriver() {
		if (driver == null) {
			driver = new FirefoxDriver();
			driver.manage().timeouts().implicitlyWait(Long.parseLong(ConfigProperties.getProperty("imp.wait")), TimeUnit.SECONDS);
		}
		return driver;
	}
	
	@After
	public void tearDown() throws Exception {
		driver.quit();
    }
	

  • 0

#10 O'Leen

O'Leen

    Новый участник

  • Members
  • Pip
  • 55 сообщений
  • Город:Киев

Отправлено 01 марта 2013 - 15:51

а анотация @before или @beforeclass не поможет?


что-то вроде
	@Before
	public void setUp() throws Exception {
	}

?

Прошу прощения, я новичок в использовании селениума и джавы вообще
  • 0

#11 appmen

appmen

    Опытный участник

  • Members
  • PipPipPipPip
  • 408 сообщений
  • ФИО:Victor

Отправлено 01 марта 2013 - 16:02

теоретически, если перенесли всю реализацию вызова веб драйвера в @before, то всё будет гуд. У вас драйвер вызывается только 1 раз, потом он закрывается, а потом к нему обращаются и не могут найти, я прав?
  • 0

#12 O'Leen

O'Leen

    Новый участник

  • Members
  • Pip
  • 55 сообщений
  • Город:Киев

Отправлено 01 марта 2013 - 16:32

теоретически, если перенесли всю реализацию вызова веб драйвера в @before, то всё будет гуд. У вас драйвер вызывается только 1 раз, потом он закрывается, а потом к нему обращаются и не могут найти, я прав?


как-то так все и происходит. Добавила @Before, но ситуация не изменилась, ошибка все та же: org.openqa.selenium.remote.SessionNotFoundException: The FirefoxDriver cannot be used after quit() was called.

Вот как это выглядит:
public class BasicTestCase {
	
	protected static WebDriver driver;

	@Before
	public void setUp() throws Exception {
    driver = getWebDriver();
			} 
	
	protected WebDriver getWebDriver() {
		if (driver == null) {
			driver = new FirefoxDriver();
			driver.manage().timeouts().implicitlyWait(Long.parseLong(ConfigProperties.getProperty("imp.wait")), TimeUnit.SECONDS);
		}
		return driver;
	}
	
	@After
	public void tearDown() throws Exception {
		driver.quit();
    }

Ну что еще тут не так? :(
  • 0

#13 O'Leen

O'Leen

    Новый участник

  • Members
  • Pip
  • 55 сообщений
  • Город:Киев

Отправлено 03 марта 2013 - 13:18

Каждый тест-кейс должен быть независимым и выолняться сам по себе


То есть у вас каждый тест содержит в себе процесс залогинивания?
  • 0

#14 user12

user12

    Специалист

  • Members
  • PipPipPipPipPip
  • 894 сообщений
  • ФИО:Виктор
  • Город:Минск


Отправлено 04 марта 2013 - 07:08


Каждый тест-кейс должен быть независимым и выолняться сам по себе


То есть у вас каждый тест содержит в себе процесс залогинивания?


Это от проекта зависит. Например, если в проекте только одна роль, то в принципе метод логин можно вынести в setUp(). Если ролей несколько, например: админ, модер, пользователь, то тогда каждый тест содержит метод логин.
  • 1

#15 O'Leen

O'Leen

    Новый участник

  • Members
  • Pip
  • 55 сообщений
  • Город:Киев

Отправлено 06 марта 2013 - 23:18

Помогите разобраться, пожалуйста, как в моем случае вынести вызов драйвера в аннотацию @Before.
Все лишнее из кода выкинула, оставила только то, что имеет отношение к самому драйверу, то есть, к открытию страницы.

Итак, есть класс LoginPage, который содержит информацию об URL сайта:
public class LoginPage extends Page {
	public LoginPage(WebDriver driver) {
		super(driver); 
	}

 	@Override
	public void open() {
		driver.get(ConfigProperties.getProperty("login.url"));}
        }
Есть главный класс для всех тестов BasicTestCase, в котором объявляется сам драйвер:
public class BasicTestCase {
	
	protected static WebDriver driver;

	public WebDriver getWebDriver() {
		if (driver == null) {
			driver = new FirefoxDriver();
			driver.manage().timeouts().implicitlyWait(Long.parseLong(ConfigProperties.getProperty("imp.wait")), TimeUnit.SECONDS);
		}
		return driver;
	}
И, наконец, есть класс LoginTest - собственно сам тест. В нем объявлен элемент класса LoginPage, который инициализирует драйвер
public class LoginTest extends BasicTestCase {

  private LoginPage loginPage = PageFactory.initElements(getWebDriver(), LoginPage.class);

@Test
  public void testLogin() throws Exception {
	  loginPage.open();
          ...}
       }

Не очень понятно, как все вышеописанное, что имеет отношение к драйверу, вынести в конструкцию типа
@Before
public void setUp() throws Exception {
    }
так как все, что должно быть в этой конструкции, описано в разных классах.

А еще не очень понятно, почему первый тест в сьюте выполняется без ошибок, хотя для него ведь тоже не прописано @Before. Но запуск самого первого теста все же вызывает открытие браузера. Почему после того, как был выполнен tearDown(), этот же самый тест не может открыть браузер точно такими же методами, как первый тест из тестсьюта?
  • 0

#16 barancev

barancev

    Администратор

  • Admin
  • PipPipPipPipPipPip
  • 6 872 сообщений
  • ФИО:Алексей Баранцев
  • Город:Россия, Москва


Отправлено 07 марта 2013 - 06:29

public class BasicTestCase {



  protected WebDriver driver;



  @Before

  public void setUp() throws Exception {

    driver = new FirefoxDriver();

    driver.manage().timeouts().implicitlyWait(Long.parseLong(ConfigProperties.getProperty("imp.wait")), TimeUnit.SECONDS);

  } 



  @After

  public void tearDown() throws Exception {

    driver.quit();

  }

}

  • 0
Алексей Баранцев
Тренинги для тестировщиков (тестирование производительности, защищенности, тест-дизайн, автоматизация):
Линейка тренингов по Selenium

#17 O'Leen

O'Leen

    Новый участник

  • Members
  • Pip
  • 55 сообщений
  • Город:Киев

Отправлено 07 марта 2013 - 08:14

Да, но...
Я теперь не могу так просто безболезненно удалить старую конструкцию
        public WebDriver getWebDriver() {
                if (driver == null) {
                        driver = new FirefoxDriver();
                        driver.manage().timeouts().implicitlyWait(Long.parseLong(ConfigProperties.getProperty("imp.wait")), TimeUnit.SECONDS);
                }
                return driver;
        }
так как метод getWebDriver() у меня содержится в каждом тесте в виде
  private LoginPage loginPage = PageFactory.initElements(getWebDriver(), LoginPage.class);
А если на loginPage убрать инициализацию браузера, то как мне указать, что первая открытая страница это и есть loginPage?
  • 0

#18 tab15

tab15

    Активный участник

  • Members
  • PipPip
  • 128 сообщений

Отправлено 07 марта 2013 - 08:22


public WebDriver getWebDriver() {

    //if (driver == null) {

          driver = new FirefoxDriver();

          driver.manage().timeouts().implicitlyWait(Long.parseLong(ConfigProperties.getProperty("imp.wait")), TimeUnit.SECONDS);

    //}

          return driver;

}


  • 0

#19 O'Leen

O'Leen

    Новый участник

  • Members
  • Pip
  • 55 сообщений
  • Город:Киев

Отправлено 07 марта 2013 - 08:43

public WebDriver getWebDriver() {
    //if (driver == null) {
          driver = new FirefoxDriver();
          driver.manage().timeouts().implicitlyWait(Long.parseLong(ConfigProperties.getProperty("imp.wait")), TimeUnit.SECONDS);
    //}
          return driver;
}

Я все это понимаю. Но блин! Нельзя же одновременно реализовать конструкцию @Before с вызовом драйвера, и еще инициализировать вызов драйвера в другом месте, т.к. при этом открывается 2 страницы браузера(((
По идее все, что относится к вызову драйвера нужно описать только используя аннотацию @Before, и нигде больше не вызывть драйвер в другом месте. Но все же как тогда указать, что первая открытая страница это и есть loginPage?
  • 0

#20 Julia_Sh

Julia_Sh

    Новый участник

  • Members
  • Pip
  • 63 сообщений
  • ФИО:Юлия
  • Город:Новосибирск

Отправлено 03 мая 2013 - 07:56


public WebDriver getWebDriver() {
    //if (driver == null) {
          driver = new FirefoxDriver();
          driver.manage().timeouts().implicitlyWait(Long.parseLong(ConfigProperties.getProperty("imp.wait")), TimeUnit.SECONDS);
    //}
          return driver;
}

Я все это понимаю. Но блин! Нельзя же одновременно реализовать конструкцию @Before с вызовом драйвера, и еще инициализировать вызов драйвера в другом месте, т.к. при этом открывается 2 страницы браузера(((
По идее все, что относится к вызову драйвера нужно описать только используя аннотацию @Before, и нигде больше не вызывть драйвер в другом месте. Но все же как тогда указать, что первая открытая страница это и есть loginPage?


Проверить заголовок страницы, либо элемент страницы, который гарантированно присутствует на странице loginPage (например, надпись "Вход в систему").
  • 0


Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных