JUnit การทดสอบแบบกำหนดพารามิเตอร์ด้วยตัวอย่างโดยใช้ @Parameters

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

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

  • 🔘 แหล่งข้อมูล: เมธอด static @Parameters จะส่งคืนคอลเลกชันของอาร์เรย์ โดยแต่ละอาร์เรย์จะกลายเป็นหนึ่งรอบการทดสอบ
  • ☑️ รองชนะเลิศอันดับ: @RunWith(Parameterized.class) จะแทนที่ Block เริ่มต้นJUnit4ClassRunner จะสร้างคลาสขึ้นใหม่หนึ่งครั้งต่อแถวข้อมูล
  • ผู้สร้าง: คอนสตรัคเตอร์สาธารณะหนึ่งตัวจะเก็บข้อมูลเพียงแถวเดียวในฟิลด์อินสแตนซ์ที่เมธอดทดสอบใช้ในการตรวจสอบ
  • 🧪 ตัวอย่างการทำงาน: แถวข้อมูลห้าแถวเป็นตัวขับเคลื่อนการทดสอบ sum() และ JUnit ดูรายงาน การทดสอบทำงาน 5/5 ครั้งโดยไม่มีข้อผิดพลาด
  • 🛠️ JUnit 5: @ParameterizedTest ร่วมกับ @ValueSource, @CsvSource หรือ @MethodSource จะลบทั้งตัวรันและตัวสร้างออกไป
  • 📌 หลุมพราง: เมธอด @Parameters ที่ไม่ใช่แบบ static, คอนสตรัคเตอร์สาธารณะสองตัว หรือการขาด dependency ของ junit-jupiter-params จะทำให้การทำงานหยุดลง

JUnit การทดสอบแบบมีพารามิเตอร์โดยใช้คำอธิบายประกอบ @RunWith และ @Parameters

การทดสอบแบบพารามิเตอร์คืออะไรใน JUnit?

A การทดสอบแบบพารามิเตอร์ เป็นการทดสอบที่เรียกใช้เมธอดทดสอบเดียวกันซ้ำแล้วซ้ำเล่าโดยใช้ค่าที่แตกต่างกัน ช่วยให้นักพัฒนาประหยัดเวลาในการเขียนการทดสอบที่แตกต่างกันเฉพาะในส่วนของอินพุตและผลลัพธ์ที่คาดหวังเท่านั้น

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

ลองพิจารณาการทดสอบง่ายๆ ที่บวกตัวเลขต่างๆ เข้าด้วยกัน โค้ดอาจมีลักษณะดังนี้:

JUnit วิธีการทดสอบที่เรียกใช้เมธอด assertEquals ซ้ำสามครั้งสำหรับเมธอด sum

วิธีการข้างต้นนำไปสู่ความซ้ำซ้อนเป็นอย่างมาก ตัวเลขแต่ละคู่ใหม่จำเป็นต้องมีคำสั่ง assert อีกคำสั่งหนึ่งภายในเมธอดเดียวกัน และหาก assertion แรกไม่ผ่าน คำสั่ง assertion ที่ตามมาทั้งหมดก็จะไม่แสดงผลด้วย

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

ขั้นตอนในการสร้างพารามิเตอร์ JUnit เอกสาร

โค้ดต่อไปนี้แสดงตัวอย่างการทดสอบแบบมีพารามิเตอร์ โดยจะทดสอบเมธอด sum() ของคลาส Airthematic ซึ่งเป็นชื่อที่ใช้ในตัวอย่างโปรเจ็กต์นี้

ขั้นตอน 1) สร้างคลาสขึ้นมา ในตัวอย่างนี้ เราจะรับตัวเลขสองตัวโดยใช้เมธอด sum(int, int) ซึ่งจะคืนค่าผลรวมของตัวเลขที่ป้อนเข้ามา

คลาส Airthematic ประกาศเมธอดสาธารณะ sum ที่บวกค่าจำนวนเต็มสองค่าเข้าด้วยกัน

ขั้นตอน 2) สร้างคลาสทดสอบแบบมีพารามิเตอร์

