2010-06-14 3 views
4

В настоящее время я создаю TestCase для одного рабочего потока, а рабочий процесс имеет разные этапы. Результаты одного шага важны, поскольку второй шаг должен знать значение выполнения step1.Передача информации между методами тестирования в тестовом наборе junit

class TestCaseWorkFlow1 extends TestCase { 

    private static String resultOfStep1 = null; 

    public void testStep1(){ 

    if(failed){ 
     resultOfStep1 = "failed"; 
    } 
    } 

    public void testStep2(){ 

    if(resultOfStep1 != null) { 
     //First test failed. 
    }else { 
    } 

    } 

}

В настоящее время мы используем статическую переменную для передачи информации между testmethods.

Какое оптимальное решение для этого сценария?

Пожалуйста, помогите.

Благодаря J

+0

Я объясню это больше. Предположим, у меня есть сервер, на котором размещается служба, поэтому шаги для рабочего процесса: 1. Подключение к серверу 2. Поднять запрос На шаге 2 мне нужно проверить, подключен ли сервер. Поэтому для этого все, что мне нужно, это объект соединения с первого шага. Я не хочу снова подключаться, так как идентификатор сеанса будет другим. – Jijoy

ответ

1

Распространено мнение, что лучшим решением будет иметь все шаги пересчитаны с нуля для каждого теста, как правило, в частном вспомогательный метод, так что вы не зависят от порядка в который JUnit выполняет ваши тесты (которые на самом деле не определены в текстовом порядке). Вероятно, вы должны это сделать, если только некоторые из этих шагов не поистине ужасают времени, чтобы перепроверить.

2

Ваши тесты должны быть действительно независимыми друг от друга, поэтому подумайте, есть ли способ сделать это. Например, вы знаете, каков результат успешного шага 1, поэтому просто укажите, что в качестве входных данных на шаге 2 используется макет или другой подход. Или посмотрите, есть ли способ разбить последовательное соединение шагов, чтобы каждый из них мог запускаться независимо.

0

Я согласен с Килианом и Грэмом. Тесты должны быть независимыми и самодостаточными. То есть каждый тест должен работать сам по себе, так же как и с другими тестами.

Но если у вас есть веская причина для такой зависимости между тестами, возможно, попробуйте TestNG. В TestNG вы можете указать тесты, зависящие друг от друга.

1

Кажется, что вы пытаетесь достичь чего-то помимо модульного тестирования ... это прекрасно. Попробуйте использовать другие инструменты, которые построены поверх jUnit и предоставляют вам механизмы для тестирования поведения, а не небольшие единицы кода. Одним из инструментов, которые я успешно использовал в течение некоторого времени, является jBehave. Вы в конечном итоге описываете сценарии тестирования, используя сценарии обычного текста, выполняемые методами, которые соответствуют сценариям сценария.

0

Как уже отмечалось, вы должны сделать ваши тесты независимыми друг от друга. Один из способов добиться этого - правильно настроить тестовые приборы для каждого теста.

Однако тесты в вашем примере выглядят так, как будто они тестируют разные фазы одного и того же сценария. Поэтому я хотел бы объединить все в один тестовый метод, если этот сценарий не слишком сложный.

3

Это не похоже на единичный тест для меня. Это хорошо, но JUnit не может быть лучшим инструментом. Можете ли вы перейти на JUnit 4? Предполагая, что да -

  1. Написать JUnit бегуна, чтобы обеспечить порядок вашего устройства тестирует
  2. Pass состояния с помощью статических переменных.
  3. Используйте Assume, чтобы подтвердить, что этот шаг работал.
0

в этом простом примере, переменная изменяется в тест-A, и может быть использовано в тесте В

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

} 

Выходной результат:

запустить

перспективе B

sharedVar is: blah