Как сгруппировать тесты JUnit вместе - PullRequest
0 голосов
/ 22 февраля 2012

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

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

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

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

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

Ответы [ 2 ]

0 голосов
/ 22 февраля 2012

Следующим шаблоном является Параметризованный , потому что он, кажется, делает то, что вы хотите.Для данного класса тестирования он запускает методы тестирования несколько раз, он создает 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;
  }
}

Это производит вывод как(в Затмении):

enter image description here

0 голосов
/ 22 февраля 2012

Вы можете использовать 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 {

}
...