ส่วนหัวของคลาสทดสอบมีคำอธิบายประกอบด้วย @RunWith(Parameterized.class) และฟิลด์ส่วนตัวสี่ฟิลด์

Code คำอธิบาย

  • Code 11 แนว: ใส่คำอธิบายประกอบให้กับคลาสทดสอบของคุณโดยใช้ @RunWith(Parameterized.class)
  • Code 13 แนว: ประกาศตัวแปร 'firstNumber' เป็นส่วนตัวและพิมพ์เป็น int
  • Code 14 แนว: ประกาศตัวแปร 'secondNumber' เป็น private และกำหนดชนิดข้อมูลเป็น int
  • Code 15 แนว: กำหนดตัวแปร 'expectedResult' เป็น private และกำหนดชนิดข้อมูลเป็น int
  • Code 16 แนว: กำหนดตัวแปร 'airthematic' เป็น private และกำหนดชนิดข้อมูลเป็น Airthematic

@รันวิท(class_name.class): the @รันวิท คำอธิบายประกอบใช้เพื่อระบุชื่อคลาสตัวรัน หากเราไม่ระบุประเภทใด ๆ เป็นพารามิเตอร์ ระบบรันไทม์จะเลือกประเภทเอง ปิดกั้นJUnit4ClassRunner โดยค่าเริ่มต้น

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

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

ขั้นตอน 3) สร้างคอนสตรัคเตอร์ที่ใช้เก็บข้อมูลทดสอบ โดยจะเก็บตัวแปร 3 ตัว

คอนสตรัคเตอร์ทดสอบแบบมีพารามิเตอร์ที่กำหนดค่าอาร์กิวเมนต์ int สามตัวให้กับฟิลด์อินสแตนซ์

ขั้นตอน 4) สร้างวิธีการคงที่ที่สร้างและส่งกลับข้อมูลการทดสอบ

เมธอดอินพุตแบบคงที่ที่ระบุด้วย @Parameterized.Parameters ซึ่งส่งคืนอาร์เรย์ Object สองมิติ

Code 32,33 แนว: สร้างอาร์เรย์สองมิติ (โดยให้พารามิเตอร์อินพุตสำหรับการบวก) เราใช้เมธอด asList เพื่อแปลงข้อมูลเป็นประเภท List เนื่องจากประเภทการส่งคืนของเมธอดอินพุตคือ Collection

Code 30 แนว: การใช้ @พารามิเตอร์ คำอธิบายประกอบเพื่อสร้างชุดข้อมูลอินพุตเพื่อทำการทดสอบของเรา

เมธอดแบบคงที่ที่ระบุโดยคำอธิบายประกอบ @Parameters จะส่งคืนคอลเลกชัน โดยที่แต่ละรายการในคอลเลกชันจะเป็นข้อมูลป้อนเข้าสำหรับการทดสอบหนึ่งรอบ พิจารณาองค์ประกอบ {1,2,3} ดังนี้:

  • หมายเลขแรก = 1
  • หมายเลขวินาที = 2
  • ผลลัพธ์ที่คาดหวัง = 3

ในที่นี้ แต่ละองค์ประกอบของอาร์เรย์จะถูกส่งไปยังคอนสตรัคเตอร์ทีละรายการ เนื่องจากมีการสร้างอินสแตนซ์ของคลาสหลายครั้ง ดังนั้น อาร์เรย์ทั้งห้าที่ประกาศไว้ในตัวอย่างจึงสร้างผลลัพธ์การทำงานห้าครั้งดังต่อไปนี้:

การย้ำ หมายเลขแรก หมายเลขที่สอง ผลลัพธ์ที่คาดหวัง สายคอนโซล
[0] 1 2 3 ผลรวมของ Numbers = : 3
[1] 11 22 33 ผลรวมของ Numbers = : 33
[2] 111 222 333 ผลรวมของ Numbers = : 333
[3] 10 9 19 ผลรวมของ Numbers = : 19
[4] 100 9 109 ผลรวมของ Numbers = : 109

ขั้นตอน 5) โค้ดฉบับสมบูรณ์

