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

Фотография

assertEquals()


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

#1 prodigy

prodigy

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

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

Отправлено 12 июня 2008 - 19:40

Здравствуйте!

Недавно познакомился с селениум рц, но возник вопрос с методом assertEquals(), который в случае несоответствия объектов, прерывает тест, генерируя при этом исключительную ситуацию. А есть ли какой-то метод, который бы не прерывал выполнение теста, а переходил к выполнению следующей команды? запихивать каждый асерт в try-catch не хочется. Может есть варианты другие?
  • 0

#2 the_norn

the_norn

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

  • Members
  • PipPip
  • 91 сообщений
  • ФИО:Kononov Roman

Отправлено 13 июня 2008 - 06:20

1) не использовать стандартные ассерты а писать все в булевы переменные, затем в конце тесты проверять(неудобно,неинформативно)
2) при запуске юнит тестов из анта поиграться параметрами таска Junit (failonerror,haltonfailure) (если конечно вы пишете в Java, для остальных языков тоже есть что то подобное)
3)Попробовать использовать альтернативные способы запуска тестов (в Java например TestNG позволяет обработать подобное)
  • 0

#3 NLord

NLord

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

  • Members
  • PipPip
  • 108 сообщений

Отправлено 13 июня 2008 - 06:53

А есть ли какой-то метод, который бы не прерывал выполнение теста, а переходил к выполнению следующей команды? запихивать каждый асерт в try-catch не хочется. Может есть варианты другие?


В дополнение к сказанному the_norn:

Совсем не обязательно оборачивать каждый ассерт в попытайся/поймай, можно использовать verifyXYQ() методы из SeleneseTestCase, самостоятельно переопределить нужный ассерт, либо написать собственный верифай вроде такого (для Джавы):

public void verifyEquals (String message,Object o1, Object o2){
	   try{
			assertEquals(message, o1,o2);
		}
		catch(AssertionError e){
			logVerificationError("4to-to informativnoe");
			countVerificationErrors++;
		}
	}

В конце теста отслеживать значение countVerificationErrors и т.д., это уже как Вам удобно.
  • 0
"Меня терзают смутные сомненья..." что это работает.

#4 Biasha

Biasha

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

  • Members
  • PipPip
  • 130 сообщений
  • Город:СПб

Отправлено 12 ноября 2008 - 11:46

Совсем не обязательно оборачивать каждый ассерт в попытайся/поймай, можно использовать verifyXYQ() методы из SeleneseTestCase, самостоятельно переопределить нужный ассерт, либо написать собственный верифай вроде такого (для Джавы):


В конце теста отслеживать значение countVerificationErrors и т.д., это уже как Вам удобно.


А напишите поподробнее, что это за методы verifyXYQ()? Пример такого метода и как его вызывать в коде?
Пробую использовать IDE-подобные verifyVisible итп - компилятор их не видит. Класс myTest наследую от SeleneseTestCase.
  • 0
Молодой пожарный не боится пламя!

#5 NLord

NLord

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

  • Members
  • PipPip
  • 108 сообщений

Отправлено 12 ноября 2008 - 12:04

Совсем не обязательно оборачивать каждый ассерт в попытайся/поймай, можно использовать verifyXYQ() методы из SeleneseTestCase, самостоятельно переопределить нужный ассерт, либо написать собственный верифай вроде такого (для Джавы):


В конце теста отслеживать значение countVerificationErrors и т.д., это уже как Вам удобно.


А напишите поподробнее, что это за методы verifyXYQ()? Пример такого метода и как его вызывать в коде?
Пробую использовать IDE-подобные verifyVisible итп - компилятор их не видит. Класс myTest наследую от SeleneseTestCase.

Я использую класс отнаследованный от DefaultSelenium и собственно тесты не наследую от SeleneseTestCase (так уж исторически сложилось ;) ). В "моём" селениуме есть методы вроде :
public void verifyTrue (String message, boolean exp){
	   try{
			assertTrue(exp);
		}
		catch(AssertionError e){
			logVerificationError("Verification error, expression is not true."
								+ "\n Location is: "+ super.getLocation()
								+ "\n Err. message: "+e.getMessage()
								+ "\n Details: "+e.toString()
								+ "\n Comment: " +message);
			captureScreenshot(LoggingUtils.timeStampForFileName()
								+ " VerificationError_Expression is not true_"
								+ AuxiliaryMethods.getOnlyAlphaNumeric(message));
		}
	}


