4.1 @ปิดการใช้งาน

ตอนนี้ มาดูคำอธิบายประกอบที่มีประโยชน์และเป็นที่นิยมของเฟรมเวิร์ก JUnit กัน คำอธิบายประกอบแรกอนุญาตให้คุณปิดการทดสอบเฉพาะ เพื่อไม่ให้ JUnit เรียกใช้ จำเป็นต้องใช้ในกรณีที่คุณสังเกตเห็นว่าการทดสอบทำงานไม่ถูกต้อง หรือคุณเปลี่ยนรหัสและการทดสอบผิดพลาดโดยไม่ตั้งใจ

อย่างที่ฉันเขียนไปก่อนหน้านี้ 99% ของการทดสอบไม่ได้รับการสนับสนุนโดยใครเลย ดังนั้นการทดสอบทั้งหมดจึงถูกปิดใช้งานไม่ช้าก็เร็ว ดังนั้นคำอธิบายประกอบนี้จึงเป็นรายการแรกในรายการที่มีประโยชน์

พิจารณาตัวอย่างของเธอ:

public class AppTest {

    @Disabled("Test is temporarily disabled. True, true")
    @Test
    void testOnDev(){
        System.setProperty("ENV", "DEV");
        Assumptions.assumeFalse("DEV".equals(System.getProperty("ENV")));
    }

    @Test
    void testOnProd(){
     System.setProperty("ENV", "PROD");
        Assumptions.assumeFalse("DEV".equals(System.getProperty("ENV")));
    }
}

ในตัวอย่างข้างต้นtestOnDev()จะไม่มีการเรียกใช้ เมธอด อย่างไรก็ตาม@Disabledสามารถเขียนคำอธิบายประกอบได้ทันทีก่อนการประกาศคลาส จากนั้นเมธอดทั้งหมดจะถูกละเว้น

@Disabled("Temporarily turned off the test, we will fix it by May 2001")
public class AppTest {
    @Test
    void testOnDev(){
        System.setProperty("ENV", "DEV");
        Assumptions.assumeFalse("DEV".equals(System.getProperty("ENV")));
    }

    @Test
    void testOnProd(){
     System.setProperty("ENV", "PROD");
        Assumptions.assumeFalse("DEV".equals(System.getProperty("ENV")));
    }
}

4.2 @ซ้อน

JUnit อนุญาตให้คุณเรียกใช้เมธอดการทดสอบในคลาสที่ซ้อนกัน ฉันหมายถึงคลาสทดสอบที่ซ้อนกัน ไม่ใช่ความจริงที่ว่าคุณจะพบบ่อย แต่มีความเป็นไปได้ดังนั้นคุณต้องเข้าใจว่ามันคืออะไร

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

public class AppTest {
    @Nested
    public class DevStagingEnvironment {
    @Test
        void testOnDev(){
            System.setProperty("ENV", "DEV");
            Assumptions.assumeFalse("DEV".equals(System.getProperty("ENV")));
        }
   }

    @Nested
    public class ProductionEnvironment {
        @Test
        void testOnProd(){
           System.setProperty("ENV", "PROD");
           Assumptions.assumeFalse("DEV".equals(System.getProperty("ENV")));
        }
   }
}

สามารถดูรายละเอียดเพิ่มเติมได้ในเอกสาร อย่างเป็น ทางการ

4.3 @ขยายด้วย

คำอธิบายประกอบที่มีประโยชน์อีกอย่างหนึ่ง@ExtendWithคือ เป็นไปได้มากว่าคุณจะพบเธอบ่อยมาก ดังนั้นเรามาดูรายละเอียดเพิ่มเติมกันดีกว่า

JUnit เป็นเฟรมเวิร์กอันทรงพลังที่ให้คุณเขียนปลั๊กอิน (ส่วนขยาย) ต่างๆ เพื่อปรับแต่งงานของคุณได้อย่างยืดหยุ่น ส่วนขยายบางอย่างสามารถรวบรวมสถิติเกี่ยวกับการทดสอบ ส่วนขยายอื่นๆ สามารถจำลองระบบไฟล์ในหน่วยความจำได้ ส่วนขยายอื่นๆ สามารถจำลองการทำงานภายในเว็บเซิร์ฟเวอร์ และอื่นๆ

หากโค้ดของคุณทำงานภายในเฟรม เวิร์ก (เช่น Spring) เฟรมเวิร์กนี้จะจัดการการสร้างและการกำหนดค่าออบเจกต์ในโค้ดของคุณเกือบทุกครั้ง ดังนั้นปลั๊กอินทดสอบพิเศษจึงขาดไม่ได้ ตัวอย่าง:

ตัวอย่างที่ 1 ส่วนขยายWebServerExtensionส่งผ่านไปยังวิธีการทดสอบที่เรียกURLเพื่อให้ทำงานได้อย่างถูกต้อง

@Test
@ExtendWith(WebServerExtension.class)
void getProductList(@WebServerUrl String serverUrl) {
    WebClient webClient = new WebClient();
    // Use WebClient to connect to web server using serverUrl and verify response
    assertEquals(200, webClient.get(serverUrl + "/products").getResponseStatus());
}

นี่คือวิธีที่การทดสอบมักจะเริ่มทดสอบโค้ดที่ทำงานกับ Spring framework:

@ExtendWith(SpringExtension.class)
@ExtendWith(MockitoExtension.class)
class TestServiceTest {

    @MockBean
    TestService service;

    @Test
    void test() {
        assertNotNull(service); // Test succeeds
    }
}

SpringExtensionสร้างเวอร์ชันทดสอบของ Spring framework แต่MockitoExtentionอนุญาตให้คุณสร้างวัตถุปลอมได้ วัตถุปลอมเป็นหัวข้อที่น่าสนใจมาก เราจะพูดถึงมันอย่างแน่นอน แต่หลังจากนั้นไม่นาน

4.4 @หมดเวลา

ขอจบการบรรยายนี้ด้วยคำอธิบายประกอบเล็กๆ น้อยๆ ที่น่า@Timeoutสนใจ ช่วยให้คุณตั้งเวลาเพื่อเรียกใช้การทดสอบ หากการทดสอบใช้เวลานานกว่าที่ระบุในคำอธิบายประกอบ จะถือว่าล้มเหลว

class TimeoutDemo {
    @Test
    @Timeout(value = 100, unit = TimeUnit.MILLISECONDS)
    void failsIfExecutionTimeExceeds100Milliseconds() {
        // test will fail if it takes more than 100 milliseconds
    }
}

จบการบรรยายของเราเพียงเท่านี้