簡體   English   中英

每個參數調用的Junit參數化測試

[英]Junit Parametrized Test per param call

在junit中,每個測試應獨立運行。 對於更復雜的過程,您通常運行設置方法。 但是我需要類似設置方法的東西,它在每個參數之前都先行運行。

可以說我有一個這樣的測試用例:

setup()
contructor()
test1()
test2()
test3()
teardown()

從執行中,我通過junit參數化測試將最終得到以下2個參數:

setUpBeforeClass
contrcutor called
test1 running
contrcutor called
test2 running
contrcutor called
test3 running
contrcutor called
test1 running
contrcutor called
test2 running
contrcutor called
test3 running
tearDownAfterClass

我需要的是在每個參數之前都調用的東西。 因此結果將是這樣的(更改方法為“()”):

setUpBeforeClass
contrcutor called
setupParam()
test1 running
contrcutor called
test2 running
contrcutor called
test3 running
contrcutor called
tearDownParam()
setupParam()
test1 running
contrcutor called
test2 running
contrcutor called
test3 running
tearDownParam()
tearDownAfterClass

我知道junit測試應該是原子的,但是每個參數的設置過程非常昂貴。 有沒有辦法實現這種執行順序?

提前致謝!

更新:

@在第一個答案之前,@@只會在每次測試之前導致呼叫。 例:

setUpBeforeClass
contrcutor called
before
test1 running
contrcutor called
before
test2 running
contrcutor called
before
test3 running
contrcutor called
before
test1 running
contrcutor called
before
test2 running
contrcutor called
before
test3 running
tearDownAfterClass

使用@Before批注

@Before
public void before() {
    System.out.println("Before every test ");
}

如果要使用每個參數對象進行多次運行,則意味着必須將對它們的引用保持在靜態字段中,因為每種測試方法都在不同的對象上運行。

您還可以將靜態參數之一的先前值保存在靜態字段中,並假設其在參數集中的唯一值,則可以將其用作參數變化的檢測器。

這幾乎是您想要的,並且有一個小故障,即在首次測試新參數的構造函數之后運行tearDownParams()

@RunWith(Parameterized.class)
public class SomeTest {

    @Parameters
    public static Collection<Object[]> data() {
        return Arrays.asList(new Object[][] {
            { 1, 4, 3 },
            { 2, 5, 6 },
            { 3, 8, 12 }
        });
    }

    static int lastP1Value = -1;

    private int p1;

    public SomeTest(int p1, int p2, int p3) {
        System.out.println("constructor");
        this.p1 = p1;
    }

    @Test
    public void test1() {
        System.out.println("    test1");
    }

    @Test
    public void test2() {
        System.out.println("    test2");
    }

    @Before
    public void setUp() {
        if (lastP1Value != p1) {
            if (lastP1Value != -1) {
                // this is a bit too late (after constructor for new params...)
                tearDownParams();
            }
            setUpParams();
        }
        lastP1Value = p1;
    }

    public static void setUpParams() {
            System.out.println("  setUpParams");

    }

    @AfterClass
    public static void tearDownParams() {
            System.out.println("  tearDownParams");
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM