Передача данных JUnit между тестами - PullRequest
22 голосов
/ 30 июня 2010

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

Все, что я пытаюсь сделать, это (C) создать объект с помощью одного теста, и (R) прочитать его с помощью следующего. У JUnit есть способ сделать это, или это идеологически закодировано так, чтобы тесты не могли зависеть друг от друга?

Ответы [ 5 ]

20 голосов
/ 30 июня 2010

Что ж, для модульных тестов ваша цель должна состоять в том, чтобы протестировать наименьший изолированный фрагмент кода, обычно метод за методом. Итак, testCreate() - это тестовый пример, а testRead() - это другой. Однако ничто не мешает вам создать testCreateAndRead() для проверки двух функций вместе. Но тогда, если тест не пройден, в каком блоке кода тест не пройден? Вы не знаете Подобные тесты больше похожи на интеграционные тесты, которые должны рассматриваться по-разному.

Если вы действительно хотите это сделать, вы можете создать статическую переменную класса для хранения объекта, созданного testCreate(), а затем использовать его в testRead().

Поскольку я понятия не имею, о какой версии Junit вы говорите, я просто беру древнюю версию Junit 3.8:

Совершенно некрасиво, но работает:

public class Test extends TestCase{

    static String stuff;

    public void testCreate(){
        stuff = "abc";
    }

    public void testRead(){
        assertEquals(stuff, "abc");
    }
}
12 голосов
/ 30 июня 2010

JUnit продвигает независимые тесты.Один из вариантов - поместить два логических теста в один метод @Test.

TestNG был частично создан для того, чтобы разрешать такого рода зависимости между тестами.Он применяет локальные объявления тестовых зависимостей - он запускает тесты в правильном порядке и не запускает тесты, которые зависят от неудачного теста.См. http://testng.org/doc/documentation-main.html#dependent-methods для примеров.

3 голосов
/ 15 февраля 2017

JUnit является независимым тестом. Но, если у вас нет способов, вы можете использовать «статический» экземпляр для его хранения.

static String storage;
@Test
public void method1() {
    storage = "Hello"
}

@Test
public void method2() {
    Assert.assertThat(something, is(storage));
}
3 голосов
/ 30 июня 2010

Сколько времени занимают эти тесты?Если не много, то зачем потеть.Конечно, вы создадите какой-то объект без необходимости, но сколько это будет стоить?

@Test
void testCreateObject() {
    Object obj = unit.createObject();
}

@Test
void testReadObject() {
    Object obj = null;
    try {
        obj = unit.createObject(); // this duplicates tests aleady done
    } catch (Exception cause) {
        assumeNoException(cause);
    }
    unit.readObject(obj);
}
2 голосов
/ 08 декабря 2012

в этом базовом примере переменная изменяется в тесте A и может использоваться в тесте B

public class BasicTest extends ActivityInstrumentationTestCase2 {
    public BasicTest() throws ClassNotFoundException {
        super(TARGET_PACKAGE_ID, launcherActivityClass);        
    }

    public static class MyClass {    
        public static String myvar = null;              
        public void set(String s) {
            myvar = s;
        }               
        public String get() {
            return myvar;
        }
    }

    private MyClass sharedVar;

    @Override
    protected void setUp() throws Exception {
        sharedVar = new MyClass();
    }

    public void test_A() {
        Log.d(S,"run A");
        sharedVar.set("blah");
    }

    public void test_B() {
        Log.d(S,"run B");       
        Log.i(S,"sharedVar is: " + sharedVar.get());        
    }

}

Результат вывода:

Выполнить A

run B

sharedVar is: blah

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