JUnit กรณีทดสอบ @Before @BeforeClass คำอธิบายประกอบ

⚡ สรุปอย่างชาญฉลาด

JUnit เป็นเฟรมเวิร์กสำหรับการทดสอบหน่วยที่ใช้กันอย่างแพร่หลายที่สุด Javaและคำอธิบายประกอบชุดทดสอบจะควบคุมสิ่งที่เกิดขึ้นก่อนและหลังการเรียกใช้เมธอดทดสอบแต่ละครั้งภายในคลาสทดสอบอย่างแม่นยำ

  • 🔘 ตารางการแข่งขัน: ชุดทดสอบ (Test fixture) คือบริบทคงที่ของวัตถุและทรัพยากรที่ใช้ในการรันกรณีทดสอบ
  • ☑️ การติดตั้ง: @Before จะทำงานก่อนเมธอดทดสอบทุกเมธอด ในขณะที่ @BeforeClass จะทำงานเพียงครั้งเดียวก่อนคลาสทั้งหมด
  • ✅ การรื้อถอน: @After จะทำงานหลังจากการทดสอบทุกครั้ง แม้ว่าการทดสอบจะเกิดข้อผิดพลาดหรือการตรวจสอบเงื่อนไขล้มเหลวก็ตาม
  • 🧪 สั่งซื้อ: คลาสแม่ @Before จะทำงานก่อน จากนั้นคลาสย่อย @Before, @Test และ @After จะทำงานตามลำดับ
  • 🛠️ รองชนะเลิศอันดับ: JUnitCore.runClasses() จะเรียกใช้คลาสทดสอบและส่งคืนอ็อบเจ็กต์ Result ซึ่งเก็บข้อผิดพลาดทั้งหมดไว้
  • 📊 JUnit 5: @Before, @After, @BeforeClass และ @AfterClass จะเปลี่ยนเป็น @BeforeEach, @AfterEach, @BeforeAll และ @AfterAll ตามลำดับ

JUnit ชุดทดสอบที่มีคำอธิบายประกอบ @Before และ @BeforeClass

JUnit เป็นหน่วยที่ได้รับความนิยมมากที่สุด การทดสอบ กรอบใน Java- ขอแนะนำอย่างชัดเจนสำหรับ การทดสอบหน่วย. JUnit ไม่จำเป็นต้องใช้เซิร์ฟเวอร์ในการทดสอบเว็บแอปพลิเคชัน ซึ่งทำให้กระบวนการทดสอบรวดเร็วขึ้น

การขอ JUnit กรอบงานยังช่วยให้สร้างกรณีทดสอบและข้อมูลการทดสอบได้อย่างรวดเร็วและง่ายดาย ที่ org.junit แพ็คเกจประกอบด้วยอินเทอร์เฟซและคลาสจำนวนมากสำหรับ JUnit การทดสอบ เช่น Test, Assert, After และ Before ซึ่งเป็นการทดสอบในวงกว้างกว่านั้น JUnit ครอบครัวสร้างขึ้นบนรากฐานเดียวกันนี้

Test Fixture คืออะไร?

ก่อนที่เราจะเข้าใจว่า test fixture คืออะไร เรามาศึกษาโค้ดด้านล่างกันก่อน

รหัสนี้ออกแบบมาเพื่อดำเนินการสองกรณีทดสอบในไฟล์ธรรมดา

public class OutputFileTest {
    private File output; 
    output = new File(...);
    output.delete(); 
public void testFile1(){
        //Code to verify Test Case 1
}
    output.delete();
    output = new File(...);
public void testFile2(){
        //Code to verify Test Case 2
}
 output.delete(); 
}

ปัญหาเล็กน้อยที่นี่

  • โค้ดนี้อ่านยาก
  • รหัสนี้ไม่ใช่เรื่องง่ายที่จะรักษา
  • เมื่อชุดการทดสอบมีความซับซ้อน โค้ดอาจมีปัญหาเชิงตรรกะได้

เปรียบเทียบรหัสเดียวกันโดยใช้ JUnit.

