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

Фотография

Selemium + JUnit: Использование AssertionError в другом методе


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

#1 _wolf_

_wolf_

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

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


Отправлено 19 июля 2013 - 09:13

Добрый день, возникла задача следующего типа.

Дано:

public class TestClass {

 @Before
 .... something

 @Test
 public void testCase(){
   Код с ошибкой, который прекращает выполнение по AssertionError
 }
 
 @After
 public void finishTest(){
   Как в этом методе получить errorMessage полученную при выполнении testCase?
 }
}

Заранее спасибо.
  • 0

#2 Keiga

Keiga

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

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


Отправлено 19 июля 2013 - 09:19

Использовать Assert'ы с try-catch?
  • 0

#3 BabyRoot

BabyRoot

    Специалист

  • Members
  • PipPipPipPipPip
  • 833 сообщений


Отправлено 19 июля 2013 - 09:24

public class TestClass {



//обявляю глобальную переменную

private static String errorMessage = "";





 @Test

 public void testCase(){

{

   //Код с ошибкой, который прекращает выполнение по AssertionError

} catch (AssertionError e) {

   // записываю в переменную сообщение

   errorMessage = e.getMessage();

}



 @After

 public void finishTest(){

   //могу тут использовать errorMessage

 }



 }

  • 0

#4 _wolf_

_wolf_

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

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


Отправлено 19 июля 2013 - 09:28

Использовать Assert'ы с try-catch?

Я попробовал такой вариант. Но он немного кривой. Во первых надо будет во всех тестах уже написанных добавлять try-catch. Плюс к этому надо будет самому как-то прерывать тест после исключения.
Просто вроде как если запускать Junit из Main - Result result = JUnitCore.runClasses(testCase); То по окончанию можно вытащить все ошибки. Вот я и подумал, что есть какая-то возможность вытащить эти сообщения во время выполнения внутри класса.
  • 0

#5 _wolf_

_wolf_

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

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


Отправлено 19 июля 2013 - 09:32

public class TestClass {

//обявляю глобальную переменную
private static String errorMessage = "";


 @Test
 public void testCase(){
{
   //Код с ошибкой, который прекращает выполнение по AssertionError
} catch (AssertionError e) {
   // записываю в переменную сообщение
   errorMessage = e.getMessage();
}

 @After
 public void finishTest(){
   //могу тут использовать errorMessage
 }

 }


Да, такой вариант я уже испробовал. И он работает, но тут возникает вопрос в случае других исключений. А вот если бы можно было после завершения testCase по исключению получить текст ошибки в @After из какого нибудь потока ошибок или еще откуда-то. Было бы идеально. Но я пока не нашел как это сделать....
  • 0

#6 BabyRoot

BabyRoot

    Специалист

  • Members
  • PipPipPipPipPip
  • 833 сообщений


Отправлено 19 июля 2013 - 09:38

Да, такой вариант я уже испробовал. И он работает, но тут возникает вопрос в случае других исключений. А вот если бы можно было после завершения testCase по исключению получить текст ошибки в @After из какого нибудь потока ошибок или еще откуда-то. Было бы идеально. Но я пока не нашел как это сделать....


import org.testng.ITestResult;

@After
public void finishTest(ITestResult result){
    errorMessage = result.getThrowable().getMessage();
}

Но это так, может получится, или копать в этом направлении.
  • 0

#7 Rara

Rara

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

  • Members
  • PipPip
  • 83 сообщений
  • ФИО:Кондрашов Юрий Алексеевич
  • Город:Минск, Беларусь


Отправлено 19 июля 2013 - 11:29

package wargaming;

import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TestRule;
import org.junit.rules.TestWatcher;
import org.junit.runner.Description;

import static org.junit.Assert.fail;

public class JustForTest {
    @Rule
    public TestRule watchman = new TestWatcher() {
        @Override
        protected void failed(Throwable e, Description description) {
            System.out.println(description.getMethodName() + ": " + e.getLocalizedMessage());
        }
    };

    @Test
    public void test1() {
        fail("Сообщение об ошибке");
    }
}

Перегружаемый метод failed() запускается при ошибках в методах аннотированных @Test перед выполнением метода с аннотацией @AfterTest. При этом он получает Description теста и информацию об ошибке. Её можно обработать здесь же или сохранить для обработки в @AfterTest.

Чтобы не прописывать Rule в каждом тесте заново, можно создать базовый класс с Rule и унаследовать от него все тестовые классы.
  • 1
Я бы переписал жизнь, но Бог не дает мне исходники

#8 _wolf_

_wolf_

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

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


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


Да, такой вариант я уже испробовал. И он работает, но тут возникает вопрос в случае других исключений. А вот если бы можно было после завершения testCase по исключению получить текст ошибки в @After из какого нибудь потока ошибок или еще откуда-то. Было бы идеально. Но я пока не нашел как это сделать....


import org.testng.ITestResult;

@After
public void finishTest(ITestResult result){
    errorMessage = result.getThrowable().getMessage();
}

Но это так, может получится, или копать в этом направлении.


К сожалению это работает для TestNG, а не JUnit... Я вот и думал, что может в JUnit есть подобная переменная (свойство), которую можно получить в любом месте теста. Но пока ничего такого не нашел...
  • 0

#9 _wolf_

_wolf_

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

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


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

package wargaming;

import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TestRule;
import org.junit.rules.TestWatcher;
import org.junit.runner.Description;

import static org.junit.Assert.fail;

public class JustForTest {
    @Rule
    public TestRule watchman = new TestWatcher() {
        @Override
        protected void failed(Throwable e, Description description) {
            System.out.println(description.getMethodName() + ": " + e.getLocalizedMessage());
        }
    };

    @Test
    public void test1() {
        fail("Сообщение об ошибке");
    }
}

Перегружаемый метод failed() запускается при ошибках в методах аннотированных @Test перед выполнением метода с аннотацией @AfterTest. При этом он получает Description теста и информацию об ошибке. Её можно обработать здесь же или сохранить для обработки в @AfterTest.

Чтобы не прописывать Rule в каждом тесте заново, можно создать базовый класс с Rule и унаследовать от него все тестовые классы.


Спасибо! Попробую :)
  • 0


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

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