รายการ AirthematicTest ที่สมบูรณ์พร้อมการนำเข้า คอนสตรัคเตอร์ เมธอด @Parameters และเมธอด @Test

Code คำอธิบาย:

  • Code 25 แนว: ใช้คำสั่ง @Before เพื่อตั้งค่าทรัพยากร (ในที่นี้คือ Airthematic.class) คำสั่ง @Before นี้ใช้เพื่อเรียกใช้ก่อนการทดสอบแต่ละครั้ง โดยจะมีเงื่อนไขเบื้องต้นของการทดสอบอยู่ภายใน
  • Code 36 แนว: ใช้ annotation @Test เพื่อสร้างการทดสอบของเรา
  • Code 39 แนว: การสร้าง a ยืนยันข้อความ เพื่อตรวจสอบว่าผลรวมของเราตรงกับที่เราคาดไว้หรือไม่

ขั้นตอน 6) สร้างคลาสสำหรับเรียกใช้การทดสอบแบบมีพารามิเตอร์:

คลาส TestRunner ส่งผ่านคลาส AirthematicTest ไปยัง JUnitCore.runClasses และข้อผิดพลาดในการพิมพ์

Code คำอธิบาย:

  • Code 8 แนว: ประกาศเมธอดหลักของคลาส Test ซึ่งจะรันคำสั่งของเรา JUnit ทดสอบ
  • Code 9 แนว: ดำเนินการทดสอบโดยใช้ JUnitเมธอด Core.runClasses จะรับชื่อคลาสทดสอบเป็นพารามิเตอร์ (ในตัวอย่างของเรา เราใช้ AirthematicTest.class)
  • Code 11 แนว: ประมวลผลผลลัพธ์โดยใช้ลูป for และพิมพ์ผลลัพธ์ที่ล้มเหลวออกมา
  • Code 13 แนว: การพิมพ์ผลลัพธ์สำเร็จ

Output:

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

Eclipse JUnit ดูรายงานการทำงาน พบว่าการทำงานสำเร็จ 5/5 ครั้ง โดยไม่มีข้อผิดพลาดหรือความล้มเหลวใดๆ สำหรับคลาสที่มีพารามิเตอร์

ดูผลลัพธ์บนคอนโซล ซึ่งแสดงผลการบวกของตัวเลขทั้งสอง:

Eclipse คอนโซลแสดงผลรวมหนึ่งรายการของ Numbers บรรทัดสำหรับแต่ละแถวพารามิเตอร์ทั้งห้าแถว

การทดสอบแบบพารามิเตอร์ใน JUnit 5 ด้วย @ParameterizedTest

ตัวอย่างข้างต้นเขียนขึ้นเพื่อ JUnit 4. JUnit 5 (Jupiter) ตัดโมเดล Runner ออกไปทั้งหมด ดังนั้น @RunWith(Parameterized.class), ตัวสร้างข้อมูล และฟิลด์อินสแตนซ์ทั้งหมดจึงหายไป JUnit โค้ด 4 ข้อที่แสดงด้านบนนั้นยังไม่ล้าสมัย: มันยังคงทำงานได้โดยไม่มีการเปลี่ยนแปลงใดๆ JUnit แพลตฟอร์มผ่านเอนจิ้นแบบวินเทจ อย่างไรก็ตาม การทดสอบใหม่มักจะเขียนด้วย @ParameterizedTest

จำเป็นต้องติดตั้งสองไลบรารี ได้แก่ junit-jupiter-api สำหรับคำอธิบายประกอบการทดสอบ และ จูนิท-จูปิเตอร์-พารามส์ สำหรับการสนับสนุนแบบพารามิเตอร์ หากไม่มีอาร์ติแฟกต์ตัวที่สอง คำอธิบายประกอบแหล่งที่มาจะไม่สามารถแก้ไขได้เลย

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

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

class AirthematicTest {

    // one row per iteration, no constructor and no runner
    @ParameterizedTest(name = "{0} + {1} = {2}")
    @CsvSource({"1, 2, 3", "11, 22, 33", "111, 222, 333", "10, 9, 19", "100, 9, 109"})
    void sumOfTwoNumbers(int firstNumber, int secondNumber, int expectedResult) {
        assertEquals(expectedResult, new Airthematic().sum(firstNumber, secondNumber));
    }
}

