賽程

來自維基百科

測試夾具用於一致地測試某些專案,裝置或軟體。

它還可以通過從測試方法本身中提取常見的初始化/完成程式碼來增強測試的可讀性。

在常規初始化可以執行一次而不是在每次測試之前,這也可以減少執行測試所花費的時間。

以下示例旨在顯示 JUnit 提供的主要選項。假設類 Foo 初始化很昂貴:

public class Foo {
    public Foo() {
        // expensive initialization
    }

    public void cleanUp() {
        // cleans up resources
    }
}

另一類 Bar 引用了 Foo

public class Bar {
    private Foo foo;
    
    public Bar(Foo foo) {
        this.foo = foo;
    }

    public void cleanUp() {
        // cleans up resources
    }
}

下面的測試需要一個包含單個 Bar 的 List 的初始上下文。

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;

import java.util.Arrays;
import java.util.List;

import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;

public class FixturesTest {
    
    private static Foo referenceFoo;
    
    private List<Bar> testContext;
    
    @BeforeClass
    public static void setupOnce() {
        // Called once before any tests have run
        referenceFoo = new Foo();
    }

    @Before
    public void setup() {
        // Called before each test is run
        testContext = Arrays.asList(new Bar(referenceFoo));
    }
    
    @Test
    public void testSingle() {
        assertEquals("Wrong test context size", 1, testContext.size());
        Bar baz = testContext.get(0);
        assertEquals(referenceFoo, baz.getFoo());
    }
    
    @Test
    public void testMultiple() {
        testContext.add(new Bar(referenceFoo));
        assertEquals("Wrong test context size", 2, testContext.size());
        for (Bar baz : testContext) {
            assertEquals(referenceFoo, baz.getFoo());
        }
    }
    
    @After
    public void tearDown() {
        // Called after each test is run
        for (Bar baz : testContext) {
            baz.cleanUp();
        }
    }
    
    @AfterClass
    public void tearDownOnce() {
        // Called once after all tests have run
        referenceFoo.cleanUp();
    }
}

在示例中,@BeforeClass 註釋方法 setupOnce() 用於建立 Foo 物件,初始化起來很昂貴。重要的是它不能被任何測試修改,否則測試執行的結果可能取決於各個測試的執行順序。這個想法是每個測試都是獨立的,並測試一個小功能。

@Before 註釋方法 setup() 設定測試上下文。在測試執行期間可以修改上下文,這就是為什麼必須在每次測試之前初始化它。通過在每個測試方法的開頭包含此方法中包含的程式碼,可以實現等效的效果。

@After 註釋方法 tearDown() 清理測試環境中的資源。它在每次測試呼叫後呼叫,因此通常用於釋放在 @Before 註釋方法中分配的資源。

所有測試執行後,@AfterClass 註釋方法 tearDownOnce() 清理資源。這些方法通常用於釋放在初始化期間或在註釋方法中分配的資源。也就是說,最好避免在單元測試中使用外部資源,這樣測試就不依賴於測試類之外的任何東西。