2016-02-11 4 views
3

Возможно ли запустить параметризованный тестовый класс с помощью JUnitCore API?Выполнение параметризованных тестов с помощью JUnitCore

У меня есть класс под названием тест Фибоначчи, параметризированный тестовый класс называется TestFibonacci и простой класс Java (JUnitParameterized), который выполняет TestFibonacci класс, используя JUnitCore API. Если я выполню TestFibonacci с плагином или командной строкой JUnit, он пройдет. Однако, когда я выполняю его с моим классом JUnitParameterized, он терпит неудачу.

Класс испытываемых

public class Fibonacci { 

    public static int compute(int n) { 
    if (n <= 1) { 
     return n; 
    } 
    return compute(n-1) + compute(n-2); 
    } 
} 

испытаний Класс

import static org.junit.Assert.assertEquals; 

import org.junit.Test; 
import org.junit.runner.RunWith; 
import org.junit.runners.Parameterized; 
import org.junit.runners.Parameterized.Parameters; 

import java.util.Arrays; 

@RunWith(Parameterized.class) 
public class TestFibonacci { 

    @Parameters(name = "{index}: fib({0})={1}") 
    public static Iterable<Object[]> data() { 
    return Arrays.asList(
     new Object[][] { { 0, 0 }, { 1, 1 }, { 2, 1 }, { 3, 2 }, { 4, 3 }, { 5, 5 }, { 6, 8 } }); 
    } 

    private int input; 
    private int expected; 

    public TestFibonacci(int input, int expected) { 
    this.input = input; 
    this.expected = expected; 
    } 

    @Test 
    public void test() { 
    assertEquals(expected, Fibonacci.compute(input)); 
    } 
} 

программа Java

import org.junit.runner.JUnitCore; 
import org.junit.runner.Request; 
import org.junit.runner.Result; 

public class JUnitParameterized { 

    public static void main(String[] args) throws ClassNotFoundException { 

    Class<?> testClass = JUnitParameterized.class.getClassLoader().loadClass(TestFibonacci.class.getCanonicalName()); 

    Result result = (new JUnitCore()).run(Request.method(testClass, "test")); 
    System.out.println("Number of tests run: " + result.getRunCount()); 
    System.out.println("The number of tests that failed during the run: " + result.getFailureCount()); 
    System.out.println("The number of milliseconds it took to run the entire suite to run: " + result.getRunTime()); 
    System.out.println("" + (result.wasSuccessful() == true ? "Passed :)" : "Failed :(")); 
    } 
} 

ответ

2

Когда тестовый класс JUnit помечается @Parameterized, тест имя метода, как описание обогащенный числом в фигурных скобках, двоеточием и замещенным name, которые вы предоставляете в аннотации @Parameters.

В вашем случае, чтобы выполнить единственный тест, который с одним набора параметров, вы

Result result = (new JUnitCore()).run(Request.method(TestFibonacci.class, "test[6: fib(6)=8]")); 

В этом случае шестой набор параметров при условии (начиная с нуля).
Обратите внимание, что вы должны точно соответствовать номерам, которые вы указываете в имени метода, тем, что вы указали как параметры. Также имеет значение порядковый номер. Таким образом следующий не будет работать:

"test[3: fib(6)=8]" (wrong sequence .. <6, 8> pair is 6th, not 3rd) 
"test[6: fib(50)=100]" (the pair <50, 100> is not declared in parameters) 

Чтобы избежать ненужного синтаксического анализа значения @Parameters(name=?), я хотел бы предложить, чтобы просто объявить параметры без name:

@Parameters // no name=? 
public static Iterable<Object[]> data() { 
    return Arrays.asList(
     new Object[][] { { 0, 0 }, { 1, 1 }, { 2, 1 }, { 3, 2 }, { 4, 3 }, { 5, 5 }, { 6, 8 } }); 
} 

А то описание метод испытания просто test[6]:

Result result = (new JUnitCore()).run(Request.method(TestFibonacci.class, "test[6]")); 

чтобы запустить один метод испытания со всеми параметрами, я хотел бы предложить, чтобы сделать это в цикле (d возможно суммировать результаты):

int parametersCount = Request.aClass(TestFibonacci.class).getRunner().getDescription().getChildren().size(); 
for (int i = 0; i < parametersCount; ++i) { 
    Result result = (new JUnitCore()).run(Request.method(testClass, "testFloat[" + i + "]")); 
    System.out.println("Result " + result.wasSuccessful()); 
} 
+0

большое спасибо Степан. :) – josecampos

Смежные вопросы