Запуск тестов через JUnit4 в определенном порядке
#1
Отправлено 01 марта 2013 - 10:50
И еще вопрос: тесты, которые вы пишете, они связанны между собой? Или же каждый тест является независимым и выполняется сам по себе?
#2
Отправлено 01 марта 2013 - 11:50
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) { } }
#3
Отправлено 01 марта 2013 - 12:52
Подскажите, пожалуйста, как можно запустить тесты через JUnit 4 в определенном порядке, и что для этого нужно.
И еще вопрос: тесты, которые вы пишете, они связанны между собой? Или же каждый тест является независимым и выполняется сам по себе?
в JUnit тесты выполняются в том порядке, в котором они располагаются, в TestNG в порядке сортировки
Каждый тест-кейс должен быть независимым и выолняться сам по себе
#4
Отправлено 01 марта 2013 - 14:25
Спасибо! Создала TestSuite по вашему примеру, при запуске первый тест выполняется, второй же неизбежно падает.. Сами тесты не зависимы друг от друга, если запускать оба теста отдельно - все работает. Почему второй тест валится сразу же, на первой строке? Может есть какие-то ньюансы?Создать 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) { } }
#5
Отправлено 01 марта 2013 - 14:53
#6
Отправлено 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(); }
Но как выйти из этой ситуации?
#7
Отправлено 01 марта 2013 - 15:33
#8
Отправлено 01 марта 2013 - 15:34
Как у вас осуществляется создание объекта driver?
#9
Отправлено 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(); }
#10
Отправлено 01 марта 2013 - 15:51
а анотация @before или @beforeclass не поможет?
что-то вроде
@Before public void setUp() throws Exception { }
?
Прошу прощения, я новичок в использовании селениума и джавы вообще
#11
Отправлено 01 марта 2013 - 16:02
#12
Отправлено 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(); }
Ну что еще тут не так? :(
#13
Отправлено 03 марта 2013 - 13:18
Каждый тест-кейс должен быть независимым и выолняться сам по себе
То есть у вас каждый тест содержит в себе процесс залогинивания?
#14
Отправлено 04 марта 2013 - 07:08
Каждый тест-кейс должен быть независимым и выолняться сам по себе
То есть у вас каждый тест содержит в себе процесс залогинивания?
Это от проекта зависит. Например, если в проекте только одна роль, то в принципе метод логин можно вынести в setUp(). Если ролей несколько, например: админ, модер, пользователь, то тогда каждый тест содержит метод логин.
#15
Отправлено 06 марта 2013 - 23:18
Все лишнее из кода выкинула, оставила только то, что имеет отношение к самому драйверу, то есть, к открытию страницы.
Итак, есть класс 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(), этот же самый тест не может открыть браузер точно такими же методами, как первый тест из тестсьюта?
#16
Отправлено 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(); } }
Тренинги для тестировщиков (тестирование производительности, защищенности, тест-дизайн, автоматизация):
Линейка тренингов по Selenium
#17
Отправлено 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?
#18
Отправлено 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; }
#19
Отправлено 07 марта 2013 - 08:43
Я все это понимаю. Но блин! Нельзя же одновременно реализовать конструкцию @Before с вызовом драйвера, и еще инициализировать вызов драйвера в другом месте, т.к. при этом открывается 2 страницы браузера(((public WebDriver getWebDriver() { //if (driver == null) { driver = new FirefoxDriver(); driver.manage().timeouts().implicitlyWait(Long.parseLong(ConfigProperties.getProperty("imp.wait")), TimeUnit.SECONDS); //} return driver; }
По идее все, что относится к вызову драйвера нужно описать только используя аннотацию @Before, и нигде больше не вызывть драйвер в другом месте. Но все же как тогда указать, что первая открытая страница это и есть loginPage?
#20
Отправлено 03 мая 2013 - 07:56
Я все это понимаю. Но блин! Нельзя же одновременно реализовать конструкцию @Before с вызовом драйвера, и еще инициализировать вызов драйвера в другом месте, т.к. при этом открывается 2 страницы браузера(((
public WebDriver getWebDriver() { //if (driver == null) { driver = new FirefoxDriver(); driver.manage().timeouts().implicitlyWait(Long.parseLong(ConfigProperties.getProperty("imp.wait")), TimeUnit.SECONDS); //} return driver; }
По идее все, что относится к вызову драйвера нужно описать только используя аннотацию @Before, и нигде больше не вызывть драйвер в другом месте. Но все же как тогда указать, что первая открытая страница это и есть loginPage?
Проверить заголовок страницы, либо элемент страницы, который гарантированно присутствует на странице loginPage (например, надпись "Вход в систему").
Количество пользователей, читающих эту тему: 0
0 пользователей, 0 гостей, 0 анонимных