Как прервать тест с помощью NUnit C# в Catch-блоке


(Кирилл Р) #1

Добрый день.
Поясню вопрос. В тесте, например, надо перейти на другую страницу сайта через выпадающий список, но этот список бывает недоступен. Я делаю try-catch по Exception (аналога RuntimeException в C# не нашёл) и пишу сообщение об ошибке. Вопрос следующий - что такого надо написать в кетче, чтобы тест перестал выполняться?
А то так у меня валит ещё кучу лишних ошибок, которые мне уже не нужны.
Есть вариант

try {
    //
}
catch(Exception e) {
    Console.Write("сообщение" + e)
    throw new Exception();
}

Но, может, это можно как-то стандартными средствами NUnit сделать?


(Sergey Korol) #2

Вообще говоря, писать try / catch в тестах - моветон. Если вы хотите прервать выполнение в случае отсутствия элемента, сделайте assertTrue на isPresent. Естественно, isPresent - не является нативной функцией селениума. Собственно, внутри нее вы можете сделать ваш try / catch на findElement и возвращать true, если элемент найден, или false - в случае exception. Или переопределите findElement таким образом, чтобы он выбрасывал нужный вам текст, а не полный стектрейс. Хотя, лично я бы таким не заморачивался, но дело ваше.


(Александр Таранков) #3
  1. Чтобы тест перестал выполняться ничего делать не надо. В том числе Try/Catch - тест перестанет выполняться, словив исключение.
  2. Если отсутствие выпадающего списка - это ожидаемая нормальная ситуация, то и try надо делать на эту одну единственную проверку, чтоб catch отрабатывал именно для неё
  3. И вообще всю навигацию архитектурно правильно выносить с отдельный слой, абстрагировав её от тестов

(Кирилл Р) #4

В тестах у меня, например, так сделано:

    GeneralMenu.ClickListOfRO();
    GeneralMenu.ClickROAgent();

Это открывается список и в нём выбирается конкретный пункт. Если список раскрыть не удалось (это не ожидаемая ситуация), то вторая строчка валит Exception:

OpenQA.Selenium.NoSuchElementException : Unable to find element with xpath ==

Трай-кэтч я ставлю в методе ClickROAgent() (лежит отдельно)
Моя задумка в том, чтобы добавить читаемое сообщение к стэктрэйсу (чтобы если кто будет гонять тесты без меня, сразу понял, в каком месте что упало, да и мне удобней тоже) и убрать лишние исключения, которые валятся после того, как не удалось открыть нужную страницу.


(Александр Таранков) #5

Я для этого логгирую действия теста:

log "Создать объект"
def object = new TestObject("value1")

log "Изменить объект"
object.setValue("new value")

log "Проверить, что объект изменен"
assertTrue("new value".equals(object.value))

Тогда, если на каком-то шаге у меня произойдёт исключение, то в логе сохранится контекст проблемы. А в Exception будут подробности.