public class OutputFileTest		
{
    private File output; 
    @Before public void createOutputFile() 
    { 
       output = new File(...);
    }
  
	@After public void deleteOutputFile() 
    {
        output.delete(); 
    } 
     
    @Test public void testFile1() 
    {
       // code for test case objective
    } 
	@Test public void testFile2() 
    {
       // code for test case objective
    }
}

โค้ดนี้อ่านง่ายและดูแลรักษาง่ายกว่ามาก โครงสร้างโค้ดข้างต้นคือ อุปกรณ์ทดสอบ

อุปกรณ์ทดสอบคือบริบทที่ JUnit กรณีทดสอบ วิ่ง โดยทั่วไป อุปกรณ์ทดสอบได้แก่:

  • ออบเจ็กต์หรือทรัพยากรที่พร้อมใช้งานสำหรับกรณีทดสอบใดๆ
  • กิจกรรมที่จำเป็นเพื่อให้วัตถุและทรัพยากรเหล่านี้พร้อมใช้งาน
  • กิจกรรมเหล่านี้ได้แก่
    1. การจัดสรร (การติดตั้ง)
    2. ยกเลิกการจัดสรร (น้ำตาตก).

ติดตั้งและรื้อถอน

ตารางการแข่งขันมีความสำคัญเพราะ JUnit เรียกใช้ฟังก์ชันเหล่านี้ในทุกการทดสอบ

  • โดยปกติแล้ว มีงานที่ต้องทำซ้ำๆ ก่อนการทดสอบแต่ละกรณี ตัวอย่าง: สร้างการเชื่อมต่อฐานข้อมูล
  • ในทำนองเดียวกัน ในตอนท้ายของแต่ละกรณีทดสอบ อาจมีงานที่ทำซ้ำบางกรณี ตัวอย่าง: เพื่อล้างข้อมูลเมื่อการดำเนินการทดสอบสิ้นสุดลง
  • JUnit มีคำอธิบายประกอบที่ช่วยในการตั้งค่าและยกเลิกการตั้งค่า ทำให้มั่นใจได้ว่าทรัพยากรได้รับการปล่อย และระบบทดสอบอยู่ในสถานะพร้อมสำหรับกรณีทดสอบถัดไป

ล้อยางขัดเหล่านี้ติดตั้งบนแกน XNUMX (มม.) ผลิตภัณฑ์นี้ถูกผลิตในหลายรูปทรง และหลากหลายเบอร์ความแน่นหนาของปริมาณอนุภาคขัดของมัน จะทำให้ท่านได้รับประสิทธิภาพสูงในการขัดและการใช้งานที่ยาวนาน JUnit คำอธิบายประกอบจะกล่าวถึงในหัวข้อถัดไป

การติดตั้ง

@ก่อน คำอธิบายประกอบใน JUnit ใช้กับวิธีการที่มี Java โค้ดนี้จะทำงานก่อนการทดสอบแต่ละครั้ง กล่าวคือ จะทำงานก่อนการดำเนินการทดสอบแต่ละครั้ง

การรื้อถอน (โดยไม่คำนึงถึงคำตัดสิน)

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

หมายเหตุ

  • อนุญาตให้มีคำอธิบายประกอบจำนวนเท่าใดก็ได้ตามรายการข้างต้น
  • วิธีการทั้งหมดที่มีคำอธิบายประกอบด้วย @ก่อน in JUnit จะทำงานก่อนแต่ละกรณีทดสอบ แต่อาจทำงานในลำดับใดก็ได้
  • คุณสามารถสืบทอดเมธอด @Before และ @After จากคลาสแม่ได้ การทำงานจะเป็นดังนี้ ซึ่งเป็นกระบวนการทำงานมาตรฐานใน JUnit.
  1. ดำเนินการ JUnit @Before วิธีการในซูเปอร์คลาส
  2. ดำเนินการเมธอด @Before ในคลาสนี้
  3. ดำเนินการเมธอด @Test ในคลาสนี้
  4. ดำเนินการเมธอด @After ในคลาสนี้
  5. ดำเนินการเมธอด @After ในซูเปอร์คลาส

