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

Фотография

Вопрос по Java и TestNG


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

#1 DrBlast

DrBlast

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

  • Members
  • PipPip
  • 139 сообщений
  • ФИО:Евгений
  • Город:Москва

Отправлено 15 февраля 2012 - 21:20

Задача: добавить информативности в логирование ошибок.
Использую связку selenium + java + testng
Для "мягких" проверок реализовал (точнее будет сказать взял реализацию) TestBase (где-то на просторах интеренета, к сожалению не сохранил ссылку).

Суть в следующем: переопределяются все методы assertTrue, false и т.д.
try{
    assertTrue(..., message)
} catch (AssertionExcetion ae){
    throw ae; //ожидаем что исключение пробросится наверх
}

добавляются методы verifyTrue, false и т.д.
Мягкая проверка делается через (например для verifyTrue
try{
    assertTrue(..., message);
} catch (AssertionExcetion ae){
    addVerificationFailure(ae); //тут просто собирается скоуп всех экшепненов в тесте и в конце теста распечатывается.
}

Схема остального кода выглядит схематично так:
private void checkFieid1()throws Exception{
try{
...
commonFunc(...);
...
}catch(Exception e)
throw new Exception("Тестирование поля 1 не пройдено\n" + e.getMessage, e)
}

private void checkFieid2()throws Exception{
try{
...
commonFunc(...);
...
}catch(Exception e)
throw new Exception("Тестирование поля 2 не пройдено\n" + e.getMessage, e)
}

private void commonFunc(...)throws Exception{
try{
...
assertTrue(...,message);
...
}catch(Exception e)
throw new Exception("message for common func", e)
}

@Test
public void test1() throws Exception{
try{
  checkField1();
  checkField2();
...
}catch(Exception e){
throw new Excetion("Test 1 failed \n" + e.getMessage,e);}



Проблема заключается в следующем, при возникновении исключения при assert (строгой проверке) выводится сообщение <expected "true", but was "false">. Данное сообщение вводит в ступор, т.к. не понятно сразу в каком месте упало, да
и стектрейс вылядит так, как будто он дальше по иерархии не пробрасывается..

Из приведенного примера, при первом взгляде на лог, абсолются не понятно в каком месте произошла ошибка, то ли в checkField1, то ли в checkField2. Писать что-то в сообщении к assert'у - тоже не вариант, по той же причине.

Нужно чтобы все выглядело так:
Test 1 failed
Тестирование поля 1 не пройдено
expected "true", but was "false"
...стектрейс...

Собственно все так и срабатывает для других исключений (не найден элемент, превышено время ожидания и т.д.), а с assert'ом не хочет...
Что необходимо сделать, чтобы он пробрасывался куда надо? Т.е. в метод из которого он был вызван (ну и далее по иерархии теста)

Таже проблема с verify,но тут при наличии решения для ассерта, придумать что делать проще :)

...надеюсь понятно описал...
  • 0
Если ничего не помогает, прочтите наконец инструкцию!

#2 egorza

egorza

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

  • Members
  • Pip
  • 26 сообщений
  • ФИО:Замараев Егор


Отправлено 16 февраля 2012 - 06:10

В последней строчке кода нехватает p в слове Exception, но ведь дело не в этом, да?)
throw new Excetion("Test 1 failed \n" + e.getMessage,e);}
  • 0

#3 DrBlast

DrBlast

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

  • Members
  • PipPip
  • 139 сообщений
  • ФИО:Евгений
  • Город:Москва

Отправлено 16 февраля 2012 - 08:15

В последней строчке кода нехватает p в слове Exception, но ведь дело не в этом, да?)
throw new Excetion("Test 1 failed \n" + e.getMessage,e);}


К сожалению, да...
  • 0
Если ничего не помогает, прочтите наконец инструкцию!

#4 snark

snark

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

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

Отправлено 16 февраля 2012 - 08:23

очевидно что не срабатывает " catch (AssertionExcetion ae) "
Может просто catch (Exception е)попробывать?
  • 0

#5 DrBlast

