Добрый день. Хочу вынести повторяющиеся куски кода тестов (Java, JUnit4) в отдельные файлы (классы), есть сложности.
Во-первых, как я понял есть 2 способа это сделать, через наследование от другого класса и через использование метода другого класса без наследования. Мне больше нравится второй, хотя я пробовал оба варианта.
Пример общего класса
package common;
import org.openqa.selenium.*;
public class ComTest {
public WebDriver driver;
public void test1() throws Exception {
driver.get("http://yandex.ru");
}
}
Пример тестового класса
package registration;
import java.util.regex.Pattern;
import java.util.concurrent.TimeUnit;
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;
import common.ComTest;
public class Registration {
public WebDriver driver;
private String baseUrl;
private StringBuffer verificationErrors = new StringBuffer();
@Before
public void setUp() throws Exception {
System.setProperty("webdriver.firefox.profile", "selen");
driver = new FirefoxDriver();
baseUrl = "http://yandex.ru";
driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
}
@After
public void tearDown() throws Exception {
driver.quit();
String verificationErrorString = verificationErrors.toString();
if (!"".equals(verificationErrorString)) {
fail(verificationErrorString);
}
}
@Test
public void register() throws Exception {
ComTest reg = new ComTest();
reg.test1();
}
}
В обоих случаях получаю ошибку java.lang.NullPointerException, ссылающуюся на driver.get общего класса, как я понимаю из-за обращения к неопределенному объекту. Если в общем классе объявить вебдрайвер как public WebDriver driver = new FirefoxDriver() то ошибка исчезает, но вебдрайвер запускается во втором окне браузера, которое не закрывается. Такое впечатление что @Before и @After из тестового класса не работают. А мне как раз и нужно, чтобы они использовались из тестового класса, а из общего только отдельные методы (функции).
Я не знаю как такую задачу реализуют по-уму, хотелось бы глянуть примеры.
Решить проблему можно двумя способами:
1) в конструктор класса ComTest добавить аргумент драйвера;
2) класс ComTest должен наследоваться от Registration. Это считается классическим подходом, если говорить о тестах: все тесты наследованы от одного или нескольких суперклассов, предоставлющих как раз таки методы before и after, связанный с инициализацией и закрытием драйвера (+ инициализация окружения и корректное завершение выполнения).
Для первого случая код изменится так:
package common;
import org.openqa.selenium.*;
public class ComTest {
public final WebDriver driver;
public ComTest(WebDriver driver){
this.driver = driver;
}
public void test1() throws Exception {
driver.get("http://yandex.ru");
}
}
package registration;
import java.util.regex.Pattern;
import java.util.concurrent.TimeUnit;
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;
import common.ComTest;
public class Registration {
public WebDriver driver;
private String baseUrl;
private StringBuffer verificationErrors = new StringBuffer();
@Before
public void setUp() throws Exception {
System.setProperty("webdriver.firefox.profile", "selen");
driver = new FirefoxDriver();
baseUrl = "http://yandex.ru";
driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
}
@After
public void tearDown() throws Exception {
driver.quit();
String verificationErrorString = verificationErrors.toString();
if (!"".equals(verificationErrorString)) {
fail(verificationErrorString);
}
}
@Test
public void register() throws Exception {
ComTest reg = new ComTest(driver);
reg.test1();
}
}
Для второго случая:
package common;
import org.openqa.selenium.*;
public class ComTest extends Registration {
@Test
public void test1() throws Exception {
driver.get("http://yandex.ru");
}
}
package registration;
import java.util.regex.Pattern;
import java.util.concurrent.TimeUnit;
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;
import common.ComTest;
public class Registration {
public WebDriver driver;
private String baseUrl;
private StringBuffer verificationErrors = new StringBuffer();
@Before
public void setUp() throws Exception {
System.setProperty("webdriver.firefox.profile", "selen");
driver = new FirefoxDriver();
baseUrl = "http://yandex.ru";
driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
}
@After
public void tearDown() throws Exception {
driver.quit();
String verificationErrorString = verificationErrors.toString();
if (!"".equals(verificationErrorString)) {
fail(verificationErrorString);
}
}
}
Обратите внимание, что во втором случае аннотация @Test и сам тестовый метод полностью переехали в ваш тест ComTest