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

Фотография

Правильно пишем логику теста (Java, WebDriver, PageObject)


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

#1 Sagot

Sagot

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

  • Members
  • Pip
  • 19 сообщений

Отправлено 15 августа 2012 - 08:53

Пишу тесты Java + TestNG + WebDriver. Стараюсь писать "правильно":
для этого использую PageObject, тоесть в логике теста (сам класс теста) у меня нет передачи драйвера, ввода данных, сложных конструкций и локализации элементов - все выводится в методы соответствующих страниц-классов. Это удобно и нареканий нет.

НО у "правильных" тестов должно быть две особенности:
1. Тестируя и выполняя какое-то действия, они должны возвращать систему в исходное положение (убирать за собой).
2. Они должны быть независимы от предыдущих тестов. (каждый тест можно запустить отдельно и он сам делает подготовку нужного состояния)

Поэтому у меня два вопроса.

первый вопрос: Если я тестирую отправку письма, то тогда я должен буду за собой "убрать" тоесть удалить письмо из отправленных ( как вариант можно еще адресную книгу подчистить и удалить из удаленных писем тоже неплохо бы) Мой код:
public class MainFunctions extends BasicTestCase {
	
	private LoginPage loginPage;
	private HomePage homePage;
	private IncomingPage incomingPage;
	private SentPage sentPage;
	private WriteLetterPage writeLetter;

         @Test
	 public void testSendMail(){
		 
		 loginPage = new LoginPage(driver);
		 loginPage.open();
		 homePage = loginPage.loginAs();
		 assertTrue(homePage.isLoggedIn());
		 
		 incomingPage = homePage.enterIncomingPage();
		 writeLetter = incomingPage.clickWriteLetterBtn();
		 writeLetter.writeAndSendLetter();
		 assertTrue(writeLetter.isLetterSent());
		 
		 sentPage = incomingPage.enterSentPage();
		 assertTrue(sentPage.isThereSentLetters());
		 
		 sentPage.deleteLetter();
		 assertTrue(sentPage.isLetterDeleted());
		 
               }
  }	 
В итоге я делаю в два раза больше кода. Надо ли? Почтовый ящик ведь безграничен (практически) и к тому же, возможно, будут тесты в которых убрать за собой будет в несколько раз сложней чем добавить туда, если вообще будет такая возможность...

Вопрос второй: Допустим я тестирую базовую функциональность почты:
- Залогиниться
- Написать и отправить письмо
- Проверить сохранилось ли это письмо в отправленных
- Проверить можно ли удалить это письмо из отправленных.

получается если следовать правилу "все тесты должны быть независмыми" мне каждый тест кейс прийдется увеличивать на код предыдущего теста, тоесть чтобы в итоге проверить удалилось ли письмо из отправленных я должен залогиниться, написать письмо, увидеть его в отправленных, удалить от туда и еще все это ассертить после каждого шага.
Почему бы не использовать аннотации которые подвязывают тесты между собой чтобы каждый тест подготавливал состояние для исполнения следующего?

У аннотаций TestNG есть следующие параметры:
dependsOnMethods — методы, от которых зависит, сначала будут выполнены они, а затем данный метод
dependsOnGroups — группы, от которых зависит

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

Что вы скажете, как оно на практике удобней и "правильней"? Хочу просто сразу научиться правильно тесты писать...
  • 0

#2 LOLWUT

LOLWUT

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

  • Members
  • Pip
  • 22 сообщений
  • ФИО:Lol Wut

Отправлено 17 августа 2012 - 11:14

первый вопрос: Если я тестирую отправку письма, то тогда я должен буду за собой "убрать" тоесть удалить письмо из отправленных ( как вариант можно еще адресную книгу подчистить и удалить из удаленных писем тоже неплохо бы)

Если используется внешняя почта (Яндекс, гугл и тп), в очистке нет никакого смысла. Для работы вашего приложения число писем в ящике абсолютно не важно. Если внутренняя(локальный почтовый сервер) и почему то число писем важно - тогда только и нужно чистить. Проще всего скриптом каким из базы сервера.

Мой код:

Для задания прекондишенов есть всякие штуки типа @Before и @After вообще то. Что в Джюните, что в ТестНг. Алсо концепция страниц как объектов в таком исполнении меня всегда несколько удивляла.

Вопрос второй: Допустим я тестирую базовую функциональность почты:
- Залогиниться
- Написать и отправить письмо
- Проверить сохранилось ли это письмо в отправленных
- Проверить можно ли удалить это письмо из отправленных.

Что вы скажете, как оно на практике удобней и "правильней"? Хочу просто сразу научиться правильно тесты писать...

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

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

З.Ы. Стоит меньше заморачиваться на "правильно". А делать исключительно из соображений баланса между скоростью тестирования, покрытием и сложностью саппорта и масштабирования.
  • 1

#3 Sagot

Sagot

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

  • Members
  • Pip
  • 19 сообщений

Отправлено 22 августа 2012 - 13:24

LOLWUT, спасибо что пролил свет на этот вопрос. Золотая середина как всегда актуальна и здесь, а так же наверно с опытом будет понимание где что использовать...
  • 0


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

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