2012-02-21 4 views
0

Я пытаюсь создать JUnit Runner, которые будут группироваться общие тесты с использованием junit API:Как группа JUnit тесты вместе

package whatever; 

import org.junit.runner.Description; 
import org.junit.runner.Runner; 
import org.junit.runner.notification.Failure; 
import org.junit.runner.notification.RunNotifier; 

public class SomeTestRunner extends Runner { 

    public SomeTestRunner(Class<?> testClass) {} 

    @Override 
    public Description getDescription() { 
     return Description.EMPTY; 
    } 

    @Override 
    public void run(RunNotifier notifier) { 
     for (int i = 0; i < 3; i++) { 
      Description parent = Description.createSuiteDescription("Parent_" + i); 
      for (int j = 0; j < 3; j++) { 
       Description child = Description.createTestDescription(Exception.class, "Child_" + j); 
       parent.addChild(child); 
       Failure failure = new Failure(child, new Exception()); 
       notifier.fireTestFailure(failure); 
      } 
      Failure failure = new Failure(parent, new Exception()); 
      notifier.fireTestFailure(failure); 
     } 
    } 
} 

Проблема заключается в том, когда я запускаю тест с помощью этого бегунка, я могу см неудачи подряд, и родители, и дети, а не сгруппированы вместе:

Results : 

Tests in error: 
    Child_0(java.lang.Exception) 
    Child_1(java.lang.Exception) 
    Child_2(java.lang.Exception) 
    Parent_0 
    Child_0(java.lang.Exception) 
    Child_1(java.lang.Exception) 
    Child_2(java.lang.Exception) 
    Parent_1 
    Child_0(java.lang.Exception) 
    Child_1(java.lang.Exception) 
    Child_2(java.lang.Exception) 
    Parent_2 

Tests run: 12, Failures: 0, Errors: 12, Skipped: 0 

Кроме того, я ожидал увидеть их сгруппированы вместе, когда я запускаю этот тест в Затмении - но это еще не дело. Что мне не хватает? Возможно ли это?

+0

Его распечатка в том порядке, в котором вы запускаете тестовые сбои. Что вы ожидали по-другому? – Perception

+0

Ну, я ожидал увидеть их сгруппированными в люксах. Разве это не то, что делают createSuiteDescription() и addChild()? – uzilan

ответ

0

Вы можете использовать JUnit Test Suite, так же, как это:

import org.junit.runner.RunWith; 
import org.junit.runners.Suite; 
import org.junit.runners.Suite.SuiteClasses; 

@RunWith(Suite.class) 
@SuiteClasses({ SomeTest.class, AnotherTest.class, YetAnotherTest.class }) 
public class AllTests { 

} 
+0

См. Дополнительную информацию здесь - [JUnit Tutorial - Suite Test] (http://www.asjava.com/junit/junit-tutorial-suite-test/) –

+0

Конечно, но я хотел бы создать эти апартаменты изнутри бегун. Разве это невозможно? – uzilan

+0

Ну вот как вы используете сюиты, если у вас есть несколько тестов, которые вы хотите объединить вместе. Но это не мое дело. У меня есть только один тест, но несколько результатов, которые я хотел бы сгруппировать с помощью бегуна. – uzilan

0

шаблон, которому надо следовать Parameterized, потому что кажется, делать то, что вы хотите. Для данного тестового класса он запускает методы испытаний несколько раз, он создает Runner для каждого набора параметров, что и я думаю, что вы хотите:

public class GroupedTestRunner extends Suite { 
    private class TestClassRunnerForParameters extends BlockJUnit4ClassRunner { 
    private String name; 

    TestClassRunnerForParameters(Class<?> type, String name) throws InitializationError { 
     super(type); 
     this.name = name; 
    } 

    @Override 
    public Object createTest() throws Exception { 
     return getTestClass().getOnlyConstructor().newInstance(); 
    } 

    @Override 
    protected String getName() { 
     return String.format("[%s]", name); 
    } 

    @Override 
    protected String testName(final FrameworkMethod method) { 
     return String.format("%s[%s]", method.getName(), name); 
    } 
    } 

    private final ArrayList<Runner> runners = new ArrayList<Runner>(); 

    public GroupedTestRunner(Class<?> klass) throws Throwable { 
    super(klass, Collections.<Runner> emptyList()); 

    // do grouping things here 
    runners.add(new TestClassRunnerForParameters(getTestClass().getJavaClass(), "group1")); 
    runners.add(new TestClassRunnerForParameters(getTestClass().getJavaClass(), "group2")); 
    } 

    @Override 
    protected List<Runner> getChildren() { 
    return runners; 
    } 
} 

Это производит вывод, как (в Eclipse):

enter image description here

+0

Результат выглядит замечательно, но моя проблема в том, что у меня есть только один тест, который я бы не хотел повторять. Тест возвращает несколько результатов, которые я хотел бы объединить вместе, и создать отчет о множественном наборе junit, который показывает их. Как вы думаете, это можно сделать? – uzilan