Передача данных JUnit между тестами

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

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

Ответ 1

Ну, для модульных тестов ваша цель должна состоять в том, чтобы проверить наименьшую изолированную часть кода, обычно метод методом. Итак, 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");
    }
}

Ответ 2

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

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

Ответ 3

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

 @ 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 ) ;
 }

Ответ 4

в этом базовом примере переменная изменяется в тесте 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

запустить B

sharedVar: blah

Ответ 5

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

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

@Test
public void method2() {
    Assert.assertThat(something, is(storage));
}