Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Java

JUnit 5 คำอธิบายประกอบพร้อมตัวอย่าง

มิถุนายน 5 เป็นรุ่นต่อไปของ JUnit เป้าหมายคือการสร้างรากฐานที่ทันสมัยสำหรับการทดสอบฝั่งนักพัฒนาบน JVM ซึ่งรวมถึงการเน้นที่ Java 8 ขึ้นไป รวมถึงการเปิดใช้การทดสอบรูปแบบต่างๆ มากมาย

คุณสามารถใช้ทั้ง Maven และ Gradle

หากคุณกำลังใช้ Maven คุณต้องเพิ่มการพึ่งพาต่อไปนี้ใน pom.xml ของคุณ ไฟล์:

<dependencies>
    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter-api</artifactId>
        <version>5.3.1</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter-params</artifactId>
        <version>5.3.1</version>
        <scope>test</scope>
    </dependency>
</dependencies>

@JUnit 5 คำอธิบายประกอบ

คุณจะสังเกตเห็นว่าใน Junit 5 การเปลี่ยนแปลงที่ชัดเจนที่สุดอย่างหนึ่งคือไม่ต้องเปิดเผยคลาสและวิธีการทดสอบอีกต่อไป

ตอนนี้ มาดูรายการคำอธิบายประกอบ JUnit 5 ที่พบบ่อยที่สุดกัน

@Test

คำอธิบายประกอบนี้แสดงว่าเมธอดเป็นวิธีทดสอบ โปรดทราบว่าคำอธิบายประกอบนี้ไม่ใช้แอตทริบิวต์ใดๆ

import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;

class JUnit5Test {
        
    @Test
    void helloJUnit5() {
        assertEquals(10, 5+5);
    }
}

@ParameterizedTest

การทดสอบที่มีพารามิเตอร์ทำให้สามารถเรียกใช้การทดสอบได้หลายครั้งด้วยอาร์กิวเมนต์ที่แตกต่างกัน มีการประกาศเหมือนกับ @Test . ปกติ เมธอด แต่ใช้ @ParameterizedTest คำอธิบายประกอบแทน

นอกจากนี้ คุณต้องประกาศแหล่งที่มาอย่างน้อยหนึ่งแหล่งที่จะจัดเตรียมอาร์กิวเมนต์สำหรับการเรียกใช้แต่ละครั้ง จากนั้นใช้อาร์กิวเมนต์ในวิธีการทดสอบ

ตัวอย่างเช่น ตัวอย่างต่อไปนี้แสดงการทดสอบแบบกำหนดพารามิเตอร์ที่ใช้ @ValueSource คำอธิบายประกอบเพื่อระบุอาร์เรย์สตริงเป็นแหล่งของอาร์กิวเมนต์

ตัวอย่าง:

import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;

import static org.junit.jupiter.api.Assertions.assertTrue;

class JUnit5Test {

    @ParameterizedTest
    @ValueSource(strings = { "cali", "bali", "dani" })
    void endsWithI(String str) {
        assertTrue(str.endsWith("i"));
    }
}

@RepeatedTest

JUnit 5 มีความสามารถในการทดสอบซ้ำตามจำนวนที่กำหนดได้ง่ายๆ โดยการใส่คำอธิบายประกอบวิธีการด้วย @RepeatedTest และระบุจำนวนซ้ำที่ต้องการได้

การเรียกใช้การทดสอบซ้ำแต่ละครั้งมีลักษณะเหมือนการเรียกใช้ @Test . ปกติ วิธีการ

สิ่งนี้มีประโยชน์อย่างยิ่งในการทดสอบ UI ด้วยซีลีเนียม

import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.RepeatedTest;
import org.junit.jupiter.api.RepetitionInfo;
import org.junit.jupiter.api.TestInfo;

import static org.junit.jupiter.api.Assertions.assertEquals;

class JUnit5Test {
    
    @RepeatedTest(value = 5, name = "{displayName} {currentRepetition}/{totalRepetitions}")
    @DisplayName("RepeatingTest")
    void customDisplayName(RepetitionInfo repInfo, TestInfo testInfo) {
        int i = 3;
        System.out.println(testInfo.getDisplayName() + 
            "-->" + repInfo.getCurrentRepetition()
        );
        
        assertEquals(repInfo.getCurrentRepetition(), i);
    }
}

JUnit 5 คำอธิบายประกอบพร้อมตัวอย่าง

ดังที่คุณเห็นจากผลการทดสอบเมื่อ i==3 , การทดสอบผ่าน มิฉะนั้น จะล้มเหลว

@DisplayName

คลาสการทดสอบและวิธีการทดสอบสามารถประกาศชื่อที่แสดงที่กำหนดเองซึ่งจะแสดงโดยนักวิ่งทดสอบและรายงานการทดสอบ

ตัวอย่าง:

import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestInfo;

@DisplayName("DisplayName Demo")
class JUnit5Test {
    @Test
    @DisplayName("Custom test name")
    void testWithDisplayName() {
    }

    @Test
    @DisplayName("Print test name")
    void printDisplayName(TestInfo testInfo) {
        System.out.println(testInfo.getDisplayName());
    }
}

