Junit เป็นกรอบการทดสอบการถดถอยที่เขียนโดย Erich Gamma และ Kent Beck การทดสอบ Junit เป็นการทดสอบโปรแกรมเมอร์เช่นการทดสอบกล่องสีขาว หน้าแรกของโครงการ: http://www.junit.org/
เมื่อใช้ junit คุณส่วนใหญ่เขียนกรณีทดสอบโดยสืบทอดหมวด testcase และใช้ชื่อ testxxx () เพื่อเขียนการทดสอบหน่วย
มีสามสิ่งที่ต้องเขียนการทดสอบกับ Junit:
1. คำสั่งนำเข้าแนะนำคลาสทั้งหมดภายใต้ junit.framework.*
2. คำสั่งขยายช่วยให้ชั้นเรียนของคุณสืบทอดจาก testcase
3. ตัวสร้างที่เรียกซุปเปอร์ (สตริง)
ฟังก์ชั่น Mathtool
แพ็คเกจ com.zj.c01; คลาสสาธารณะ Mathtool {สาธารณะคงที่ int gcd (int num1, int num2) {int r = 0; ในขณะที่ (num2! = 0) {r = num1 % num2; num1 = num2; num2 = r; } return num1; -ทดสอบคลาส Mathtooltest
แพ็คเกจ com.zj.c01; นำเข้า junit.framework.testcase; คลาสสาธารณะ MathToolTest ขยาย TestCase {Public MathToolTest (ชื่อสตริง) {super (ชื่อ); } โมฆะสาธารณะ testgcd () {assertequals (5, mathtool.gcd (10, 5)); - เมื่อเราใช้ Junit เพื่อทดสอบข้อยกเว้นวิธีที่ง่ายที่สุดในการคิดคือใช้ลอง ... จับเพื่อจับข้อยกเว้น เราจำเป็นต้องยืนยันเงื่อนไขต่อไปนี้:
1. ข้อยกเว้นที่ถูกโยนทิ้ง 2. ประเภทคลาสของข้อยกเว้นที่ถูกโยน 3. ประเภทเฉพาะของข้อยกเว้นจะถูกโยนทิ้ง โดยทั่วไปตรวจสอบการกำหนดสตริงที่มีอยู่ในแอตทริบิวต์ข้อความของข้อยกเว้น ดังนั้นคุณสามารถเขียนรหัสทั่วไปเช่นนี้:
@Test โมฆะสาธารณะ testBizexception () {ลอง {password.validate ("123"); ล้มเหลว ("ไม่มีข้อยกเว้นใด ๆ "); } catch (exception ex) {assertTrue (ex instanceof bizexception); assertTrue (ex.getMessage (). มี ("ข้อผิดพลาด")); - วิธีการทดสอบที่นี่คือวิธีการรหัสผ่าน Validate () จะทำให้เกิดข้อยกเว้นที่เกี่ยวข้องหรือไม่ โปรดทราบว่าล้มเหลว ("ไม่มีข้อยกเว้น") ในการลองไม่พลาดที่นี่
บรรทัดของรหัสมิฉะนั้นหากวิธีการทดสอบไม่ได้ทำการยกเว้นกรณีการใช้งานนี้จะผ่านไปและสิ่งที่คุณคาดหวังคือการโยนข้อยกเว้น
ใน Junit 4 ไม่จำเป็นต้องทดสอบข้อยกเว้นวิธีการเช่นนี้ แม้ว่าสิ่งนี้จะสามารถพิจารณาได้ว่ามีการดำเนินการยกเว้นที่คาดหวังหรือไม่ แต่ก็ยังมีข้อเสีย คุณจะรู้หลังจากเปรียบเทียบแล้ว Junit ไม่สามารถแสดงเหตุผลโดยละเอียดสำหรับความล้มเหลวในการยืนยันในวิธีการลอง ... Catch Method
ลองมาดูวิธีทดสอบข้อยกเว้นตั้งแต่ Junit 4 เพียงแค่ใช้ @Test (execpted = exception.class) หมายเหตุประกอบดูรหัสต่อไปนี้:
@Test (คาดว่า = bizexception.class) โมฆะสาธารณะ testbizexception () {password.validate (null); -
หากวิธีการทดสอบมีประเภท bizexception โยนการยืนยันจะประสบความสำเร็จ โดยวิธีการที่ @Test (คาดว่า = bizexception.class) สามารถกำหนดประเภทของข้อยกเว้นเท่านั้นและไม่มีคำอธิบายประกอบที่สอดคล้องกันเพื่อยืนยันข้อมูลที่เฉพาะเจาะจงมากขึ้นเกี่ยวกับข้อยกเว้นนั่นคือมันไม่สามารถกำหนดคุณลักษณะข้อความของข้อยกเว้นที่ถูกโยนได้
จากนั้นบางครั้งเราจะโยนข้อยกเว้นหนึ่งประเภทหลายครั้งในวิธีการ แต่เหตุผลแตกต่างกันนั่นคือข้อมูลข้อความของข้อยกเว้นแตกต่างกัน ตัวอย่างเช่นเมื่อเกิด bizexception จะมีสองข้อยกเว้นดังต่อไปนี้:
ใหม่ bizexception ("รหัสผ่านต้องมีตัวอักษรอย่างน้อย 6 ตัวเอง") ใหม่ bizexception ("ความยาวรหัสผ่านน้อยกว่า 15 ตัวอักษร") สิ่งนี้ต้องการวิธีการยืนยันข้อความข้อยกเว้น ด้วยเหตุผลนี้ตั้งแต่ Junit 4.7 เราจึงมีตัวเลือกที่สมบูรณ์แบบมากขึ้นซึ่งเป็นรหัสต่อไปนี้:
@Rule สาธารณะคาดว่า Exception = คาดว่า Exception.none (); @Test โมฆะสาธารณะ testBizexception () พ่น InvalIdPasswordException {คาดว่า Expect (bizexception.class); คาดว่า ExpectMessage ("จำเป็น"); Password.Validate (""); - รหัสข้างต้นจำเป็นต้องมุ่งเน้น:
1. @Rule คำอธิบายประกอบการประกาศตัวแปรที่คาดหวังว่าจะต้องเป็นสาธารณะ
2. ที่ @Test ไม่สามารถเขียนเป็น @Test (คาดว่า = bizexception.class) มิฉะนั้นจะไม่สามารถทดสอบได้อย่างถูกต้อง นั่นคือ @Test (คาดว่า = bizexception.class) และวิธีการคาดหวัง ExpectXxx () ในวิธีการทดสอบไม่สามารถอยู่ร่วมกันได้ในเวลาเดียวกัน 3. พารามิเตอร์ใน PostionEx.expectMessage () เป็นตัวจับคู่หรือสายย่อยซึ่งหมายความว่าสามารถใช้นิพจน์ทั่วไปเพื่อกำหนดหรือพิจารณาว่ามีการรวมสายย่อยหรือไม่ 4. อีกสิ่งหนึ่งที่หนักมากเขียนวิธีการทดสอบที่อยู่เบื้องหลังวิธีการคาดหวัง ExpectXxx () มิฉะนั้นข้อยกเว้นที่ไม่สามารถทดสอบได้อย่างถูกต้อง 5. วิธีสุดท้ายคือตราบใดที่วิธีการทดสอบนั้นมีข้อยกเว้นโดยตรงของวิธีการทดสอบมันจะไม่ส่งผลกระทบต่อข้อยกเว้นที่คุณกังวล ดังที่ได้กล่าวไว้ก่อนหน้านี้การใช้วิธีการลอง ... การจับสามารถทดสอบข้อยกเว้นได้อย่างถูกต้อง ประโยชน์ของการเปรียบเทียบ @Test (คาดว่า = …) หรือ @Rule จะเป็นอย่างไรและลอง ... วิธีจับ? เห็นได้ชัดว่าวิธีการแนะนำโดย Junit 4 นั้นกระชับและชัดเจน มาดูกันว่า Junit จะแจ้งให้คุณทราบเมื่อการทดสอบล้มเหลว
พรอมต์ที่คุณได้รับเมื่อการทดสอบล้มเหลวอย่างผิดปกติ:
เมื่อไม่มีข้อยกเว้น:
java.lang.assertionError: ไม่มีข้อยกเว้นใด ๆ ที่ org.junit.assert.fail (assert.java:91) ที่ cc.unmi.passwordtest.passwordlengthlessthan6lettersthrowsexception (passwordtest.java:20)
เมื่อประเภทข้อยกเว้นไม่ถูกต้องหรือข้อความยกเว้นผิด:
java.lang.assertionError: ที่ org.junit.assert.fail (assert.java:91) ที่ org.junit.assert.asserttrue (assert.java:43) ที่ org.junit.assert.asserttrue (assert.java:54) cc.unmi.passwordtest.passwordlengthlessthan6lettersthrowsexception (passwordtest.java:22)
ความช่วยเหลือข้างต้นสำหรับข้อผิดพลาดในการวางตำแหน่งนั้นไม่ค่อยดีนัก ดูที่พรอมต์เมื่อการทดสอบล้มเหลวเมื่อ @Test (คาดว่า = bizexception.class):
java.lang.assertionError: ข้อยกเว้นที่คาดหวัง: cc.test.bizexception ที่ org.junit.internal.runners.statements.expectException.evaluate (คาดหวังว่า
ใช้ @rules คาดว่า Exception เพื่อทดสอบข้อยกเว้น เคล็ดลับเมื่อล้มเหลว:
java.lang.assertionError: (ข้อยกเว้นพร้อมข้อความสตริงที่มี“ ใช่. จำเป็น” และอินสแตนซ์ของ java.lang.nullpointerexception) ได้รับ: ที่ org.junit.assert.assertthat (assert.java:778) ที่ org.junit.assert.assertthat org.junit.rules.expectedexception $ คาดหวังว่าการรับรู้.
โดยเฉพาะอย่างยิ่งวิธี @rules ที่คาดว่าจะได้รับการยอมรับอย่างชัดเจนว่าทำไมการทดสอบจึงล้มเหลว คาดว่าจะมีข้อยกเว้นอะไรที่มีอยู่ในข้อความยกเว้นประเภทของข้อยกเว้นที่ได้รับจริงและข้อความในข้อยกเว้นคืออะไร ด้วยสิ่งนี้คุณจะรู้วิธีแก้ไขโปรแกรมของคุณทันทีที่คุณเห็น