Передача данных 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));
}