ยกตัวอย่างของคุณ (ด้วยการปรับโครงสร้างเล็กน้อย)
assert(a + b, math.add(a, b));
ไม่ช่วย:
- เข้าใจวิธีการ
math.add
ทำงานภายใน
- รู้ว่าสิ่งที่จะเกิดขึ้นกับกรณีขอบ
มันค่อนข้างจะบอกว่า:
- หากคุณต้องการทราบว่าวิธีการใดให้ไปและดูซอร์สโค้ดหลายร้อยบรรทัดด้วยตนเอง (เพราะใช่
math.add
สามารถมี LOC หลายร้อยรายการดูด้านล่าง)
- ฉันไม่สนใจที่จะรู้ว่าวิธีการทำงานถูกต้องหรือไม่ ก็ ok ถ้าทั้งสองค่าที่คาดหวังและที่เกิดขึ้นจริงมีความแตกต่างจากสิ่งที่ผมคาดหวังจริงๆ
นี่หมายความว่าคุณไม่จำเป็นต้องเพิ่มการทดสอบเช่น:
assert(3, math.add(1, 2));
assert(4, math.add(2, 2));
พวกเขาไม่ได้ช่วยหรืออย่างน้อยเมื่อคุณยืนยันครั้งแรกแล้วข้อที่สองก็ไม่มีประโยชน์อะไรเลย
แต่จะทำอย่างไรกับ:
const numeric Pi = 3.1415926535897932384626433832795;
const numeric Expected = 4.1415926535897932384626433832795;
assert(Expected, math.add(Pi, 1),
"Adding an integer to a long numeric doesn't give a long numeric result.");
assert(Expected, math.add(1, Pi),
"Adding a long numeric to an integer doesn't give a long numeric result.");
นี่เป็นการอธิบายตนเองและเป็นประโยชน์ต่อทั้งคุณและผู้ที่จะดูแลซอร์สโค้ดในภายหลัง ลองนึกภาพว่าบุคคลนี้ทำการปรับเปลี่ยนเล็กน้อยmath.add
เพื่อลดความซับซ้อนของรหัสและเพิ่มประสิทธิภาพการทำงานและเห็นผลการทดสอบเช่น:
Test TestNumeric() failed on assertion 2, line 5: Adding a long numeric to an
integer doesn't give a long numeric result.
Expected value: 4.1415926535897932384626433832795
Actual value: 4
บุคคลนี้จะเข้าใจได้ทันทีว่าวิธีการที่เพิ่งปรับเปลี่ยนใหม่นั้นขึ้นอยู่กับลำดับของอาร์กิวเมนต์: ถ้าอาร์กิวเมนต์แรกเป็นจำนวนเต็มและอีกอันหนึ่งเป็นตัวเลขยาวผลลัพธ์จะเป็นจำนวนเต็มในขณะที่คาดว่าจะเป็นตัวเลขยาว
ในทำนองเดียวกันการได้รับมูลค่าที่แท้จริงของ4.141592
การยืนยันครั้งแรกนั้นเป็นการอธิบายตนเอง: คุณรู้ว่าวิธีการนั้นคาดว่าจะจัดการกับความแม่นยำขนาดใหญ่แต่จริงๆแล้วมันล้มเหลว
ด้วยเหตุผลเดียวกันนี้การยืนยันสองข้อต่อไปนี้จึงสมเหตุสมผลในบางภาษา:
// We don't expect a concatenation. `math` library is not intended for this.
assert(0, math.add("Hello", "World"));
// We expect the method to convert every string as if it was a decimal.
assert(5, math.add("0x2F", 5));
นอกจากนี้สิ่งที่เกี่ยวกับ:
assert(numeric.Infinity, math.add(numeric.Infinity, 1));
อธิบายตนเองเช่นกัน: คุณต้องการให้วิธีการของคุณจัดการกับอินฟินิตี้ได้อย่างถูกต้อง การก้าวไปอย่างไร้ขอบเขตหรือการโยนข้อยกเว้นไม่ใช่พฤติกรรมที่คาดหวัง
หรืออาจขึ้นอยู่กับภาษาของคุณ
/**
* Ensures that when adding numbers which exceed the maximum value, the method
* fails with OverflowException, instead of restarting at numeric.Minimum + 1.
*/
TestOverflow()
{
UnitTest.ExpectException(ofType(OverflowException));
numeric result = math.add(numeric.Maximum, 1));
UnitTest.Fail("The tested code succeeded, while an OverflowException was
expected.");
}
How does unit testing work?
ไม่มีใครจริงๆรู้ :)