вызов в тесте:
...
selenium.verifyTrue(expression);
...

В SeleneseTestCase они заявляли наличие публичных методов из серии verifyTrue(), соответственно если Вы наследуете от SeleneseTestCase, то вызов в тесте
простым написанием имени метода
verifyTrue(expression);
  • 0

#6 Biasha

Biasha

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

  • Members
  • PipPip
  • 130 сообщений
  • Город:СПб

Отправлено 12 ноября 2008 - 13:43

В SeleneseTestCase они заявляли наличие публичных методов из серии verifyTrue(), соответственно если Вы наследуете от SeleneseTestCase, то вызов в тесте
простым написанием имени метода
verifyTrue(expression);


Да, вот такой код компилируется:

verifyTrue(browser.isElementPresent("LoginTextBox"));

Однако он всегда проходит успешно, даже когда должна показаться ошибка, например для verifyTrue(browser.isElementPresent("LoginTextBoxsfgsdgfdgdfgdfg"));

Или я что-то неправильно делаю?
  • 0
Молодой пожарный не боится пламя!

#7 vitorg

vitorg

    Опытный участник

  • Members
  • PipPipPipPip
  • 408 сообщений

Отправлено 12 ноября 2008 - 16:35

Или я что-то неправильно делаю?

Всё правильно, но:

This class adds a number of "verify" commands, which are like "assert" commands,

* but they don't stop the test when they fail. Instead, verification errors are all

* thrown at once during tearDown.

Так что смотри в tearDown'е. Кстати, в JUnit tearDown не запустится если setUp выкинул исключение, это надо учитывать.
  • 0

#8 Biasha

Biasha

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

  • Members
  • PipPip
  • 130 сообщений
  • Город:СПб

Отправлено 13 ноября 2008 - 14:51

This class adds a number of "verify" commands, which are like "assert" commands,

* but they don't stop the test when they fail. Instead, verification errors are all

* thrown at once during tearDown.

Так что смотри в tearDown'е. Кстати, в JUnit tearDown не запустится если setUp выкинул исключение, это надо учитывать.


Вот такой вот tearDown:

public void tearDown() {
browser.stop();
}

Нужно что-то добавить в него, чтобы после прохождения теста видеть, в каких местах были ошибки?
  • 0
Молодой пожарный не боится пламя!

#9 vitorg

vitorg

    Опытный участник

  • Members
  • PipPipPipPip
  • 408 сообщений

Отправлено 13 ноября 2008 - 20:56

[кусь]
Нужно что-то добавить в него, чтобы после прохождения теста видеть, в каких местах были ошибки?

Конечно, не хватает вызова super.tearDown() в самом начале.

А вообще я бы не стал пользоваться этим SeleneseTestCase, очень уж он древний (по коду). Наследуется от TestCase (так было в стародавние времена JUnit 3) да и вообще в нём мало чего полезного, так, для начала можно попользовать, но если смотреть в будущее и закладываться на правильную и удобную для себя архитектуру, то от него лучше отказаться.
  • 0

#10 Biasha

Biasha

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

  • Members
  • PipPip
  • 130 сообщений
  • Город:СПб

Отправлено 19 ноября 2008 - 10:12

Конечно, не хватает вызова super.tearDown() в самом начале.


Извините за глупый вопрос, но где именно "в самом начале"?
Вообще tearDown вызывается и так после теста.
  • 0
Молодой пожарный не боится пламя!

#11 vitorg

vitorg

    Опытный участник

  • Members
  • PipPipPipPip
  • 408 сообщений

Отправлено 19 ноября 2008 - 10:17

Извините за глупый вопрос, но где именно "в самом начале"?
Вообще tearDown вызывается и так после теста.


В самом начале переопределённого метода tearDown. Т.е. примерно вот так должно быть:
public void tearDown() {
	super.tearDown();
	browser.stop();
}
Правда если родительский метод может выкинуть исключение (надо посмотреть), то надо заворачивать в try/catch.
  • 0

#12 Biasha

Biasha

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

  • Members
  • PipPip
  • 130 сообщений
  • Город:СПб

Отправлено 19 ноября 2008 - 12:27

Да, требуется try/catch:

