Возможно ли сделать параметризированный TestSuite на JUnit


(Galina.Bratchik) #1

Доброго дня!

Может быть кто-то сталкивался с задачей создания параметризированных Suit'ов?

Я в своей работе использую вот такой код

{syntaxhighlighter brush:java;} @RunWith(Parameterized.class)
public class MyTest {

public MyTest(Param curParam){ .... }

@Parameters
public static Collection<Object[]> getParams() { .... }

@Test
public void Test1() {...}

@Test
public void Test2() {....}

}{/syntaxhighlighter}

 
 
По сути это уже suite, так содержит в себе набор тестов, junit его и выполняет как suite. Но проблема в том, что в такой структуре неудобно разрабатывать и отлаживать отдельные тесты. То есть при запуске файла на исполнение прогоняются  все тесты, а чтобы запустить какой-то один из них, остальные приходится комментировать.
 
Я хочу вынести все тесты в отдельные классы и каком-то образом запускать их из данного параметризированного класса.
При этом я не могу создать suite стандартным образом (аннотация @RunWith(Suite.class)) в в этом же классе, так как эта аннотация уже занята параметризацией.
 
Таким образом мне важно получить решение при котором я могла бы
1. запускать люблюй из тестов отдельно во время разработки данного теста
2. запускать все тесты из параметризированная класса как suite
 
Заранее спасибо!

(mamax) #2

проблема не в аннотациях а в правильном построении инфраструктуры тестового фреймворка
аннотацию @RunWith(Suite.class) можна вынести в отдельный класс
при этом все тести тоже по отдельным классам разбросать

например
MySuiteRunner.java

@RunWith(Suite.class)
@SuiteClasses
({
классгдетести.class,
Parameterized_Test.class,
койтокласгде тести.class
})
public class MySuiteRunner {

}

и параметризованый класс тоже отдельно

@RunWith(Parameterized.class)
public class Parameterized_Test {

// step 2
    // global vars
    String bankName;
    int actNum;
    
    // step 3
    // constructor
    public Parameterized_Test(String bankName , int actNum){
        this.bankName=bankName;
        this.actNum=actNum;
    }
    
    // step 4
    @Parameters
    public static Collection<Object[]> getData(){
        
        Object data[][] = new Object[2][2];
        // first row
        data[0][0]="HSBC";
        data[0][1]=1234;
        
        // 2nd row
        data[1][0]="City";
        data[1][1]=123455;
        
        return Arrays.asList(data);
    }
   

}
 


(Galina.Bratchik) #3

Но при этом ведь сами тесты не будут параметризированными. Разве нет?

 

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

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