Запуск двух одинаковых тестов с разными аргументами - PullRequest
6 голосов
/ 29 марта 2012

У меня есть тест с 15-20 различными тестовыми случаями, я хочу выполнить один и тот же тест дважды с двумя различными параметрами, которые должны быть переданы методу BeforeClass теста, например:

public class TestOne {
    private static ClassToTest classToTest;

    @BeforeClass
    public static void setUp() throws Exception {
        classToTest = new ClassToTest("Argument1", "Argument2");
    }

    @Test
    public void testOne() {
    ........roughly 15 - 20 tests here
}

public class TestTwo {
    private static ClassToTest classToTest;

    @BeforeClass
    public static void setUp() throws Exception {
        classToTest = new ClassToTest("Argument3", "Argument4");
    }

    @Test
    public void testOne() {
    ........roughly 15 - 20 tests here, same as in TestOne
}

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

Ответы [ 5 ]

6 голосов
/ 29 марта 2012

Это похоже на идеальный вариант использования для JUnit4 @Parameters; см. https://blogs.oracle.com/jacobc/entry/parameterized_unit_tests_with_junit или http://www.mkyong.com/unittest/junit-4-tutorial-6-parameterized-test/. Тем не менее, вам придется переместить инициализацию из метода setUp в конструктор для тестового класса.

1 голос
/ 30 марта 2012

Спасибо всем за ваши быстрые ответы.Вот как я это сделал наконец

public abstract class Base {
    final HeavyObject heavy;

    protected Base(HeavyObject heavy) {
        this.param = param;
    }

    @Test
    public void test() {
        param.doSomething();
    }

    @Test
    .............More tests here

}


public class FirstTest extends Base{

    private static HeavyObject param;

    @BeforeClass
    public static void init() {
        param = new HeavyObject("arg1", "arg2");
    }

    public FirstTest() {
        super(param);
    }
}

public class SecondTest extends Base{

    private static HeavyObject param;

    @BeforeClass
    public static void init() {
        param = new HeavyObject("arg3", "arg4");
    }

    public FirstTest() {
        super(param);
    }
}

Base - это абстрактный класс, в котором есть все тесты, а FirstTest и SecondTest создают свои собственные объекты с различными параметрами и передают его абстрактному классу для использования.*

1 голос
/ 30 марта 2012

Для чего это стоит, вот как вы бы это сделали с TestNG :

public class TestFactory {
  @Factory
  public Object[] createTests() {
    return new Object[] {
      new ClassToTest("arg1", "arg2"),
      new ClassToTest("arg3", "arg4")
    };
  }
}

public class ClassToTest {
  public ClassToTest(String arg1, String arg2) {
    this.arg1 = arg1;
    this.arg2 = arg2;
  }

  @Test
  public void testOne() {
    // use arg1 and arg2
  }
}
0 голосов
/ 29 марта 2012

Как насчет этого:

public class TestOne {
    private static ClassToTest classToTest1, classToTest2;

    @BeforeClass
    public static void setUp() throws Exception {
        classToTest1 = new ClassToTest("Argument1", "Argument2");
        classToTest2 = new ClassToTest("Argument3", "Argument4");
    }

    @Test
    public void testOne() {
        testOneImpl(classToTest1);
        testOneImpl(classToTest2);
    }

    public void testOneImpl(ClassToTest classToTest) {
        // exact samew as whatever your current testOne() test method is
    }

    ....
}

EDIT: Или сохранить метод обратного отсчета:

public class TestOne {
    private static List<ClassToTest> classesToTest;

    @BeforeClass
    public static void setUp() throws Exception {
        classesToTest = new ArrayList<>;
        classesToTest.add( new ClassToTest("Argument1", "Argument2"));
        classesToTest.add( new ClassToTest("Argument3", "Argument4"));
    }

    @Test
    public void testOne() {
        for (ClassToTest classToTest: classesToTest) {
            ... same test content as before
        }
    }
0 голосов
/ 29 марта 2012

Согласно документации (http://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html):

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...