public void tearDown() {
try {super.tearDown();}
catch (Exception e){}
finally {
browser.stop();}
}
Но возникает еще один вопрос:
Описанный выше вариант отлавливает ошибки verify(). Но если при этом не был найден какой-либо компонент формы, то обычный в таком случае "Element not found" не выдается.
Можно ли после прохождения теста просматиривать ВСЕ исключения, которые были сгенерированы?
  • 0
Молодой пожарный не боится пламя!

#13 vitorg

vitorg

    Опытный участник

  • Members
  • PipPipPipPip
  • 408 сообщений

Отправлено 19 ноября 2008 - 12:36

Но если при этом не был найден какой-либо компонент формы, то обычный в таком случае "Element not found" не выдается.

Это как? Element not found проявляется в виде исключения, которое выкидывает драйвер, а соответственно тест должен протолкнуть его дальше либо не обрабатывать, в этом случае он не может не выдаваться.
Можно посмотреть пример кода когда такое происходит?
  • 0

#14 Biasha

Biasha

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

  • Members
  • PipPip
  • 130 сообщений
  • Город:СПб

Отправлено 19 ноября 2008 - 13:39

Может, я бестлоково выразилась, но суть такая:

Вариант 1: Запускаю тест с ложным verify()
verifyTrue(browser.isElementPresent("LoginTextBoxjhgjhg"));
Результат: эксепшкн ловится и вываливается в конце теста в tearDown. Все хорошо.

Вариант 2: Запускаю тест, в котором есть обращение к несуществующему компоненту:
browser.type("LoginTextBoxkjhkjh","testnadja");
Результат: эксепшен валится сразу, тест прерывается. Сообщение Element not found. Тоже все понятно.

Вариант 3: В одном тесте оба варианта
verifyTrue(browser.isElementPresent("LoginTextBoxjhgjhg"));
browser.type("LoginTextBoxkjhkjh","testnadja");
Результат: как в варианте 1, то есть не показано сообщение о том, что элемент LoginTextBoxkjhkjh не найден.

Не скажу что это сильно неудобно, но все-таки хотелось бы наблюдать все исключения сразу))
  • 0
Молодой пожарный не боится пламя!

#15 NLord

NLord

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

  • Members
  • PipPip
  • 108 сообщений

Отправлено 19 ноября 2008 - 14:26

Может, я бестлоково выразилась, но суть такая:

Вариант 1: Запускаю тест с ложным verify()
verifyTrue(browser.isElementPresent("LoginTextBoxjhgjhg"));
Результат: эксепшкн ловится и вываливается в конце теста в tearDown. Все хорошо.

Вариант 2: Запускаю тест, в котором есть обращение к несуществующему компоненту:
browser.type("LoginTextBoxkjhkjh","testnadja");
Результат: эксепшен валится сразу, тест прерывается. Сообщение Element not found. Тоже все понятно.

Вариант 3: В одном тесте оба варианта
verifyTrue(browser.isElementPresent("LoginTextBoxjhgjhg"));
browser.type("LoginTextBoxkjhkjh","testnadja");
Результат: как в варианте 1, то есть не показано сообщение о том, что элемент LoginTextBoxkjhkjh не найден.

Не скажу что это сильно неудобно, но все-таки хотелось бы наблюдать все исключения сразу))


Наследуйтесь от selenium, оборачивайте все click/type в try/catch с журналированием всех исключений в один общий буфер и в tearDown() скидывайте его в файл. Потом - читайте, изучайте. У нас сделано почти так, плюс используется http://loggingseleni....net/index.html ,
снимает картинки автоматом, отчёт в хтмл-е выдаёт, милая штука в общем.
  • 0
"Меня терзают смутные сомненья..." что это работает.

#16 vitorg

vitorg

    Опытный участник

  • Members
  • PipPipPipPip
  • 408 сообщений

Отправлено 19 ноября 2008 - 14:35

Наследуйтесь от selenium, оборачивайте все click/type в try/catch с журналированием всех исключений в один общий буфер и в tearDown() скидывайте его в файл. Потом - читайте, изучайте. У нас сделано почти так, плюс используется http://loggingseleni....net/index.html ,
снимает картинки автоматом, отчёт в хтмл-е выдаёт, милая штука в общем.

Согласен, это более правильный путь чем тащить за собой SeleneseTestCase.
А по поводу последнего вопроса - открываешь исходник SeleneseTestCase и смотришь, там всё просто.
  • 0


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

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