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

Фотография

Вывод в файл AssertionError


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

#1 contestar

contestar

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

  • Members
  • Pip
  • 36 сообщений
  • ФИО:Алексей

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

Всем привет.
Использую seleniumRC(1.0.3) + Java + JUnit + IDEA.
Прикрутил для логирования log4j. Возник вопрос, при использовании verifyTrue/False в лог вывожу printStackTrace. Но в нём содержится достаточно много бесполезной информации. Есть возможность каким-либо распарсить это сообщение и выводить в лог только нужную строку. Приведу пример.

Example.class
public class Example extends TestsBase {
static Logger log = Logger.getLogger(Example.class);
public void testExample() throws Exception {
log.info("Test is running…");
try {
		verifyTrue(selenium.isElementPresent(buttonSaveTask));
		verifyTrue(selenium.isElementPresent(buttonReset));
		checkForVerificationErrors();
	 }
		catch (Throwable ex) {
				log.error(ex);
				ex.printStackTrace();
				throw new Exception(ex);		   
}

В случае отсутствия buttonSaveTask или buttonReset в логе имеем следующее:
INFO : Test is running…
ERROR: java.lang.AssertionError: java.lang.AssertionError: null
	at com.thoughtworks.selenium.SeleneseTestBase.fail(SeleneseTestBase.java:356)
	at com.thoughtworks.selenium.SeleneseTestBase.assertTrue(SeleneseTestBase.java:361)
	at com.thoughtworks.selenium.SeleneseTestBase.assertTrue(SeleneseTestBase.java:365)
	at com.thoughtworks.selenium.SeleneseTestBase.verifyTrue(SeleneseTestBase.java:125)
	at com.thoughtworks.selenium.SeleneseTestCase.verifyTrue(SeleneseTestCase.java:119)
	at tests.tests.CreateTaskScreen.UI.Buttons.testExample(Example.java:34)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at junit.framework.TestCase.runTest(TestCase.java:168)
	at junit.framework.TestCase.runBare(TestCase.java:134)
	at com.thoughtworks.selenium.SeleneseTestCase.runBare(SeleneseTestCase.java:212)
	at junit.framework.TestResult$1.protect(TestResult.java:110)
	at junit.framework.TestResult.runProtected(TestResult.java:128)
	at junit.framework.TestResult.run(TestResult.java:113)
	at junit.framework.TestCase.run(TestCase.java:124)
	at junit.framework.TestSuite.runTest(TestSuite.java:232)
	at junit.framework.TestSuite.run(TestSuite.java:227)
	at com.intellij.junit3.TestRunnerUtil$SuiteMethodWrapper.run(TestRunnerUtil.java:259)
	at junit.textui.TestRunner.doRun(TestRunner.java:116)
	at com.intellij.junit3.JUnit3IdeaTestRunner.doRun(JUnit3IdeaTestRunner.java:108)
	at junit.textui.TestRunner.doRun(TestRunner.java:109)
	at com.intellij.junit3.JUnit3IdeaTestRunner.startRunnerWithArgs(JUnit3IdeaTestRunner.java:42)
	at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:192)
	at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:64)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at com.intellij.rt.execution.application.AppMain.main(AppMain.java:110)

Я хочу получить в логе только это:
INFO : Test is running…
ERROR:at tests.tests.CreateTaskScreen.UI.Buttons.testExample(Example.java:34)

Это возможно?

Может вообще применить иной подход к логированию? Например, чтобы лог был таким:
INFO : Test is running…
ERROR: Button Save Task doesn't exist

В таком случае как добиться такого вывода.

Спасибо.
  • 0

#2 enki86

enki86

    Постоянный участник

  • Members
  • PipPipPip
  • 231 сообщений


Отправлено 07 июля 2010 - 04:54

А в чем проблема?
так и пишите log.error(yourMessage)
или так log.error(yourMessage, ex)
  • 0

#3 contestar

contestar

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

  • Members
  • Pip
  • 36 сообщений
  • ФИО:Алексей

Отправлено 07 июля 2010 - 07:14

А в чем проблема?
так и пишите log.error(yourMessage)
или так log.error(yourMessage, ex)


Дело в том, что в одном тесте идёт проверка большого числа элементов. Например, все лейблы на странице (~50 штук), другой тест - проверка такого же количества полей. Поэтому было бы проще выводить log.error только для тех элементов, которые действительно failed.

Как уже привёл в первом посте идёт проверка наличия кнопок их может быть огромное количество:

1. verifyTrue(selenium.isElementPresent(button1))
2. verifyTrue(selenium.isElementPresent(button2))
.
.
50. verifyTrue(selenium.isElementPresent(button50))

Допустим, verify - failed для 10 кнопок, тогда лог получим довольно внушительным. Мне хотелось бы вывести в лог только строки для этих 10-ти кнопок.

tests.tests.CreateTaskScreen.UI.Buttons.testButtons(Buttons.java:41)
tests.tests.CreateTaskScreen.UI.Buttons.testButtons(Buttons.java:52)
tests.tests.CreateTaskScreen.UI.Buttons.testButtons(Buttons.java:59)
...

Или так:
Save button doesn't exist
Edit button doesn't exist
Exit button doesn't exist
...

Не буду же я делать checkForVerificationErrors() после каждого verify-метода )
  • 0

#4 mcreature

mcreature

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

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

Отправлено 07 июля 2010 - 07:41

Не буду же я делать checkForVerificationErrors() после каждого verify-метода )


У меня тоже во многих тестах проверяется как правило большое кол-во элементов.
Пишу так:

		log.info("Проверяем лейбл 'Сумма:'");
		NoncriticalAssert(selenium.getText("xpath=//tr[7]/td[@class='label' and position()=1]/span[@class='lblrequired']/label").equals("Сумма:"),
		"Отсутствует лейбл 'Сумма:'. Получен текст: " + selenium.getText("xpath=//tr[7]/td[@class='label' and position()=1]/span[@class='lblrequired']/label"));

  • 0