JUnit หมายเหตุปี 5: คำอธิบายประกอบเหล่านี้คือ JUnit 4 (org.junit). JUnit 5 เปลี่ยนชื่อพวกมันใน org.junit.jupiter.apiและ JUnit โค้ด 4 ข้อด้านล่างนี้ยังคงทำงานได้กับเครื่องยนต์รุ่นเก่า

JUnit 4 คำอธิบายประกอบ JUnit เทียบเท่า 5 (ดาวพฤหัสบดี) วิ่ง
@ก่อน @ก่อนแต่ละ ก่อนวิธีการทดสอบทุกครั้ง
@หลังจาก @AfterEach หลังจากวิธีการทดสอบทุกวิธี
@บีฟอร์คลาส @ก่อนทั้งหมด ครั้งหนึ่งต่อหน้าทั้งชั้นเรียน
@หลังเลิกเรียน @AfterAll หลังจากเรียนจบทั้งชั้นเรียนแล้วครั้งหนึ่ง
@ไม่สนใจ @พิการ ข้ามการทดสอบที่มีคำอธิบายประกอบ

ตัวอย่าง: การสร้างคลาสโดยใช้ไฟล์เป็นข้อมูลทดสอบ

public class OutputFileTest		
{
    private File output; 
    @Before	public void createOutputFile() 
    { 
       output = new File(...);
    }
  
	@After public void deleteOutputFile() 
    {
        output.delete(); 
    } 
     
    @Test public void testFile1() 
    {
       // code for test case objective
    } 
	@Test public void testFile2() 
    {
       // code for test case objective
    }
}

ในตัวอย่างข้างต้น ลำดับการดำเนินการจะเป็นดังนี้ แผนภาพ tracมีการสร้าง-ทดสอบ-ลบหนึ่งรอบต่อวิธีการทดสอบหนึ่งวิธี

JUnit @Before และ @After ดำเนินการต่อเนื่องกันในสองเมธอดทดสอบ

  1. createOutputFile()
  2. ทดสอบไฟล์1()
  3. ลบไฟล์เอาท์พุต()
  4. createOutputFile()
  5. ทดสอบไฟล์2()
  6. ลบไฟล์เอาท์พุต()

อัสสัมชั:

testFile1() จะทำงานก่อน testFile2() ซึ่งไม่รับประกันว่าจะเกิดขึ้นเสมอไป

การตั้งค่าเพียงครั้งเดียว

  • เป็นไปได้ที่จะรันเมธอดเพียงครั้งเดียวสำหรับคลาสการทดสอบทั้งหมดก่อนที่จะดำเนินการการทดสอบใดๆ และก่อนหน้าการทดสอบใดๆ @ก่อน วิธีการ
  • การตั้งค่าแบบ "ครั้งเดียวจบ" มีประโยชน์สำหรับการเริ่มต้นเซิร์ฟเวอร์ การเปิดการสื่อสาร และงานอื่นๆ ที่คล้ายกัน การปิดและเปิดทรัพยากรใหม่ทุกครั้งหลังการทดสอบนั้นเสียเวลามาก
  • ซึ่งสามารถทำได้โดยใช้คำอธิบายประกอบ @บีฟอร์คลาส in JUnit.
@BeforeClass public static void Method_Name() {	
    // class setup code here	
 }	

วิธีการจะต้องเป็น โมฆะคงที่สาธารณะ, เพราะ JUnit จะเรียกใช้ฟังก์ชันนี้ก่อนที่อินสแตนซ์ทดสอบใดๆ จะเกิดขึ้น

รื้อลงเพียงครั้งเดียว

  • เช่นเดียวกับการตั้งค่าที่ทำเพียงครั้งเดียว ระบบก็มีวิธีการล้างข้อมูลที่ทำเพียงครั้งเดียวเช่นกัน โดยจะทำงานหลังจากวิธีการทดสอบทั้งหมดเสร็จสิ้น @หลังจาก คำอธิบายประกอบได้รับการดำเนินการแล้ว
  • มันมีประโยชน์สำหรับการหยุดping เซิร์ฟเวอร์และการปิดช่องทางการสื่อสาร
  • สามารถทำได้โดยใช้ @หลังเลิกเรียน คำอธิบายประกอบ
 @AfterClass public static void Method_Name()	
 {	
    // class cleanup code here	
 }	