Jupiter มีแหล่งข้อมูลอ้างอิงหลายแหล่ง และแหล่งที่เหมาะสมนั้นขึ้นอยู่กับลักษณะของข้อมูล:

คำอธิบายแหล่งที่มา วัสดุ ใช้เมื่อ
@ValueSource คอลัมน์เดียวของค่าคงที่ การทดสอบนี้รับอาร์กิวเมนต์เพียงหนึ่งตัวเท่านั้น
@CsvSource แถวคั่นด้วยเครื่องหมายจุลภาคแบบอินไลน์ ตารางตัวเลขและสตริงขนาดเล็กถูกอ่านได้อย่างชัดเจนในไฟล์
@CsvFileSource อ่านแถวจากไฟล์ CSV ใน classpath สำหรับการทดสอบ ชุดข้อมูลมีขนาดใหญ่หรือได้รับการจัดการอยู่นอกโค้ด
@MethodSource โรงงานคงที่ที่ส่งคืนสตรีมของอาร์กิวเมนต์ จำเป็นต้องใช้ข้อมูลจริง ค่าที่คำนวณได้ หรือข้อมูลแบบสุ่ม
@EnumSource ค่าคงที่ของ enum ค่า enum ทุกค่าจะต้องถูกใช้งาน

มีสองกฎที่มือใหม่ส่วนใหญ่มักพลาด ประการแรก การระบุแหล่งที่มา (source annotation) ที่วางไว้บนเมธอด @Test ธรรมดาจะถูกละเลยโดยไม่มีการแจ้งเตือนใดๆ ดังนั้นเมธอดนั้นต้องมี @ParameterizedTest และประการที่สอง ค่าว่างที่ไม่มีเครื่องหมายคำพูดใน @CsvSource จะถูกอ่านเป็นค่าว่าง (null) ในขณะที่ค่าว่างที่มีเครื่องหมายคำพูดจะถูกอ่านเป็นสตริงว่าง

การขอ JUnit คำอธิบายประกอบ 4 รายการที่ใช้ในบทความนี้จะถูกแปลงไปใช้กับ Jupiter ดังนี้: @RunWith(Parameterized.class) จะกลายเป็น @ParameterizedTest บวกกับคำอธิบายประกอบแหล่งที่มา, @Parameters จะกลายเป็น @MethodSource หรือ @CsvSource และ @Before จะกลายเป็น @BeforeEach รายการทั้งหมดมีอธิบายไว้ในส่วนต่อไป JUnit คำอธิบายประกอบ เกี่ยวกับการสอน

ข้อดีและข้อจำกัดของการทดสอบแบบกำหนดพารามิเตอร์

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

ข้อดี

  • Less การทำซ้ำ: วิธีหนึ่งคือการแทนที่กลุ่มคำสั่ง assert ที่เกือบเหมือนกันทุกประการ ดังที่แสดงในภาพหน้าจอแรกในบทความนี้
  • ความคุ้มครองที่ถูกกว่า: การเพิ่มกรณีพิเศษนั้นใช้ข้อมูลเพิ่มขึ้นเพียงหนึ่งแถว แทนที่จะสร้างระบบใหม่ทั้งหมด กรณีทดสอบ วิธี
  • การรายงานที่แม่นยำ: แต่ละรอบจะถูกรายงานแยกกัน ดังนั้น JUnit การแสดงผลแบบนี้จะระบุได้อย่างแม่นยำว่าแถวใดเกิดข้อผิดพลาด แทนที่จะเป็นการแสดงข้อผิดพลาดโดยรวม
  • ข้อมูลส่วนกลาง: ข้อมูลนำเข้าจะถูกจัดเก็บไว้ในเมธอดเดียว และสามารถย้ายไปยังไฟล์ CSV หรือ factory ในภายหลังได้โดยไม่ต้องแก้ไข assertions

ข้อ จำกัด

  • รูปแบบหนึ่งของการยืนยัน: ทุกแถวจะทำการตรวจสอบตามเงื่อนไขเดียวกัน ดังนั้นสถานการณ์ที่ต้องการการตรวจสอบที่แตกต่างกันก็ยังคงต้องใช้เมธอดทดสอบของตัวเอง
  • ขอบเขตระดับชั้นเรียนใน JUnit 4: ตัวรันเนอร์จะกำหนดพารามิเตอร์ให้กับทั้งคลาส ดังนั้นเมธอด @Test ที่ไม่เกี่ยวข้องในคลาสนั้นก็จะทำงานหนึ่งครั้งต่อแถวเช่นกัน
  • รายงานที่อ่านไม่ออก: หากไม่มีเทมเพลตชื่อ ความล้มเหลวจะปรากฏเป็น testAirthematicTest[3] ซึ่งไม่ได้บอกอะไรเกี่ยวกับข้อมูลที่เสียหาย
  • ข้อมูลแทรกขนาดใหญ่: อาร์เรย์ขนาดใหญ่จะทำให้พื้นที่สำหรับตรรกะการทดสอบแคบลง ควรย้ายไปไว้ใน @CsvFileSource หรือโรงงาน @MethodSource แทน

ข้อผิดพลาดทั่วไปใน JUnit การทดสอบแบบกำหนดพารามิเตอร์

ข้อผิดพลาดที่มีพารามิเตอร์ส่วนใหญ่เป็นข้อผิดพลาดในการเริ่มต้นระบบ ซึ่งเกิดขึ้นก่อนที่การตรวจสอบเงื่อนไขใดๆ จะทำงาน ตารางด้านล่างแสดงข้อความที่ปรากฏบ่อยที่สุดและสิ่งที่กระตุ้นให้เกิดข้อผิดพลาดเหล่านั้น

ระบุความประสงค์หรือข้อมูลเพิ่มเติม ก่อให้เกิด แก้ไขปัญหา
คลาสทดสอบควรมีคอนสตรัคเตอร์สาธารณะเพียงหนึ่งเดียวเท่านั้น คลาสนี้ไม่ได้ประกาศคอนสตรัคเตอร์สาธารณะ หรือมีคอนสตรัคเตอร์สาธารณะสองตัว ควรมีคอนสตรัคเตอร์สาธารณะเพียงหนึ่งตัวที่มีพารามิเตอร์ตรงกับคอลัมน์ข้อมูล
ไม่มีเมธอด public static parameters ในคลาส เมธอด @Parameters ไม่ใช่ public static หรือส่งค่าคืนเป็นประเภทที่ไม่ถูกต้อง ประกาศเป็น public static Collection และส่งคืนค่า Arrays.asList(…)
IllegalArgumentException: จำนวนอาร์กิวเมนต์ไม่ถูกต้อง แถวนั้นกว้างหรือแคบกว่ารายการพารามิเตอร์ของตัวสร้าง กำหนดให้ทุกอาร์เรย์ในคอลเลกชันมีความกว้างเท่ากับอาร์เรย์ที่สร้างจากคอนสตรัคเตอร์
ข้อผิดพลาดในการกำหนดค่า: ไม่มีตัวให้บริการอาร์กิวเมนต์ การทดสอบ Jupiter ใช้ @ParameterizedTest โดยไม่มีการระบุแหล่งที่มา เพิ่ม @ValueSource, @CsvSource, @CsvFileSource, @MethodSource หรือ @EnumSource
ดูเหมือนว่าคำอธิบายประกอบแหล่งที่มาจะไม่มีผลอะไร เมธอดนี้ใช้คำอธิบายประกอบ @Test แทนที่จะเป็น @ParameterizedTest แทนที่ @Test ด้วย @ParameterizedTest และนำเข้า junit-jupiter-params

