2017-05-23 30 views
0

我不熟悉Java,但在C#(NUnit的),你可以通過添加[TestCase]屬性如下參數單元測試:如何用參數編寫單元測試?

[TestCase(12,3,4)] 
[TestCase(12,2,6)] 
[TestCase(12,4,3)] 
public void DivideTest(int n, int d, int q) 
{ 
    Assert.AreEqual(q, n/d); 
} 

在這種情況下,我們不必編寫單獨的單元測試每個測試用例。相反,我們寫了[TestCase]來改變這個值。

Java上是否有任何equivelant? 當前使用Junit 4.12

+1

查看參數化測試(https://www.tutorialspoint.com/junit/junit_parameterized_test.htm)。記下構造函數 - 您可以指定該方法可以採用多少個參數。在Java中不是很漂亮(也可能不是很好),但這是一種選擇,您可以對不同的測試數據重複使用相同的測試用例 – rj2700

+0

@ robjob27,我查看了您提供的鏈接。但它看起來不像尼姑。它有可能讓它看起來更加優雅。通過優雅我的意思是簡化像nunit。或者至少,我有沒有選擇爲它寫新屬性並將其轉換爲後面的JUnit風格? –

+1

@AkinerAlkan是的,我同意。這些看起來並不漂亮。作爲一個側面說明,C#中的一件非常酷的事情是理論。基本上像上面的測試用例,但它進一步提取。 – rj2700

回答

5

參數化是您所需要的。考慮下面的例子。需要注意的是TEST3顯然是紅如20/5 = 4

import static org.junit.Assert.assertEquals; 

import java.util.Arrays; 
import java.util.Collection; 

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

@RunWith(Parameterized.class) 
public class DividerTest { 

    private int dividend; 
    private int divisor; 
    private int expectedResult; 

    @Parameterized.Parameters 
    public static Collection<Object[]> data() { 
    Object[] test1 = { 10, 5, 2 }; 
    Object[] test2 = { 15, 5, 3 }; 
    Object[] test3 = { 20, 5, 5 }; 

    return Arrays.asList(test1, test2, test3); 
    } 

    public DividerTest(int dividend, int divisor, int expectedResult) { 
    this.dividend = dividend; 
    this.divisor = divisor; 
    this.expectedResult = expectedResult; 
    } 

    @Test 
    public void testDivider() { 
    assertEquals(expectedResult, dividend/divisor); 
    } 
} 

這裏是測試結果:

enter image description here

+0

這是一個很好的例子,我知道這是與nunit相同的邏輯,但不同的represantion。我想知道的是:我們可以編寫某種通用代碼並簡化集合創建,例如在nunit場景中。那麼在這種情況下,我們可以有完全相同的實現,如[TestCase(x,y,z)] –

+1

截至目前,我認爲Junit不支持[TestCase(x,y,z)]。所以答案還沒有:) – nxhoaf

+0

還沒有,但是在JUnit5中有更好的參數化支持。也許沒有那麼優雅,但它的接近。查看@CsvSource: http://junit.org/junit5/docs/current/user-guide/#writing-tests-parameterized-tests – Kotse

0

TestNG的是一個圖書館和框架,在使用數據測試參數極好的控制工廠和依賴注入。