JUnit ห้องทดสอบ

เมื่อมีการติดตั้งฟิกซ์เจอร์แล้ว คลาสทดสอบที่เกี่ยวข้องมักจะถูกจัดกลุ่มและเปิดใช้งานพร้อมกัน

หากเราต้องการเรียกใช้การทดสอบหลายรายการตามลำดับที่กำหนด เราสามารถทำได้โดยการรวมการทดสอบทั้งหมดไว้ในที่เดียว ซึ่งเรียกว่าชุดทดสอบ รายละเอียดเพิ่มเติมเกี่ยวกับวิธีการเรียกใช้ชุดทดสอบและวิธีการใช้งานจะอยู่ในส่วนต่อไป JUnit ครอบคลุมอยู่ในนี้ เกี่ยวกับการสอน.

JUnit นักวิ่งทดสอบ

JUnit จัดเตรียมเครื่องมือสำหรับการดำเนินการกรณีทดสอบของคุณ

  • JUnitแกน คลาสใช้เพื่อดำเนินการทดสอบเหล่านี้
  • วิธีการที่เรียกว่า รันคลาส ให้บริการโดย org.junit.runner.JUnitแกน ใช้เพื่อรันคลาสทดสอบหนึ่งหรือหลายคลาส
  • ประเภทการส่งคืนของวิธีนี้คือ ผล วัตถุ (org.junit.runner.ผลลัพธ์ซึ่งใช้สำหรับเข้าถึงข้อมูลเกี่ยวกับการทดสอบ โปรดดูตัวอย่างโค้ดต่อไปนี้เพื่อความเข้าใจที่ชัดเจนยิ่งขึ้น
public class Test {				
			public static void main(String[] args) {									
       		Result result = JUnitCore.runClasses(CreateAndSetName.class);					
			for (Failure failure : result.getFailures()) {							
         		System.out.println(failure.toString());					
      }		
      System.out.println(result.wasSuccessful());					
   }		
}      

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

JUnit หมายเหตุปี 5: JUnitแกน คือ JUnit 4 รันเนอร์ JUnit 5 แทนที่ด้วย JUnit แพลตฟอร์ม เปิด โดยปกติแล้ว API จะเริ่มต้นทำงานโดย IDE Gradle หรือ Maven Surefire

ชื่อจริง JUnit โครงการ

มีความรู้เกี่ยวกับ SDLC ในระดับปานกลาง Java การเขียนโปรแกรม และพื้นฐานของ... การทดสอบซอฟต์แวร์ กระบวนการนี้ช่วยให้เข้าใจ JUnit โปรแกรม เช่นเดียวกับความรู้เกี่ยวกับวิธีการ การทดสอบหน่วย แตกต่างจากการทดสอบการบูรณาการ

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

MyFirstClassTest.java

package guru99.JUnit;		

import static org.junit.Assert.*;				

import org.junit.Test;		

public class MyFirstClassTest {				

    @Test		
    public void myFirstMethod(){					
        String str= "JUnit is working fine";					
        assertEquals("JUnit is working fine",str);					
    }
}		

TestRunner.java

ในการเรียกใช้เมธอดทดสอบของเรา (ด้านบน) เราจำเป็นต้องสร้างตัวเรียกใช้การทดสอบ ในตัวเรียกใช้การทดสอบ เราต้องเพิ่มคลาสทดสอบเป็นพารามิเตอร์ใน JUnitเมธอด runClasses() ของ Core จะส่งคืนผลลัพธ์ของการทดสอบ โดยขึ้นอยู่กับว่าการทดสอบผ่านหรือล้มเหลว

สำหรับรายละเอียดเพิ่มเติม โปรดดูโค้ดด้านล่าง:

package guru99.JUnit;		

import org.junit.runner.JUnitCore;		
import org.junit.runner.Result;		
import org.junit.runner.notification.Failure;		

public class TestRunner {				
			public static void main(String[] args) {									
            Result result = JUnitCore.runClasses(MyFirstClassTest.class);					
			for (Failure failure : result.getFailures()) {							
              System.out.println(failure.toString());					
      }		
      System.out.println("Result=="+result.wasSuccessful());							
   }		
}      	

เอาท์พุต

เคย TestRunner.java เมื่อเรารันเมธอดทดสอบแล้ว ผลลัพธ์ที่ได้จะเป็นไม่ผ่านหรือผ่าน โปรดดูคำอธิบายผลลัพธ์ด้านล่าง:

  1. ในตัวอย่างนี้ หลังจากดำเนินการแล้ว MyFirstClassTest.javaการทดสอบผ่านแล้วและผลลัพธ์เป็นสีเขียว
  2. หากเกิดความล้มเหลว ระบบจะแสดงผลลัพธ์เป็นสีแดง และสามารถสังเกตความล้มเหลวได้จากการแสดงผลความล้มเหลว trace. ดู JUnit GUI ด้านล่าง:

Eclipse JUnit ภาพแสดงแถบสีเขียวที่แสดงว่าผ่านการทดสอบ MyFirstClassTest แล้ว

คำถามที่พบบ่อย

JUnit สร้างอินสแตนซ์ใหม่ของคลาสทดสอบสำหรับทุกเมธอดทดสอบ ดังนั้นจึงไม่มีอินสแตนซ์อยู่เมื่อต้องเรียกใช้โค้ดระดับคลาส การประกาศเมธอดเป็น static ช่วยให้ JUnit เรียกใช้งานโดยตรง

ไม่ ลำดับของวิธีการไม่ได้ระบุไว้โดยเจตนา JUnit 4 ข้อเสนอ @FixMethodOrder และ JUnit 5 ตัวเลือก @TestMethodOrder แต่ขึ้นอยู่กับลำดับที่จะส่งสัญญาณการทดสอบแบบเชื่อมโยงกัน

วิธีการทดสอบไม่เคยถูกเรียกใช้งานและถูกรายงานว่าเป็นข้อผิดพลาด ไม่ใช่ความล้มเหลว เมธอด @After ใดๆ ก็ยังคงทำงานอยู่ ดังนั้นการล้างข้อมูลจึงต้องยอมรับได้ว่าฟิกซ์เจอร์ยังสร้างไม่เสร็จสมบูรณ์

โครงการใหม่ควรเพิ่ม JUnit 5 aggregate artifact org.junit.jupiter:junit-jupiter. Teams holding legacy JUnit 4 suites เพิ่ม junit-vintage-engine เพื่อให้ทั้งสองทำงานบนแพลตฟอร์มเดียวกัน

ฟิกซ์เจอร์ (Factory) คือบริบททั้งหมดที่เตรียมไว้สำหรับการทดสอบ ซึ่งรวมถึงไฟล์หรือการเชื่อมต่อจริง ส่วนโมค (Mock) คือผู้ร่วมงานจำลองที่มีพฤติกรรมตามสคริปต์ ซึ่งมักสร้างขึ้นจากฟิกซ์เจอร์

ใช่ ผ่านทาง @BeforeClass ใน JUnit 4 หรือ @BeforeAll ใน JUnit 5. ฟิกซ์เจอร์แบบใช้ร่วมกันนั้นเร็วกว่า แต่มีการรั่วไหลของสถานะ ดังนั้นควรสงวนไว้สำหรับทรัพยากรแบบอ่านอย่างเดียวที่มีราคาแพง

ผู้ช่วย AI จะอ่านคลาส คาดเดาผู้ร่วมงานที่คลาสต้องการ และร่างการตั้งค่า @Before พร้อมกับการทำความสะอาด @After ที่ตรงกัน ตรวจสอบข้อความยืนยันที่สร้างขึ้นด้วยตนเองเสมอ

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

สรุปโพสต์นี้ด้วย: