Как реализовать в тестовом сценарии условие if

Добрый вечер. Хотелось бы спросить как проще реализовать следующий тестовый сценарий. Я открываю раздел в котором есть грид с данными. После фильтрации по одному из параметров я совершаю дальнейшие действия либо делаю выход.

@Test
LoginAs();
OpenOrderList();
FilterByParametr();
if(TotalCashAmount == 0)
Logout();
else {
OtherTestSteps

Вот как то так. Можно ли сделать это как то по другому? Без if else?

  1. Основной вопрос: что проверяет тест?
  2. Вместо if/else в принципе можно использовать assert. Но сначала важен ответ на вопрос 1

assert - не очень хорошая замена if else. Читабельность кода понизится “до плинтуса”.
А чем собственно не нравится if/else? вполне неплохое решение ведь

Если это в другом блоке, можно так:

@Test 
LoginAs();
OpenOrderList();
FilterByParametr();
if (TotalCashAmount == 0) {
  Logout();
  return;
}
OtherTestSteps

Но всё же вопрос: если

TotalCashAmount == 0

то какой результат теста должен быть — fail / pass / skip / …?


Тест должен проверять один кейс, НО он не будет выполняться если нет данных. Я выполняю фильтрацию в гриде и если фильтр будет пустой (т.е. не содержать элементов для дальнейшего выполнения) то я делаю выход из системы. Сейчас просто тест ждет элемента 30 сек и падает с fail но по сути это не fail, а просто отсутствие элементов. Вот я и хочу сделать обработку. А можно через try catch как то сделать? Какой вариант проще? Если я буду делать простой assert он же не будет делать его так же как и if/else?

статус должен быть - pass.

Используем в таких случаях if/else. Например, есть ряд сайтов для тестирования, которые в основном имеют схожий функционал, но присутствуют расхождения. В таком случае смело используем конструкцию if/else.

// do general steps 
    if(site1)
    {
       // do speсific steps for site 1
    }
    else if (site2)
    {
      // do speсific steps for site 2
    }
// do general steps 

И таких конструкций немало. Функционально и наглядно. Не нужно стесняться)

мне наверно хватит одного if

В Вашем случае, так:

@Test
public void test (...)
{
   LoginAs();
   OpenOrderList();
   FilterByParametr();

   if(TotalCashAmount == 0) 
   {
      Logout();
      Assert.assertTrue(true) // for passed test
      // or Assert.assertTrue(false, "There is no cash") // for failed test
   }
   else 
   {
     // OtherTestSteps
     // other Asserts
   }

а еще вопрос как реализовать ожидание после фильтрации в гриде. Могу сделать только по ожиданию пропадания тулбара загрузки (id=load_dgReserve)

Спасибо, так и сделал.

Заводи отдельной темой, не надо всё в одном топе обсуждать

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

То, что ты предлагаешь делать (тесту самому определять где он выполняется) - неправильно.

Тест не должен ничего знать о сайтах и прочем окружении (в т.ч. браузере, ОС и т.д.), в котором он выполняется. Все знания об окружении необходимо выносить во фреймворк, который предоставляет тесту API для взаимодействия с тестируемым приложением

А зачем такой тест, который как бы работает “на половину”, и его “зеленость” ровным счетом ни о чем не говорит?

Абсолютно согласен. В данном случае, речь не шла о структуре фреймворка. Отписался по конкретному случаю.

1 лайк

Это как так? Если тест не выполнялся, он не должен возвращать PASSED. Пусть хотя бы SKIPPED возвращает. Иначе у тебя часть приложения не проверялась, а результат получаешь PASSED. Ерунда какая-то

Да согласен, а как тогда будет выглядеть, чтобы Skipped возвращало?

кстати if будет выглядеть вот так if (Integer.parseInt(chekCount) == 0) пришлось приводить его к int

Зрите глубже - если вы не можете привести систему в состояние, что бы результат фильтрации возвращал записи - то этот тест бесполезен.
Что будет значит статус skipped? Что в фильтрации баг? Или просто нет кандидатов? Или грид “поломался”? Или кнопка не работает? Или “тотал” не считается?