DrBlast

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

  • Members
  • PipPip
  • 139 сообщений
  • ФИО:Евгений
  • Город:Москва

Отправлено 16 февраля 2012 - 08:24

Нашел способ решения проблемы, можно сказат ьчто и два способа:
1. Наверх пробрасывается AssertionError.
public static void assertFalse(boolean condition) throws AssertionError {
 try {
    Assert.assertFalse(condition);
 } catch (AssertionError e) {
    throw e;
 }
}

А в основном коде в конце функции делается отдельный catch (AssertionError ae)
try{
...
  assertFalse(...);
..
}
catch (Exception e) {
  logger.error("\n   Тест на проверку обязательных для заполнения полей не пройден\n");
  throw new Exception(" \r\nТест на проверку обязательных для заполнения полей не пройден" + e.getMessage(), e);
catch (AssertionError ae) {
  throw new Exception(" \r\nАссерт не пройден" + ae.getMessage(), ae);
}

2. Cразу пробрасываем Exception, а не AssertionError:
public static void assertFalse(boolean condition) throws Exception {
 try {
    Assert.assertFalse(condition);
 } catch (AssertionError ae) {
     throw new Excetion(ae.getMessage());
 }
}

Все дело в том, что AssertionError наследуется от Error, а Error от Throwable
А Exception наследуется сразу от Throwable.
В результате они друг друга не ловят))
  • 0
Если ничего не помогает, прочтите наконец инструкцию!

#6 Skuayer

Skuayer

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

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

Отправлено 16 февраля 2012 - 08:40

приведите полный пример теста со всеми импоратми и реализацией "мягких проверок"...

в testng я вообще не нашел AssertionExcetion, assert выкидывает AssertionError.

а так похоже у вас не срабатывает последний catch, пройдитесь под дебагом и посмотрите что куда идет..

//пока писал ответ, вы сами разобрались уже)
  • 0

#7 ivan_ochc

ivan_ochc

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

  • Members
  • Pip
  • 8 сообщений
  • ФИО:И.Г.

Отправлено 03 декабря 2012 - 19:35

Добрый вечер!
По примеру _http://www.youtube.com/watch?v=bkaTElYx5N0 наваял шаблон.
Но практически сразу возникли вопросы. Один из них: как заменить assert на мягкую проверку verify? Нужно, чтобы тест не останавливался на первой же ошибке, а продолжал свою работу и в конце выдавал список ошибок.
Из описания в этой теме и на других ресурсах не совсем понятно, как применить эти рекомендации к моему примеру.
Например:

метод, который находит текст

public static boolean isTextPresent(String text) {
try{
return driver.findElement(By.tagName("body")).getText().contains(text);
} catch (NoSuchElementException e) {
return false;

}


существует ли указаный текст на странице:

public boolean checkError() {
if (isTextPresent("Особовий")) {
return true;
}
else {
return false;
}
}


Если текст существует, значит "плохо" ;)

assertFalse(homePage.checkError());


Вопрос: как заменить вышеуказанный assert на verify?
  • 0

#8 ivan_ochc

ivan_ochc

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

  • Members
  • Pip
  • 8 сообщений
  • ФИО:И.Г.

Отправлено 04 декабря 2012 - 13:26

Пока что удалось реализовать мягкую проверку таким способом:

public void assertSoft(boolean success, String message, StringBuilder messages) {
if (!success) messages.append(message);
}

public void assertSoftFalse(boolean success, String message, StringBuilder messages) {
if (success) messages.append(message);
}

public void assertEmpty(StringBuilder sb) {
if (sb.length() > 0) {
throw new AssertionError(sb.toString());
}
}

assertSoftFalse(homePage.checkError(), "Default error", result);



В итоге в стектрейсе мне пишет:

Total tests run: 1, Failures: 1, Skips: 0 - под failures имеется ввиду заваленых тестов, а не количество ошибок в тесте? так?

FAILED: testLogin
java.lang.AssertionError: Default errorExceptionDefault error - не очень красиво выглядит. Без пробелов, в один ряд. Как бы это исправить.
  • 0


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

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