@BeforeEach

@BeforeEach หมายเหตุประกอบระบุว่าวิธีการที่มีคำอธิบายประกอบควรดำเนินการก่อนวิธีทดสอบแต่ละวิธี ซึ่งคล้ายกับ @Before ของ JUnit 4 .

ตัวอย่าง:

import org.junit.jupiter.api.*;

class JUnit5Test {
    @BeforeEach
    void init(TestInfo testInfo) {
        String callingTest = testInfo.getTestMethod().get().getName();
        System.out.println(callingTest);
    }

    @Test
    void firstTest() {
        System.out.println(1);
    }

    @Test
    void secondTest() {
        System.out.println(2);
    }
}

เอาท์พุต:

firstTest
1
secondTest
2

@AfterEach

คำอธิบายประกอบนี้ระบุว่าวิธีการที่มีคำอธิบายประกอบควรดำเนินการหลังจากแต่ละวิธีทดสอบ ซึ่งคล้ายกับ @After ของ JUnit 4 . ตัวอย่างเช่น หากการทดสอบจำเป็นต้องรีเซ็ตคุณสมบัติหลังจากการทดสอบแต่ละครั้ง เราสามารถใส่คำอธิบายประกอบเมธอดด้วย @AfterEach สำหรับงานนั้นๆ

import org.junit.jupiter.api.*;

class JUnit5Test {

    @Test
    void firstTest() {
        System.out.println(1);
    }
    @Test
    void secondTest() {
        System.out.println(2);
    }

    @AfterEach
    void after(TestInfo testInfo) {
        String callingTest = testInfo.getTestMethod().get().getName();
        System.out.println(callingTest);
    }
}

เอาท์พุต:

1
firstTest
2
secondTest

@BeforeAll

คำอธิบายประกอบนี้ดำเนินการวิธีการก่อนการทดสอบทั้งหมด นี่คล้ายกับ @BeforeClass ของ JUnit 4 . @BeforeAll โดยทั่วไปจะใช้คำอธิบายประกอบเพื่อเริ่มต้นสิ่งต่าง ๆ สำหรับการทดสอบ

ตัวอย่าง:

import org.junit.jupiter.api.*;

class JUnit5Test {

    @BeforeAll
    static void init() {
        System.out.println("Only run once before all tests");
    }

    @Test
    void firstTest() {
        System.out.println(1);
    }
    @Test
    void secondTest() {
        System.out.println(2);
    }
}

เอาท์พุต:

Only run once before all tests
1
2

@AfterAll

@AfterAll คำอธิบายประกอบใช้เพื่อดำเนินการวิธีการที่มีคำอธิบายประกอบ หลังจากดำเนินการทดสอบทั้งหมดแล้วเท่านั้น ซึ่งคล้ายกับ @AfterClass . ของ JUnit 4 เราใช้คำอธิบายประกอบนี้เพื่อทำลายหรือยุติกระบวนการทั้งหมดเมื่อสิ้นสุดการทดสอบทั้งหมด

ตัวอย่าง:

import org.junit.jupiter.api.*;

class JUnit5Test {

    @Test
    void firstTest() {
        System.out.println(1);
    }
    @Test
    void secondTest() {
        System.out.println(2);
    }

    @AfterAll
    static void after() {
        System.out.println("Only run once after all tests");
    }
}

เอาท์พุต:

1
2
Only run once after all tests

@Tag

เราสามารถใช้คำอธิบายประกอบนี้เพื่อประกาศแท็กสำหรับการกรองการทดสอบ ที่ระดับคลาสหรือเมธอด

@Tag คำอธิบายประกอบมีประโยชน์เมื่อเราต้องการสร้างชุดทดสอบด้วยการทดสอบที่เลือก

ตัวอย่าง:

import org.junit.jupiter.api.Tag;
import org.junit.jupiter.api.Test;

@Tag("smoke")
class JUnit5Test {

    @Test
    @Tag("login")
    void validLoginTest() {
    }

    @Test
    @Tag("search")
    void searchTest() {
    }
}

@Disabled

@Disabled คำอธิบายประกอบใช้เพื่อปิดหรือข้ามการทดสอบที่ระดับคลาสหรือเมธอด ซึ่งคล้ายกับ @Ignore . ของ JUnit 4 .

เมื่อประกาศในระดับชั้นเรียน @test . ทั้งหมด วิธีการจะถูกข้ามไป เมื่อเราใช้ @Disabled ที่ระดับวิธีการ จะปิดใช้งานเฉพาะวิธีการที่มีคำอธิบายประกอบเท่านั้น

ตัวอย่าง:

@Disabled ใช้เพื่อปิดการใช้งานคลาสทดสอบ:

import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;

@Disabled
class DisabledClassDemo {

    @Test
    void testWillBeSkipped() {
    }
}

ตัวอย่าง:

@Disabled คำอธิบายประกอบที่ใช้เพื่อปิดใช้งานวิธีการทดสอบ:

import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;

class DisabledTestsDemo {

    @Disabled
    @Test
    void testWillBeSkipped() {
    }

    @Test
    void testWillBeExecuted() {
    }
}