Junit 4 กรอบการทดสอบหน่วย Java ที่มีชื่อเสียงได้ออกมาเป็นเวลานาน ในเวลานั้นฉันพบว่า Junit 5 อยู่ในรุ่นเบต้าดังนั้นฉันจะเขียนบทความเพื่อแนะนำ Junit 5 อย่างไรก็ตามเพราะมันยังคงเป็นรุ่นเบต้าบางส่วนไม่สมบูรณ์แบบและฉันขี้เกียจเล็กน้อย ทันใดนั้นฉันก็จำเหตุการณ์นี้ได้ในทุกวันนี้ เมื่อฉันตรวจสอบมันบนเว็บไซต์อย่างเป็นทางการฉันพบว่าในวันที่ 10 กันยายน Junit 5 เวอร์ชันอย่างเป็นทางการในที่สุดก็ออกมา! จากนั้นฉันก็เขียนบทความอีกครั้งและแนะนำ Junit Framework ล่าสุดให้คุณ
โครงสร้างกรอบ
เมื่อเทียบกับ Junit 4 โครงสร้างของ Junit 5 นั้นชัดเจนมากและให้การสนับสนุนที่ดีสำหรับฟังก์ชั่นเพิ่มเติมเช่นปลั๊กอินที่กำหนดเองการดำเนินการทดสอบ IDE ฯลฯ ซึ่งสามารถมองเห็นได้จากโครงสร้างโครงการ
แพลตฟอร์ม Junit
ชื่อแพ็คเกจของกลุ่มนี้คือ org.junit.platform อย่างที่คุณเห็นจากชื่อฟังก์ชั่นหลักของกลุ่มนี้คือการทำหน้าที่เป็นแพลตฟอร์มพื้นฐานสำหรับกรอบการทดสอบ โมดูลภายใต้แพ็คเกจนี้รวมถึง API พื้นฐาน, เอ็นจิ้นการดำเนินการและผู้บริหาร, ฟังก์ชั่นการดำเนินการบรรทัดคำสั่งพื้นฐาน, อินเตอร์เฟสบรรทัดคำสั่ง, Maven และปลั๊กอินทดสอบ Gradle และฟังก์ชั่นพื้นฐานอื่น ๆ
Junit Jupiter
ดาวพฤหัสบดีเป็นชื่อรหัสของ Junit 5 โมดูลภายใต้แพ็คเกจนี้มีฟังก์ชั่นหลักของ Junit 5 หากเราต้องการใช้ Junit 5 เราต้องรวมชุดของโมดูลนี้
Junit Vintage
Vintage เป็นชื่อรหัสสำหรับ Junit เวอร์ชันเก่า โมดูลภายใต้แพ็คเกจนี้ช่วยให้เราสามารถทำการทดสอบ Old Junit 3 และ 4 บนแพลตฟอร์ม Junit ใหม่
นำเข้าห้องสมุดชั้นเรียน
ในขณะที่ Junit 5 ยังอยู่ในช่วงเบต้ามีตัวอย่างของการรวม Junit 5 ใน Maven และ Gradle ในเอกสารอย่างเป็นทางการ แต่ในเวอร์ชันอย่างเป็นทางการเนื้อหาของส่วนนี้หายไปเหลือเพียงสองลิงก์ไปยังโครงการตัวอย่างลองดูที่มัน (คัดลอกและวาง)
ใช้ maven
Junit5-Maven-Consumer เป็นตัวอย่างอย่างเป็นทางการของ Maven เดิมทีฉันจะโพสต์การกำหนดค่า POM ที่เกี่ยวข้องที่นี่ แต่เมื่อฉันเห็นว่าการกำหนดค่าของ Maven นั้นยาวเกินไปฉันจะลืมมันไปดีกว่า หากคุณมีข้อกำหนดใด ๆ โปรดตรวจสอบการกำหนดค่า POM ของโครงการนี้ด้วยตัวเอง
ใช้ Gradle
หากคุณใช้ Gradle ปัญหานี้ง่ายกว่ามาก นอกจากนี้ยังมีคำอธิบายโดยละเอียดในโครงการตัวอย่าง Junit5-gradle-consumer
ก่อนอื่น Gradle ไม่รองรับ Junit 5 โดยค่าเริ่มต้นดังนั้นปลั๊กอินของ Junit Platform Gradle จะต้องเปิดใช้งานเพื่อรองรับ
buildScript {repositories {mavenCentral ()} การพึ่งพา {classpath 'org.junit.platform: junit-platform-gradle-plugin: 1.0.0'}} ใช้ปลั๊กอิน: 'org.junit.platform.gradle.plugin'จากนั้นมีการกำหนดค่าของปลั๊กอิน Gradle นี้ โดยค่าเริ่มต้นเครื่องยนต์และแท็กทั้งหมดจะถูกดำเนินการ หากคุณต้องการเลือกที่จะทำการทดสอบสำหรับเอ็นจิ้นและแท็กบางอย่างเท่านั้นคุณสามารถไม่สามารถทำสิ่งต่อไปนี้และแก้ไขตามความต้องการของคุณเอง แน่นอนถ้าคุณไม่มีข้อกำหนดขั้นสูงเหล่านี้คุณสามารถลบส่วนนี้ได้
junitplatform {// platformVersion '1.0.0' ตัวกรอง {engines {// รวม 'Junit-Jupiter', 'Junit-Vintage' // ยกเว้น 'Custom-Engine'} แท็ก {// รวม 'Fast' ไม่รวม 'slow'} // ไฟล์ ('build/test-results/junit-platform') // นี่คือค่าเริ่มต้น // logManager 'org.apache.logging.log4j.jul.logManager'}หากคุณต้องการเรียกใช้การทดสอบ Junit 5 เพียงนำเข้าสองการอ้างอิงต่อไปนี้ การพึ่งพาแพลตฟอร์ม Junit จะถูกนำเข้าโดยอัตโนมัติ
การพึ่งพา {testCompile ("org.junit.jupiter: Junit-Jupiter-Api: 5.0.0") Testruntime ("org.junit.jupiter: Junit-Jupiter-Engine: 5.0.0")}หากคุณต้องการเรียกใช้การทดสอบเก่า Junit 3 และ 4 ภายใต้แพลตฟอร์มใหม่คุณต้องนำเข้าการอ้างอิงต่อไปนี้
การพึ่งพา {testcompile ("Junit: Junit: 4.12") Testruntime ("org.junit.vintage: Junit-Vintage-Engine: 4.12.0")}การทดสอบเขียน
การทดสอบ Junit 4
หากการกำหนดค่าก่อนหน้าทั้งหมดเสร็จสมบูรณ์คุณสามารถเริ่มเขียนการทดสอบได้ทันที ก่อนอื่นมาตรวจสอบการทดสอบ Junit 4 เก่า
ระดับสาธารณะ Junit4Test {@Beforeclass โมฆะคงที่สาธารณะเริ่มต้น () {System.out.println ("ก่อนคลาส");}@afterclass โมฆะคงที่สาธารณะ clean () {system.out.println ("หลังคลาส");}@ก่อนหน้า {system.out.println ("หลังจาก");}@ทดสอบโมฆะสาธารณะ test1 () {system.out.println ("ทดสอบ 1");}@ทดสอบโมฆะสาธารณะ test2 () {system.out.println ("ทดสอบ 2");}}}ใช้การทดสอบ Gradle และคำสั่งอื่น ๆ เพื่อดำเนินการทดสอบนี้ ผลลัพธ์นั้นคล้ายคลึงกัน
ก่อน classebeforetest 1 การทดสอบ 2 หลังเรียน
การทดสอบ Junit 5
ลองมาดูวิธีการเขียนการทดสอบ Junit 5 เทียบเท่า การเปลี่ยนแปลงที่ชัดเจนที่สุดสามารถมองเห็นได้: ก่อนอื่นมีการเปลี่ยนชื่อเป็นชื่อที่มีชื่อเสียงมากขึ้น อีกประเด็นหนึ่งคือวิธีการทดสอบไม่จำเป็นต้องเป็นวิธีการสาธารณะดังนั้นเราจึงสามารถพิมพ์คีย์บอร์ดน้อยลงได้สองสามครั้ง
ระดับสาธารณะ Junit5Test {@BeForeAll static void beforeAll () {system.out.println ("ก่อนหน้าทั้งหมด");}@afterall void คงที่หลังจาก () {system.out.println ("หลังจากทั้งหมด"); {system.out.println ("หลังจาก");}@ทดสอบโมฆะ test1 () {system.out.println ("ทดสอบ 1");}@ทดสอบโมฆะ test2 () {system.out.println ("ทดสอบ 2");}}}}};เขียนยืนยัน
ในการตรวจสอบว่ากรณีทดสอบนั้นถูกต้องเราจำเป็นต้องเขียนการยืนยันบางอย่าง Junit 5 มาพร้อมกับการยืนยันมากมายที่สามารถช่วยเราเขียนกรณีทดสอบ ยิ่งไปกว่านั้นการยืนยันเหล่านี้มาพร้อมกับเวอร์ชันที่มากเกินไปที่สามารถยอมรับการแสดงออกของแลมบ์ดาซึ่งเหมาะสำหรับการใช้งาน Java 8 แน่นอนฉันคิดว่ามันสะดวกกว่าที่จะยืนยัน
นำเข้า org.junit.assert.asserttrue; นำเข้า org.junit.jupiter.api.assertions.*; คลาสสาธารณะ assertiondemo {@test โมฆะ testassertion () {assertequals (10, 10); assertTrue (จริง); assertequals (100, 100, "สองตัวเลขเท่ากัน"); assertall ("หมายเลข", () -> assertequals ("ชื่อ", "ชื่อ"), () -> assertequals (500, 500)); assertthrows (InvalidParameterException.class, () -> {โยน InvalidParameterException ใหม่ ();}); int result = assertTimeOut (duration.ofSeconds (5), () -> {int i = 0, j = 0; ในขณะที่ (i <= 100) {สำหรับ (; j <= 100000; j ++) j ++; i ++;} return i;}); assertequals (100, ผลลัพธ์); -การฉีดพึ่งพา
ตอนนี้ทั้งตัวสร้างและวิธีการทดสอบของคลาสทดสอบสามารถยอมรับพารามิเตอร์ อินเทอร์เฟซ ParameterResolver กำหนดวิธีการฉีดพารามิเตอร์ที่รันไทม์ ในตัวหลายตัวช่วยให้เราได้รับข้อมูลเกี่ยวกับรันไทม์ของกรณีทดสอบ
อันดับแรกคือ TestinFoparameterResolver หากมีอินสแตนซ์ของ Type TestInfo เกี่ยวกับวิธีการกรอบ Junit 5 จะฉีดอินสแตนซ์โดยอัตโนมัติ หลายวิธีของอินสแตนซ์นี้สามารถอนุญาตให้เราได้รับชื่อชื่อแสดงชื่อฉลากและข้อมูลอื่น ๆ ของคลาสทดสอบและวิธีการทดสอบ
การพึ่งพาคลาสสาธารณะ INSUSTINGDEMO {@Test @DisplayName ("การฉีดพึ่งพา") @TAG ("ทดสอบ") ถือเป็นโมฆะ TestDisplayName (TestInfo TestInfo) {assertequals ("การฉีดพึ่งพา", testinfo.getDisplayName ()); assertequals (collections.singleton ("ทดสอบ"), testinfo.getTags ()); -นอกจากนี้ยังมีตัวแยกวิเคราะห์พารามิเตอร์ในตัวเช่น RepetitionInFoparameterResolver ซึ่งจะมีการแนะนำในภายหลัง
คำอธิบายประกอบร่วมกัน
แสดงชื่อ
เราสามารถเพิ่มชื่อที่กำหนดเองในคลาสทดสอบและวิธีการทดสอบซึ่งแสดงโดยนักวิ่งทดสอบและรายงานการทดสอบ ชื่อที่แสดงไม่ได้แสดงเหมือนชื่อตัวแปร มันอาจเป็นสายยาวที่มีช่องว่างหรือแม้แต่อิโมจิอิโมจิ
@DisplayName ("คลาสทดสอบสามารถระบุชื่อจอแสดงผล") คลาสสาธารณะ DisplayNamedEmo {@Test @DisplayName ("วิธีการทดสอบยังสามารถระบุชื่อการแสดงผล") Void TestWithLongDisplayName () {} @Test @DisplayName -ปิดการทดสอบ
@Disabled Annotation สามารถใช้กับคลาสทดสอบหรือวิธีการทดสอบและการทดสอบที่สอดคล้องกันสามารถปิดใช้งานได้
@DisabledPublic คลาส disabledTestDemo {@test // @disabled Void testDisabled () {}}ทดสอบซ้ำ
หากคุณต้องการใช้วิธีการทดสอบหลายครั้งให้ใช้คำอธิบายประกอบ @repeatedTest
ชั้นเรียนสาธารณะ rectentestdemo {@repeatedtest (10) เป็นโมฆะ testrepeated10times () {}}นอกจากนี้คุณยังสามารถฉีด Instance RepetitionInfo เพื่อตรวจสอบจำนวนการทำซ้ำปัจจุบันและจำนวนการทำซ้ำทั้งหมด
ชั้นเรียนสาธารณะ rechedTestDemo {@BeforeHforeach เป็นโมฆะก่อนหน้า (ข้อมูลซ้ำ ๆ ) {system.out.printf (" %d - %d/n", info.getCurrentRepetition (), info.getTotalrepetitions ());มาพร้อมกับแท็ก
เมื่อฉันแนะนำการกำหนดค่าของ Gradle ฉันบอกว่าคุณสามารถเลือกที่จะกรองป้ายกำกับบางอย่างในการกำหนดค่า นอกจากนี้ยังง่ายมากที่จะให้แท็กในรหัสเพียงแค่ใช้ @TAG คำอธิบายประกอบ
@tag ("TaggedTest") คลาสสาธารณะ tagdemo {@test @tag ("taggedTest1") เป็นโมฆะ testWithTag1 () {} @Test @TAG ("taggedTest2") void testWithTag2 () {}}}การทดสอบซ้อนกัน
บางครั้งการทดสอบแบบซ้อนอาจจำเป็นต้องระบุความสัมพันธ์ระหว่างการทดสอบบางอย่าง การทดสอบแบบซ้อนกันใช้คำอธิบายประกอบ @nested
@DisplayName ("Outer Test") คลาสสาธารณะ NestedDemo {@Test Void Testouter () {} @Nested @DisplayName ("การทดสอบภายใน") คลาส innertestDemo {@Test Void Testinner () {}}}}}}}}}}}}}}}ควรสังเกตว่าชั้นเรียนภายในแบบคงที่เท่านั้นที่สามารถใช้คำอธิบายประกอบซ้อนกันได้ นอกจากนี้เนื่องจาก Java ไม่อนุญาตให้คลาสภายในมีวิธีการคงที่จึงไม่สามารถมีคำอธิบายประกอบ @BeForeAll และ @Afterall ได้ หากคุณต้องการที่จะผ่านข้อ จำกัด นี้คุณจะต้องเพิ่ม @Testinstance (lifecycle.per_class) คำอธิบายประกอบลงในคลาสภายในที่ซ้อนกัน สำหรับรายละเอียดโปรดดูที่วงจรการทดสอบอินสแตนซ์
การสนับสนุน IDE
แม้ว่า Junit 5 จะออกมาแล้ว อย่างไรก็ตามการสนับสนุนของเชนเครื่องมือต่าง ๆ ยังไม่ได้รับการรักษา ปัจจุบันมีเพียง Ideallij Idea และ Eclipse 4.7 (ออกซิเจน) ได้เพิ่มการสนับสนุนสำหรับ Junit 5 ดังนั้นหากคุณอยู่ในสถานการณ์ที่เป็นทางการมันปลอดภัยกว่าที่จะใช้ Junit 4
คำถามที่พบบ่อย
แยกแยะระหว่างคำอธิบายประกอบ @Test เวอร์ชันต่าง ๆ
เช่นเดียวกับที่ฉันเขียนบทความนี้ฉันพบปัญหากับตัวอย่างการทดสอบของฉัน การทดสอบไม่สามารถผ่านได้และข้อความแสดงข้อผิดพลาดด้านล่างจะปรากฏขึ้น
ความล้มเหลว (1): Junit Vintage: yitian.study.test.assertiondemo: InitializationError classsource [classname = 'yitian.study.test.assertiondemo', fileposition = null] => java.lang.exception
นักเรียนที่มีภาษาอังกฤษที่ดีควรจะสามารถรับรู้ได้ ข้อความแสดงข้อผิดพลาดนี้บอกว่าวิธีการทดสอบจะต้องเปิดเผยต่อสาธารณะ แต่ดังที่ได้กล่าวไว้ก่อนหน้านี้ Junit 5 ได้ยกเลิกข้อ จำกัด นี้ดังนั้นทำไมข้อผิดพลาดนี้ยังคงเกิดขึ้น? ฉันดูอย่างระมัดระวังและพบข้อผิดพลาด อาจเป็นเพราะ Junit 4 ถูกใช้มากในอดีตดังนั้น IDE จะเริ่มต้นกับคำอธิบายประกอบ @Test ซึ่งเสร็จสมบูรณ์โดยอัตโนมัติ
นำเข้า org.junit.test;
แพ็คเกจนี้เป็นคำอธิบายประกอบ @Test ภายใต้ Junit 4 ถ้าเราต้องการใช้ Junit 5 เราต้องการคำอธิบายประกอบ @Test ต่อไปนี้
นำเข้า org.junit.jupiter.api.test;
หลังจากแก้ไขแล้วให้ทำการทดสอบอีกครั้งและไม่มีปัญหา แน่นอนเพื่อประโยชน์ในการเรียนรู้และการใช้งานฉันยังอ้างอิงแพ็คเกจ Junit 4 ดังนั้นความขัดแย้งนี้จึงเกิดขึ้น หากคุณไม่มีความต้องการพิเศษขอแนะนำให้นำเข้าแพ็คเกจ Junit 5 Jar เท่านั้นเพื่อป้องกันความสับสน แน่นอนว่าการนำเข้าพวกเขาทั้งหมดก็โอเค แต่คุณต้องระมัดระวังในการแยกแยะพวกเขาและไม่เขียนคำอธิบายประกอบ Junit 4 เพื่อทดสอบ Junit 5 ในที่สุดฉันจะแนบตัวอย่างการทดสอบของฉัน ผู้ที่สนใจสามารถดูได้
สรุป
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้เกี่ยวกับเนื้อหาที่เกี่ยวข้องกับ Junit5 และฉันหวังว่ามันจะเป็นประโยชน์กับทุกคน เพื่อนที่สนใจสามารถอ้างถึงหัวข้ออื่น ๆ ที่เกี่ยวข้องในเว็บไซต์นี้ต่อไป หากมีข้อบกพร่องใด ๆ โปรดฝากข้อความไว้เพื่อชี้ให้เห็น ขอบคุณเพื่อนที่ให้การสนับสนุนเว็บไซต์นี้!