กับดักอีกอย่างหนึ่งคือสถานะที่ใช้ร่วมกัน เพราะว่า JUnit สร้างอินสแตนซ์ใหม่ต่อแถว สิ่งใดก็ตามที่เก็บไว้ในฟิลด์คงที่ยังคงอยู่ทุกรอบการวนซ้ำ และค่าที่เขียนโดยแถว [0] สามารถเปลี่ยนแปลงผลลัพธ์ของแถว [4] ได้อย่างเงียบ ๆ เก็บสถานะต่อแถวไว้ในฟิลด์อินสแตนซ์และรีเซ็ตทรัพยากรที่ใช้ร่วมกันในเมธอด @Before หรือ @BeforeEach คำแนะนำทั่วไปเกี่ยวกับการแยกการทดสอบจะกล่าวถึงใน การทดสอบหน่วย เกี่ยวกับการสอน

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

TestNG ส่งข้อมูลแถวผ่านเมธอด @DataProvider ที่อ้างอิงถึงในแต่ละเมธอดทดสอบ ดังนั้นการทดสอบที่ไม่เกี่ยวข้องในคลาสจะไม่ได้รับผลกระทบ JUnit 4. กำหนดพารามิเตอร์ให้กับคลาสทั้งหมดผ่านทางรันเนอร์ของคลาสนั้น JUnit 5 ช่วยลดช่องว่างนั้นด้วย @ParameterizedTest สำหรับแต่ละเมธอด

ใช่. JUnit 4 รองรับ @Parameters(name = “{index}: sum({0},{1})={2}”) และ Jupiter รองรับ @ParameterizedTest(name = “…”). ค่าตัวแทนจะถูกแทนที่ในระหว่างการทำงาน ดังนั้นรายงานความล้มเหลวจะระบุชื่อแถวที่มีปัญหาแทนที่จะแสดงดัชนีเปล่าๆ

ใช่. JUnit 4 รองรับ @Parameter(0) และ @Parameter(1) บนฟิลด์สาธารณะที่ไม่ใช่แบบ static และคลาสจะใช้คอนสตรัคเตอร์เริ่มต้น การรวมการฉีดฟิลด์เข้ากับคอนสตรัคเตอร์ข้อมูลจะทำให้เกิดข้อผิดพลาดคอนสตรัคเตอร์สาธารณะเพียงหนึ่งเดียว

JUnit 4 ต้องการเพียงแค่ไฟล์ JUnit เท่านั้น เพราะ Parameterized runner นั้นถูกบรรจุอยู่ภายในไฟล์นั้นอยู่แล้ว JUnit 5. จำเป็นต้องใช้ junit-jupiter-params ควบคู่ไปกับ junit-jupiter-api; หากไม่มีส่วนประกอบนี้ @ParameterizedTest และคำอธิบายประกอบซอร์สโค้ดทั้งหมดจะไม่สามารถแก้ไขได้

Jupiter มีฟังก์ชัน @CsvFileSource(resources = “/data.csv”, numLinesToSkip = 1) ซึ่งอ่านแถวจาก classpath สำหรับการทดสอบ JUnit 4 ไม่มีฟังก์ชันเทียบเท่าในตัว ดังนั้นเมธอด @Parameters จะต้องเปิดและวิเคราะห์ไฟล์ด้วยตนเองก่อนที่จะส่งคืนคอลเลกชัน

In JUnit 4. ทำได้ แต่ตัวรันเนอร์จะกำหนดพารามิเตอร์ให้กับทั้งคลาส ดังนั้นแต่ละเมธอดจะทำงานหนึ่งครั้งต่อแถวข้อมูล ในขณะที่ Jupiter จะกำหนดพารามิเตอร์ให้กับแต่ละเมธอด ดังนั้นเมธอด @Test ธรรมดาในคลาสเดียวกันจึงยังคงทำงานเพียงครั้งเดียว

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

นักบิน GitHub ผลิตโครงสร้างนั่งร้านได้อย่างรวดเร็ว แต่บ่อยครั้งที่เกิดการผสมปนเปกัน JUnit 4 และการนำเข้า Jupiter บางครั้งอาจทิ้งคำอธิบายประกอบซอร์สโค้ดไว้ในเมธอด @Test ธรรมดา ตรวจสอบการนำเข้าก่อนเรียกใช้ชุดทดสอบ

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