2016-02-11 150 views
3

是否可以使用JUnitCore API運行參數化測試類?使用JUnitCore運行參數化測試

我已經在測試一個類中調用斐波納契,稱爲TestFibonacci一個參數測試類,和一個簡單的Java類(JUnitParameterized),它執行使用JUnitCore API的TestFibonacci類。如果我使用JUnit插件或命令行執行TestFibonacci,它會通過。但是,當我使用我的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,該測試方法的名稱作爲描述是用大括號,冒號和取代的富含數字10你在@Parameters註釋中提供。

在你的情況下,執行單一的測試,利用設定一個參數,你會

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

在這種情況下,第6組參數提供(從零開始)。
請注意,您必須將您在方法名稱中提供的數字與聲明爲參數的數字完全匹配。序列號也很重要。因此以下是行不通的:

"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

相關問題