#5 contestar

contestar

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

  • Members
  • Pip
  • 36 сообщений
  • ФИО:Алексей

Отправлено 07 июля 2010 - 08:23

		log.info("Проверяем лейбл 'Сумма:'");
		NoncriticalAssert(selenium.getText("xpath=//tr[7]/td[@class='label' and position()=1]/span[@class='lblrequired']/label").equals("Сумма:"),
		"Отсутствует лейбл 'Сумма:'. Получен текст: " + selenium.getText("xpath=//tr[7]/td[@class='label' and position()=1]/span[@class='lblrequired']/label"));


По-моему, такой подход утяжеляет код.
  • 0

#6 mcreature

mcreature

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

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

Отправлено 07 июля 2010 - 09:01

		log.info("Проверяем лейбл 'Сумма:'");
		NoncriticalAssert(selenium.getText("xpath=//tr[7]/td[@class='label' and position()=1]/span[@class='lblrequired']/label").equals("Сумма:"),
		"Отсутствует лейбл 'Сумма:'. Получен текст: " + selenium.getText("xpath=//tr[7]/td[@class='label' and position()=1]/span[@class='lblrequired']/label"));


По-моему, такой подход утяжеляет код.

Ну смотря что проверять. Если стоит задача проверить кучу текстовой информации, то по другому просто не получится.
  • 0

#7 Boltick

Boltick

    Специалист

  • Members
  • PipPipPipPipPip
  • 596 сообщений
  • ФИО:Алексей
  • Город:планета Земля

Отправлено 07 июля 2010 - 09:51

Мда...

ну тогда сделайте свой метод verifyElement(), и в нем проверяйте свои контролы, хоть бы и в стиле, который сами описали:


public boolean verifyElement(String element) {
  try {
		   verifyTrue(selenium.isElementPresent(element));
		   checkForVerificationErrors();
		} catch (Throwable ex) {
			 log.error(element + "is not present");
			 ex.printStackTrace();
			 return false;  
		}
		return true;
}

  • 0
Алексей Булат
Про Тестинг

#8 qad

qad

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

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

Отправлено 14 сентября 2010 - 10:50

Привет,
2 contestar:
"Я хочу получить в логе только это:

INFO : Test is running…
ERROR:at tests.tests.CreateTaskScreen.UI.Buttons.testExample(Example.java:34)

Это возможно?"

Получилось ли сделать это? Как добились? Спасибо заранее
  • 0

#9 contestar

contestar

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

  • Members
  • Pip
  • 36 сообщений
  • ФИО:Алексей

Отправлено 14 сентября 2010 - 11:22

Получилось ли сделать это? Как добились? Спасибо заранее

Последовал примеру Boltick. Вывожу в лог теперь то, что нужно. Спасибо.
  • 0

#10 qad

qad

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

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

Отправлено 14 сентября 2010 - 14:47

Окей, опишу подробнее.

Я тоже попытался последовать примеру Boltick:

static public void assertTrue(boolean condition) {
	try {
	     assertTrue(null, condition);
	     } catch (Throwable ex){
		      LOG.error(" Test case failed \n");
		      LOG.error("Details:", ex);
                      throw new Error();
	       }
	}

При возникновении ошибки в логе видим следующее:
17:44:57,967 ERROR main SeleniumTest:ErrorLog:87 - Details:
junit.framework.AssertionFailedError
	at junit.framework.Assert.fail(Assert.java:47)
	at junit.framework.Assert.assertTrue(Assert.java:20)
	at com.exigen.hldsa.core.SeleniumTest.assertTrue(SeleniumTest.java:96)
	at com.exigen.hldsa.conformance.Homeowners_Conformance_Test.test1_RA_InitialPage(Homeowners_Conformance_Test.java:207)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at junit.framework.TestCase.runTest(TestCase.java:164)
	at junit.framework.TestCase.runBare(TestCase.java:130)
	at junit.framework.TestResult$1.protect(TestResult.java:106)
	at junit.framework.TestResult.runProtected(TestResult.java:124)
	at junit.framework.TestResult.run(TestResult.java:109)
	at junit.framework.TestCase.run(TestCase.java:120)
	at org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestReference.run(JUnit3TestReference.java:130)
	at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)

Хотелось бы

17:44:57,967 ERROR main SeleniumTest:ErrorLog:87 - Details:
junit.framework.AssertionFailedError
	at com.exigen.hldsa.conformance.Homeowners_Conformance_Test.test1_RA_InitialPage(Homeowners_Conformance_Test.java:207)

  • 0

#11 KaNoN

KaNoN

    АЦЦКИЙ СОТОНА

  • Members
  • PipPipPipPipPipPip
  • 1 260 сообщений
  • ФИО:Колесник Николай
  • Город:Днепропетровск > Киев > Лондон

Отправлено 17 сентября 2010 - 14:26

Тогда вам нужно колупать класс Exception. Напрмиер, вместо того, чтобы в вывод закидывать класс инсключения целиком, можно постить только нужные части.
Например, само сообщение получается вызовом метода getMessage класса Exception. Также есть метод getStackTrace, который вернет массив объектов, содержащих элемент стека вызова. Пройдясь по нему можно остановитсья на классе теста, в котором была ошибка. Но это неэффективно в ряде случаев, когда исключение возникло не в самом тесте, а в вызываемом им методе.
  • 0

#12 qad

qad

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

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

Отправлено 17 сентября 2010 - 15:28

Спасибо за мысль, попробую покопаться!
  • 0


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

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