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

Фотография

Правильное разбиенте теста на этапы


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

#1 Marisya

Marisya

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

  • Members
  • Pip
  • 10 сообщений
  • ФИО:Мария
  • Город:Санкт-Петербург

Отправлено 19 декабря 2011 - 08:54

После переноса тесто в IDEA появился класс TestList c огромным методом:

@Test
     public void testList() throws Exception {
//Логин
(набор шагов чтобы залогиниться)

//Создание нового списка
(набор шагов)

//Открытие списка на редактирвоание
(набор шагов)
     }

Скажу сразу, что метод testList()запускается и отрабатывает как ему и положено.
Однако хотелось бы оптимизировать эту конструкцию - например, вынести логин в отдельный класс, чтобы использовать потом в других методах.

Сказано - сделано. Получилась такая конструкция:

@Test
     public void testList() throws Exception {

Login.login();

//Создание нового списка
(набор шагов)

//Открытие списка на редактирвоание
(набор шагов)
     }

После таких "переделок" при запуске testList() появляется ошибка:
com.example.tests.Login is not derived from TestCase. Do not provide method name.

Из-за чего возникает такая ошибка? Может вообще не стоит выносить логин как отдельный метод и в каждом тесте вписывать его заново?
  • 0

#2 Skuayer

Skuayer

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

  • Members
  • PipPip
  • 115 сообщений
  • ФИО:Жуков Анатолий Викторович
  • Город:Санкт-Петербург

Отправлено 19 декабря 2011 - 09:57

покажите полный код тестов, так же вобще не понято что вы там натворили)
  • 0

#3 Marisya

Marisya

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

  • Members
  • Pip
  • 10 сообщений
  • ФИО:Мария
  • Город:Санкт-Петербург

Отправлено 19 декабря 2011 - 10:54

Логин:

import com.sun.java.swing.plaf.windows.resources.windows;
import org.junit.*;
import org.openqa.selenium.*;
import org.openqa.selenium.support.ui.ExpectedCondition;
import org.openqa.selenium.support.ui.Select;
import org.openqa.selenium.support.ui.WebDriverWait;
import java.util.HashSet;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.WebElement;

public class Login extends Parent{
        public static void login() throws Exception {
        driver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);
        driver.get(baseUrl);
	driver.findElement(By.name("username")).clear();
	driver.findElement(By.name("username")).sendKeys(usedUsername);
	driver.findElement(By.name("psw1")).clear();
	driver.findElement(By.name("psw1")).sendKeys(usedPassword);
	driver.findElement(By.name("ok")).click();
        driver.get(baseUrl+"/folders");
}
}

Основной тестовый класс начинается так:
public class TestList extends Parent{

    @Test
	public void testList() throws Exception {

               Login.login();


               driver.findElement(By.xpath("...(достаточно длинная ссылка на путь)" )).click();
               driver.switchTo().window("listEdit");
               driver.findElement(By.id("input")).clear();
               ...
}
Переменные baseUrl, usedUsername, usedPassword и блоки @Before и @After вынесены в родительский класс.

Потворюсь-таки, что до переразбиения все запускалось и работало, т.е.Xpath'ы и вызов раличных кнопочек и элементов поулчается сделаны правильно.
Может метод или класс надо подключить как-то?
  • 0

#4 Marisya

Marisya

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

  • Members
  • Pip
  • 10 сообщений
  • ФИО:Мария
  • Город:Санкт-Петербург

Отправлено 19 декабря 2011 - 11:54

Ошибка исчезает если класс Login "отцепить" от родительского класса.
Проблема как я поняла была в том, что IDEA распознавала Login как отдельный тест. Т.е. она смотрела в парент, видела аннотации @Before и @After и не понимала почему Login.login() - не тест.
Получается так:

import com.sun.java.swing.plaf.windows.resources.windows;
import org.junit.*;
import org.openqa.selenium.*;
import org.openqa.selenium.support.ui.ExpectedCondition;
import org.openqa.selenium.support.ui.Select;
import org.openqa.selenium.support.ui.WebDriverWait;
import java.util.HashSet;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.WebElement;

    public class Login{
    static String usedUsername = "testLogin";
    static String usedPassword = "testPassword";
    static protected WebDriver driver;
        public static void login() throws Exception {
        driver.get(baseUrl);
        driver.findElement(By.name("username")).clear();
        driver.findElement(By.name("username")).sendKeys(usedUsername);
        driver.findElement(By.name("psw1")).clear();
        driver.findElement(By.name("psw1")).sendKeys(usedPassword);
        driver.findElement(By.name("ok")).click();
        driver.get(baseUrl+"/folders");
}
}

Ну и по-прежнему:

public class TestList extends Parent{

    @Test
        public void testList() throws Exception {

               Login.login();


               driver.findElement(By.xpath("...(достаточно длинная ссылка на путь)" )).click();
               driver.switchTo().window("listEdit");
               driver.findElement(By.id("input")).clear();
               ...
}

Появилась правда ошибка инициализации драйвера. Сейчас в классе Parent есть такое место:
@Before
    public void setUp() throws Exception {
        driver = new FirefoxDriver();
        driver.manage().timeouts().implicitlyWait(60, TimeUnit.SECONDS);   
    }

Т.е. Заходя в метод testList() IDEA должна сначала зайти в блок @Before, инициализирвоать драйвер, потом перейти к части @Test, там уже выполнить Login.
Но тут возникает проблема - в самом классе Login тоже нужно инициализирвоать драйвер ,чтобы не появился NullPointerException, но тогда как же инициализация этого драйвера в классе Parent? Не ясно. :(
  • 0

#5 D2Phoenix

D2Phoenix

    Постоянный участник

  • Members
  • PipPipPip
  • 200 сообщений
  • ФИО:Чадюк Вадим
  • Город:Гродно


Отправлено 19 декабря 2011 - 11:57

import com.sun.java.swing.plaf.windows.resources.windows;
import org.junit.*;
import org.openqa.selenium.*;
import org.openqa.selenium.support.ui.ExpectedCondition;
import org.openqa.selenium.support.ui.Select;
import org.openqa.selenium.support.ui.WebDriverWait;
import java.util.HashSet;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.WebElement;

    public class Login{
    static String usedUsername = "testLogin";
    static String usedPassword = "testPassword";
    protected WebDriver driver;


        public Login(WebDriver driver) {
        this.driver = driver;
        }
 
        public static void login() throws Exception {
        driver.get(baseUrl);
        driver.findElement(By.name("username")).clear();
        driver.findElement(By.name("username")).sendKeys(usedUsername);
        driver.findElement(By.name("psw1")).clear();
        driver.findElement(By.name("psw1")).sendKeys(usedPassword);
        driver.findElement(By.name("ok")).click();
        driver.get(baseUrl+"/folders");
}
}

А вызов такой:
Login login = new Login(driver);
login.login();

  • 0

#6 Marisya

Marisya

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

  • Members
  • Pip
  • 10 сообщений
  • ФИО:Мария
  • Город:Санкт-Петербург

Отправлено 20 декабря 2011 - 09:44

Благодарю, помогло. :)
  • 0


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

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