หน่วยทดสอบแคตตาล็อกรูปแบบการต่อต้าน


203

anti-pattern : ต้องมีองค์ประกอบสำคัญอย่างน้อยสองอย่างในปัจจุบันที่จะแยกแยะรูปแบบการต่อต้านที่แท้จริงจากนิสัยที่ไม่ดีแบบง่าย ๆ การฝึกฝนที่ไม่ดีหรือความคิดที่ไม่ดี:

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

โหวตให้กับรูปแบบการต่อต้าน TDD ที่คุณเคยเห็น "ในป่า" หนึ่งครั้งมากเกินไป
โพสต์บล็อกโดยเจมส์คาร์และ การสนทนาที่เกี่ยวข้องกับการพัฒนาทดสอบกลุ่ม yahoogroup

หากคุณพบหนึ่ง 'ไม่มีชื่อ' .. โพสต์ 'em เกินไป โพสต์ต่อการต่อต้านแบบหนึ่งโปรดให้คะแนนโหวตบางสิ่ง

ความสนใจของฉันคือการหาเซตย่อยอันดับต้น ๆ เพื่อที่ฉันจะได้พูดคุยกับพวกเขาในกล่องอาหารกลางวันที่จะพบกันในอนาคตอันใกล้


แอรอนคุณดูเหมือนจะอยู่เหนือสิ่งนี้ :) มันเป็นความคิดที่ดีที่จะเพิ่มแท็กไลน์หรือสโลแกนเป็นความคิดเห็นเพื่อที่เราจะได้เลื่อนน้อยลง .. จะว่าอย่างไร?
Gishu

1
นี่กำลังจะมาค่อนข้างดี .. ขอบคุณพวก n gals มาเรื่อย ๆ .. หนึ่งในโพสต์ที่ให้ข้อมูลมากที่สุด IMHO
Gishu

2
+1 รักกระทู้นี้ !!! และสิ่งเหล่านี้ส่วนใหญ่ก็เป็นจริงและมีชัยเช่นกัน!
Chii

เยี่ยมมากทำไมวิกิชุมชนนี้ถึงถูก ???
Quibblesome

2
เพราะมันเป็นชนิดของการสำรวจความคิดเห็น - คุณจะไม่อยากเป็นตัวแทนเก็บเกี่ยวเพียงเพราะคุณโพสต์ชนิดที่พบมากที่สุดของการต่อต้านรูปแบบ;)
Gishu

คำตอบ:


70

พลเมืองชั้นสอง - รหัสการทดสอบไม่ได้รับการปรับสภาพใหม่เช่นเดียวกับรหัสการผลิตซึ่งมีรหัสซ้ำจำนวนมากทำให้ยากต่อการบำรุงรักษาการทดสอบ


67

The Free Ride / Piggyback - James Carr, Tim Ottinger
แทนที่จะเขียนวิธีทดสอบเคสใหม่เพื่อทดสอบคุณสมบัติ / ฟังก์ชั่น / ฟังก์ชั่นที่แตกต่างออกไปการยืนยันแบบใหม่ (และการกระทำที่สอดคล้องกันเช่น .


15
ใช่นั่นคือสิ่งที่ฉันชอบ ฉันทำมันตลอดเวลา โอ้ ... รอ ... คุณพูดว่านี่เป็นสิ่งที่ไม่ดี :-)
guidoism

1
ฉันไม่แน่ใจว่านี่เป็นรูปแบบการต่อต้าน ค่าคงที่ทั้งหมดต้องอยู่trueหลังการเรียก mutator ที่เป็นไปได้ทุกครั้ง ดังนั้นคุณจะต้องตรวจสอบว่าค่าคงที่ทุกค่านั้นเกิดขึ้นtrueหลังจากที่มีการรวมกันของ Mutator และข้อมูลอินพุตที่คุณกำลังทดสอบ แต่คุณจะต้องการที่จะลดความซ้ำซ้อนและให้แน่ใจว่าคุณตรวจสอบทุกค่าคงที่รวมทั้งผู้ที่ไม่ได้อยู่ในปัจจุบันทำให้เกิดความล้มเหลวในการทดสอบ ดังนั้นคุณวางไว้ในcheckInvariants()ฟังก์ชั่นการตรวจสอบและใช้ในการทดสอบทุกครั้ง การเปลี่ยนแปลงรหัสและค่าคงที่อื่นจะถูกเพิ่ม คุณใส่มันลงในฟังก์ชั่นด้วยแน่นอน แต่มันเป็นฟรีเดอร์
Raedwald

2
@Raedwald - เมื่อเวลาผ่านไปชื่อการทดสอบจะไม่ตรงกับทุกสิ่งที่มันทดสอบอีกต่อไป นอกจากนี้คุณยังมีความตื่นเต้นเนื่องจากการทดสอบแบบพันกัน; ความล้มเหลวไม่ได้ระบุสาเหตุที่แท้จริงของความล้มเหลว เช่นตัวอย่างที่เป็นที่ยอมรับของการทดสอบนี้จะอ่านอะไรบางอย่างเช่น Opaque Superset ของทุกขั้นตอนการจัดเรียง >> การกระทำ >> ยืนยัน >> การกระทำเพิ่มเติม >> การยืนยัน B >> การกระทำเพิ่มเติม >> ยืนยันตอนนี้นึกคิดถ้า A และ C เป็น แตกคุณควรเห็นการทดสอบล้มเหลว 2 ครั้ง ด้วยการทดสอบข้างต้นคุณจะเห็นเพียงหนึ่งเดียวจากนั้นคุณแก้ไข A และในการเรียกใช้ครั้งต่อไปมันจะบอกคุณว่าตอนนี้ C เสียแล้ว ตอนนี้ลองนึกภาพการทดสอบที่แตกต่างกัน 5-6 รายการรวมกัน ..
Gishu

1
"ชื่อการทดสอบไม่ตรงกับทุกสิ่งที่ทดสอบ" เฉพาะในกรณีที่มีการตั้งชื่อการทดสอบสำหรับเงื่อนไขการโพสต์ที่มีอยู่เดิม หากคุณตั้งชื่อสำหรับการรวมกันของเมธอดชื่อสถานะการตั้งค่าและข้อมูลอินพุต (อาร์กิวเมนต์ของเมธอด) จะไม่มีปัญหา
Raedwald

"ความล้มเหลวไม่ได้ชี้ให้เห็นสาเหตุที่แท้จริงของความล้มเหลว" ไม่มีความล้มเหลวในการยืนยันที่บ่งบอกถึงสาเหตุของความล้มเหลว ที่ต้องมีการตรวจสอบรายละเอียดการใช้งานบางอย่าง: การดีบักสำหรับความล้มเหลวในการถดถอย, ความรู้เกี่ยวกับสถานะการพัฒนาสำหรับงาน TDD
Raedwald

64

เส้นทางที่มีความสุข

การทดสอบจะอยู่บนเส้นทางที่มีความสุข (เช่นผลลัพธ์ที่คาดหวัง) โดยไม่มีการทดสอบขอบเขตและข้อยกเว้น

JUnit Antipatterns


สาเหตุ: อาจเป็นข้อ จำกัด เวลาที่เกินจริงหรือความเกียจคร้านที่เห็นได้ชัด โซลูชันที่ได้รับการปรับโครงสร้างใหม่: ใช้เวลาในการเขียนการทดสอบเพิ่มเติมเพื่อกำจัดผลบวกปลอม สาเหตุหลังต้องการแส้ :)
Spoike

59

ฮีโร่ท้องถิ่น

กรณีทดสอบที่ขึ้นอยู่กับสิ่งที่เฉพาะเจาะจงกับสภาพแวดล้อมการพัฒนาที่เขียนขึ้นเพื่อใช้งาน ผลลัพธ์คือการทดสอบส่งผ่านกล่องพัฒนา แต่ล้มเหลวเมื่อมีคนพยายามเรียกใช้ที่อื่น

การพึ่งพาที่ซ่อนอยู่

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


น่าเศร้าที่พบเห็นสิ่งนี้มาหลายครั้งด้วยไฟล์. dll โบราณซึ่งขึ้นอยู่กับไฟล์. ini ที่หลากหลายและหลากหลายซึ่งซิงค์กันตลอดเวลาในระบบการผลิตใด ๆ ก็ตาม ถอนหายใจ


นั่นเป็นตัวอย่างที่ดีของตัวย่อ WOMPC สำหรับนักพัฒนา "ใช้งานได้บนพีซีของฉัน!" (โดยปกติจะมีการทดสอบผู้ป่วยนอก)
Joris Timmermans

58

ห่วงโซ่แก๊ง

การทดสอบสองอย่างที่ต้องดำเนินการในลำดับที่แน่นอนนั่นคือการทดสอบหนึ่งครั้งจะเปลี่ยนสถานะโกลบอลของระบบ (ตัวแปรทั่วโลกข้อมูลในฐานข้อมูล) และการทดสอบถัดไปนั้นขึ้นอยู่กับมัน

คุณมักจะเห็นสิ่งนี้ในการทดสอบฐานข้อมูล แทนที่จะทำการย้อนกลับteardown()การทดสอบจะส่งการเปลี่ยนแปลงไปยังฐานข้อมูล อีกสาเหตุที่พบบ่อยคือการเปลี่ยนแปลงสถานะโลกไม่ได้ถูกห่อหุ้มไว้ในบล็อกลอง / สุดท้ายซึ่งการทำความสะอาดควรล้มเหลวในการทดสอบ


อันนี้เป็นที่น่ารังเกียจเพียงธรรมดา .. แบ่งการทดสอบจะต้องเป็นความคิดอิสระ แต่ฉันได้อ่านเกี่ยวกับเรื่องนี้ในหลาย ๆ ที่แล้ว .. เดาว่า 'TDD ยอดนิยม' ค่อนข้างยุ่งเหยิง
Gishu

56

การเยาะเย้ย
บางครั้งการเยาะเย้ยอาจทำได้ดีและมีประโยชน์ แต่บางครั้งนักพัฒนาอาจสูญเสียตัวเองและในความพยายามที่จะเยาะเย้ยสิ่งที่ไม่ได้ทดสอบ ในกรณีนี้การทดสอบหน่วยมี mocks, stubs และ / หรือการปลอมแปลงจำนวนมากที่ระบบภายใต้การทดสอบไม่ได้ทำการทดสอบเลยแม้แต่ข้อมูลที่ถูกส่งคืนจาก mocks ก็คือสิ่งที่กำลังถูกทดสอบ

ที่มา: โพสต์ของ James Carr


2
ฉันเชื่อว่าสาเหตุของเรื่องนี้คือชั้นเรียนที่คุณทดสอบมีการพึ่งพามากเกินไป ทางเลือก Refactored คือการแยกรหัสที่สามารถแยกได้
Spoike

@Spoike; หากคุณอยู่ในสถาปัตยกรรมแบบเลเยอร์ที่ขึ้นอยู่กับบทบาทของคลาสจริงๆ บางชั้นมักจะมีการพึ่งพามากกว่าคนอื่น ๆ
krosenvold

ฉันเห็นเมื่อเร็ว ๆ นี้ในบล็อกที่เคารพนับถือการสร้างการตั้งค่าเอนทิตีจำลองที่จะส่งคืนจากที่เก็บจำลอง WTF? ทำไมไม่ยกตัวอย่างเอนทิตี้ที่แท้จริงตั้งแต่แรก ตัวฉันเองฉันเพิ่งถูกเผาโดยอินเทอร์เฟซที่เย้ยหยันซึ่งการใช้งานของฉันถูกโยน NotImplementedExceptions ไปทั่ว
โทมัส Eyde

40

The Silent Catcher - Kelly?
การทดสอบที่ผ่านไปหากมีการโยนข้อยกเว้น .. แม้ว่าข้อยกเว้นที่เกิดขึ้นจริงนั้นเป็นข้อยกเว้นที่แตกต่างจากที่ผู้พัฒนาตั้งใจไว้
ดูเพิ่มเติมที่: Secret Catcher

[Test]
[ExpectedException(typeof(Exception))]
public void ItShouldThrowDivideByZeroException()
{
   // some code that throws another exception yet passes the test
}

คนนั้นมีเล่ห์เหลี่ยมและเป็นอันตราย (เช่นทำให้คุณคิดว่าคุณทดสอบโค้ดที่จะระเบิดทุกครั้งที่เรียกใช้) นั่นเป็นเหตุผลที่ฉันพยายามระบุให้ชัดเจนเกี่ยวกับทั้งคลาสข้อยกเว้นและบางอย่างที่ไม่ซ้ำกันภายในข้อความ
Joshua Cheek

34

สารวัตร
A ทดสอบหน่วยที่ละเมิด encapsulation ในความพยายามที่จะบรรลุความครอบคลุมรหัส 100% แต่รู้มากเกี่ยวกับสิ่งที่เกิดขึ้นในวัตถุที่ความพยายามใด ๆ ที่จะ refactor จะทำลายการทดสอบที่มีอยู่และต้องการการเปลี่ยนแปลงใด ๆ ที่จะสะท้อนให้เห็นในหน่วย ทดสอบ.


'ฉันจะทดสอบตัวแปรสมาชิกของฉันได้อย่างไรโดยไม่ทำให้เป็นสาธารณะ ... แค่ทดสอบหน่วย?'


2
สาเหตุ: การอ้างอิงไร้สาระในการทดสอบกล่องสีขาว มีเครื่องมือสำหรับสร้างการทดสอบประเภทนี้เช่น Pex บน. NET โซลูชันที่ปรับโครงสร้างใหม่: ทดสอบพฤติกรรมแทนและถ้าคุณต้องการตรวจสอบค่าขอบเขตให้เครื่องมืออัตโนมัติสร้างส่วนที่เหลือ
Spoike

1
ก่อนที่ Moq จะมาฉันต้องละทิ้งกรอบการเยาะเย้ยเพื่อคัดลายมือ mocks ของฉัน มันง่ายเกินไปที่จะผูกการทดสอบของฉันกับการใช้งานจริงทำให้การปรับโครงสร้างใด ๆ เป็นไปไม่ได้ ฉันไม่สามารถบอกความแตกต่างนอกจาก Moq ฉันไม่ค่อยทำผิดพลาดแบบนี้
โทมัส Eyde

34

การตั้งค่ามากเกินไป - James Carr
การทดสอบที่ต้องใช้การตั้งค่าขนาดใหญ่เพื่อเริ่มการทดสอบ บางครั้งมีการใช้โค้ดหลายร้อยบรรทัดเพื่อเตรียมสภาพแวดล้อมสำหรับการทดสอบหนึ่งครั้งโดยมีวัตถุหลายอย่างที่เกี่ยวข้องซึ่งทำให้ยากต่อการตรวจสอบสิ่งที่ถูกทดสอบเนื่องจาก "เสียงรบกวน" ของการตั้งค่าทั้งหมดที่เกิดขึ้น (Src: โพสต์ของ James Carr )


ฉันเข้าใจว่าการตั้งค่าการทดสอบที่มากเกินไปมักจะชี้ไปที่) รหัสที่มีโครงสร้างไม่ดีหรือ b) การเยาะเย้ยไม่เพียงพอถูกต้องหรือไม่
Topher Hunt

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

32

โพรบทางทวารหนัก

การทดสอบที่ต้องใช้วิธีการที่บ้าผิดกฎหมายหรือไม่ดีต่อสุขภาพเช่น: การอ่านฟิลด์ส่วนตัวโดยใช้setAccessible (จริง)ของ Java หรือขยายคลาสเพื่อเข้าถึงฟิลด์ / วิธีการป้องกันหรือต้องทดสอบในแพคเกจบางอย่างเพื่อเข้าถึง แพ็คเกจ / ฟิลด์ทั่วโลก

หากคุณเห็นรูปแบบนี้คลาสที่อยู่ภายใต้การทดสอบจะใช้การซ่อนข้อมูลมากเกินไป

ความแตกต่างระหว่างสิ่งนี้กับผู้ตรวจสอบคือชั้นเรียนที่อยู่ภายใต้การทดสอบจะพยายามซ่อนแม้แต่สิ่งที่คุณต้องทดสอบ ดังนั้นเป้าหมายของคุณคือไม่ได้รับความคุ้มครองการทดสอบ 100% แต่สามารถทดสอบอะไรได้เลย ให้คิดถึงคลาสที่มีเพียงฟิลด์ส่วนตัวเท่านั้นซึ่งเป็นrun()วิธีที่ไม่มีข้อโต้แย้งและไม่มีผู้ได้รับเลย ไม่มีวิธีการทดสอบนี้โดยไม่ผิดกฎ


ความคิดเห็นโดย Michael Borgwardt: นี่ไม่ใช่ปฏิปักษ์ทดสอบจริง ๆ มันเป็นประโยชน์ที่จะจัดการกับข้อบกพร่องในรหัสที่กำลังทดสอบ แน่นอนว่าดีกว่าที่จะแก้ไขข้อบกพร่องเหล่านั้น แต่อาจเป็นไปไม่ได้ในกรณีของห้องสมุดบุคคลที่สาม

Aaron Digulla: ฉันเห็นด้วย บางทีรายการนี้เหมาะสำหรับวิกิ "JUnit HOWTO" ที่ดีกว่าและไม่ใช่ antipattern ความคิดเห็น?


นี่มันไม่เหมือนกับสารวัตรเหรอ?
Gishu

1
อืม .. บรรทัดนี้ 'ชั้นเรียนที่อยู่ภายใต้การทดสอบพยายามซ่อนแม้กระทั่งสิ่งที่คุณต้องทดสอบ' หมายถึงการต่อสู้แย่งชิงอำนาจระหว่างชั้นเรียนกับการทดสอบ ถ้ามันควรได้รับการทดสอบ .. มันควรจะเข้าถึงได้ในที่สาธารณะ .. ผ่านพฤติกรรมของชั้นเรียน / ส่วนต่อประสาน .. สิ่งนี้มีกลิ่นของการละเมิด encapsulation
Gishu

2
npellow: Maven2 มีปลั๊กอินสำหรับสิ่งนั้นใช่ไหม?
Aaron Digulla

1
นี่ไม่ใช่ปฏิปักษ์การทดสอบจริงๆมันเป็นประโยชน์ที่จะจัดการกับข้อบกพร่องในรหัสที่กำลังทดสอบ แน่นอนว่าดีกว่าที่จะแก้ไขข้อบกพร่องเหล่านั้น แต่อาจเป็นไปไม่ได้ในกรณีของห้องสมุดบุคคลที่สาม
Michael Borgwardt

1
IDK นั้นจะต้องมีผลข้างเคียงบางอย่าง ฉันจะทดสอบผลข้างเคียง ไม่แน่ใจว่าคุณหมายถึงอะไรเกี่ยวกับการทดสอบ API ของบุคคลที่สามฉันขอยืนยันว่าคุณควรสรุปว่าในโค้ดของคุณเองที่คุณสามารถทดสอบได้ถูกใช้อย่างถูกต้องจากนั้นทำการทดสอบการรวมรหัสนั้นกับ API ของบุคคลที่สาม จะไม่ทดสอบรหัสบุคคลที่สาม
Joshua Cheek

26

บททดสอบที่ไม่มีชื่อ - Nick Pellow

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

สองปีต่อมาเมื่อการทดสอบนั้นล้มเหลวคุณอาจต้องลองหา BUG-123 ในเครื่องมือติดตามบั๊กของคุณก่อนเพื่อค้นหาจุดประสงค์ของการทดสอบ


7
จริงอยู่ ท่อที่มีประโยชน์มากกว่าการทดสอบที่เรียกว่า "TestMethod"
เล็กน้อย

8
นอกเสียจากว่าตัวแก้ไขข้อผิดพลาดและคุณปล่อยตัวติดตามตัวเก่าและตัวระบุปัญหา ... PROJECT-123 ไม่ได้หมายความว่าอะไรอีกต่อไป ....
Chii

25

The Poke ช้า

การทดสอบหน่วยที่ทำงานช้าอย่างไม่น่าเชื่อ เมื่อนักพัฒนาเริ่มเขี่ยพวกเขามีเวลาไปเข้าห้องน้ำคว้าควันหรือแย่กว่านั้นเริ่มการทดสอบก่อนที่จะกลับบ้านในตอนท้ายของวัน (Src: โพสต์ของ James Carr )

หรือที่รู้จักในการทดสอบที่จะไม่ทำงานบ่อยเท่าที่ควร


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

นี่เป็นคำถามที่ชัดเจน แต่อะไรคือวิธีทั่วไปในการแก้ไขปัญหานี้
Topher Hunt

ตอนแรกดูเหมือนว่าจะมีประโยชน์ใช่มั้ย
Kev

1
@TopherHunt โดยทั่วไปแล้วการทดสอบจะช้าเพราะพวกเขามีการพึ่งพาราคาแพง (เช่นระบบไฟล์ฐานข้อมูล) เคล็ดลับคือการวิเคราะห์การพึ่งพาจนกว่าคุณจะเห็นปัญหาจากนั้นกดการพึ่งพาขึ้น callstack ฉันเขียนกรณีศึกษาที่นักเรียนของฉันใช้ชุดทดสอบหน่วยจาก 77 วินาทีถึง 0.01 วินาทีโดยแก้ไขการพึ่งพา: github.com/JoshCheek/fast_tests
Joshua Cheek

20

ผีเสื้อ

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

ค้างคาวของปีกสามารถก่อให้เกิดพายุเฮอริเคนในอีกด้านหนึ่งของโลก - Edward Lorenz, The Butterfly Effect


รูปแบบการต่อต้านคืออะไรที่นี่: การทดสอบลักษณะนี้เป็นอย่างไร มีวิธีแก้ไขไหม? มีข้อได้เปรียบที่สามารถโต้เถียงได้กับการทดสอบ code-under-test เพื่อแยกแยะการพึ่งพาเช่นเดียวกับSystem.DateTime.Nowการทดสอบหน่วยที่กำหนดได้ง่ายขึ้นหรือไม่?
Merlyn Morgan-Graham

1
ใน Java ตัวอย่างจะเรียกtoString()วัตถุที่ไม่ได้เขียนทับวิธี ที่จะให้ ID ของวัตถุซึ่งขึ้นอยู่กับที่อยู่หน่วยความจำ หรือtoString()มีคีย์หลักของวัตถุและมีการเปลี่ยนแปลงทุกครั้งที่คุณเรียกใช้การทดสอบ มีสามวิธีในการแก้ไขปัญหานี้: 1. เปลี่ยนรหัสที่คุณกำลังทดสอบ 2. ใช้ regexp เพื่อลบส่วนตัวแปรของผลการทดสอบหรือ 3. ใช้เครื่องมือที่มีประสิทธิภาพเพื่อเขียนทับบริการของระบบเพื่อให้ผลลัพธ์ที่สามารถคาดเดาได้
Aaron Digulla

สาเหตุพื้นฐานของรูปแบบการต่อต้านนี้คือรหัสที่อยู่ภายใต้การทดสอบไม่สนใจว่าจะต้องทดสอบความพยายามมากแค่ไหน ดังนั้นความปรารถนาของนักพัฒนาจึงเป็นปีกผีเสื้อที่ทำให้เกิดปัญหาที่อื่น
Aaron Digulla

19

The Flickering Test (ที่มา: Romilly Cocking)

การทดสอบที่ล้มเหลวเป็นครั้งคราวไม่ใช่เวลาเฉพาะและโดยทั่วไปเกิดจากสภาพการแข่งขันในการทดสอบ โดยทั่วไปแล้วจะเกิดขึ้นเมื่อทำการทดสอบสิ่งที่ไม่ตรงกันเช่น JMS

อาจเป็นชุดสุดยอดในรูปแบบต่อต้าน' Wait and See ' และรูปแบบการต่อต้าน ' The Sleeper '

การสร้างล้มเหลวใช่แล้วเพียงเรียกใช้งานการสร้างอีกครั้ง - นักพัฒนานิรนาม


@ Stuart - ต้องดูวิดีโออธิบายนี่คือ "Car Stalled - ลองตอนนี้!" videosift.com/video/… รูปแบบนี้อาจเรียกว่า "ลองตอนนี้!" หรือเพียงแค่ - "การทดสอบ Flakey"
npellow

1
ฉันเคยเขียนบททดสอบสำหรับ PRGN ที่รับรองการกระจายที่เหมาะสม บางครั้งมันอาจล้มเหลวแบบสุ่ม ไปคิด :-)
Chris Vest

1
นี่จะเป็นการทดสอบที่ดีหรือไม่? หากการทดสอบล้มเหลวคุณจะต้องติดตามสาเหตุของปัญหา ฉันต่อสู้กับใครบางคนเกี่ยวกับการทดสอบที่ล้มเหลวระหว่าง 9p ถึงเที่ยงคืน เขาบอกว่ามันสุ่ม / ไม่ต่อเนื่อง ในที่สุดมันก็โยงไปถึงข้อผิดพลาดที่เกี่ยวข้องกับเขตเวลา ไปคิด
Trenton

@ เสื้อกั๊กคริสเตียนแฮนเซน: คุณไม่สามารถเพาะเมล็ดได้หรือไม่
Andrew Grimm

@trenton มันเป็นเพียงการทดสอบที่ดีที่จะมีหากนักพัฒนาสามารถใส่ใจที่จะติดตามมันได้แทนที่จะเป็นเพียงการเพิกเฉยต่อมัน (ซึ่งพวกเขาสามารถหนีไปได้
จะ Sheppard

19

รอดู

การทดสอบที่เรียกใช้รหัสการตั้งค่าบางอย่างแล้วต้อง 'รอ' ระยะเวลาที่กำหนดก่อนที่จะสามารถ 'ดู' หากรหัสที่อยู่ภายใต้การทดสอบทำงานตามที่คาดไว้ วิธีทดสอบที่ใช้ Thread.sleep () หรือเทียบเท่านั้นแน่นอนที่สุดคือการทดสอบ "Wait and See"

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

การทดสอบดังกล่าวอาจเป็นLocal Heroเนื่องจากจะล้มเหลวเมื่อทำงานบนกล่องที่ช้ากว่าหรือเซิร์ฟเวอร์ CI ที่โอเวอร์โหลด

รอและดูรูปแบบการป้องกันไม่ให้สับสนกับนอน


อืม .. ฉันใช้บางอย่างเช่นนี้ ฉันจะทดสอบโค้ดแบบหลายเธรดได้อย่างไร
Gishu

@Gishu คุณต้องการทดสอบหน่วยหลายเธรดที่ทำงานพร้อมกันหรือไม่? ฉันพยายามที่จะเพียงแค่ทดสอบหน่วยอะไรก็ตามที่ run () วิธีการแยก วิธีง่ายๆในการทำเช่นนี้คือการเรียกใช้ run () - ซึ่งจะบล็อกแทนการเริ่มต้น () จากการทดสอบหน่วย
npellow

@Gishu ใช้ CountDownLatches, Semaphores, เงื่อนไขหรือสิ่งที่คล้ายกันเพื่อให้เธรดบอกซึ่งกันและกันเมื่อพวกเขาสามารถย้ายไปยังระดับถัดไป
Chris Vest

ตัวอย่าง: madcoderspeak.blogspot.com/2008/11/…ปุ่ม Brew evt ผู้สังเกตการณ์ทำการสำรวจในช่วงเวลาหนึ่งและเพิ่มเหตุการณ์ที่เปลี่ยนแปลง .. ซึ่งในกรณีนี้ฉันเพิ่มความล่าช้าเพื่อให้เธรดการสำรวจได้รับโอกาสในการทำงานก่อนที่การทดสอบจะออก
Gishu

ฉันคิดว่าลิงค์การ์ตูนเสีย
Andrew Grimm

17

Fixture Shared อย่างไม่เหมาะสม - Tim Ottinger
กรณีทดสอบหลายรายการในฟิกซ์เจอร์ทดสอบไม่แม้แต่ใช้หรือต้องการการตั้งค่า / การฉีกขาด ส่วนหนึ่งเป็นเพราะความเฉื่อยของนักพัฒนาเพื่อสร้างฟิกซ์เจอร์ทดสอบใหม่ ... ง่ายกว่าเพียงแค่เพิ่มกรณีทดสอบอีกหนึ่งกอง


1
อาจเป็นเพราะคลาสที่อยู่ระหว่างการทดสอบกำลังพยายามทำมากเกินไป
Mike Two

16

ยักษ์

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

เครื่องหมายที่แน่นอนสำหรับสิ่งนี้คือการทดสอบที่ครอบคลุมมากกว่าโค้ดไม่กี่บรรทัด บ่อยครั้งที่การทดสอบมีความซับซ้อนจนเริ่มมีข้อบกพร่องของพฤติกรรมของตนเองหรือเป็นขุย


15

ฉันจะเชื่อเมื่อฉันเห็น GUIs ที่กระพริบ
การตรึง / ครอบงำจิตใจที่ไม่ดีต่อการทดสอบแอปผ่าน GUI ของมัน 'เหมือนกับผู้ใช้จริง'

การทดสอบกฎเกณฑ์ทางธุรกิจผ่าน GUI นั้นเป็นรูปแบบการเชื่อมต่อที่แย่มาก หากคุณเขียนการทดสอบนับพันผ่านทาง GUI จากนั้นเปลี่ยน GUI ของคุณการทดสอบหลายพันครั้งจะหยุดพัก
ค่อนข้างทดสอบสิ่ง GUI ผ่าน GUI และจับคู่ GUI กับระบบจำลองแทนระบบจริงเมื่อคุณรันการทดสอบเหล่านั้น ทดสอบกฎเกณฑ์ทางธุรกิจผ่าน API ที่ไม่เกี่ยวข้องกับ GUI - บ็อบมาร์ติน

“ คุณต้องเข้าใจว่าการมองนั้นกำลังเชื่อ แต่ต้องรู้ด้วยว่าการเชื่อกำลังเห็นอยู่” - Denis Waitley


1
หากคุณคิดว่า GUI GUI ที่กะพริบผิดฉันเห็นคนที่เขียนการทดสอบ jUnit ซึ่งเริ่มใช้งาน GUI และต้องการการโต้ตอบกับผู้ใช้เพื่อดำเนินการต่อ มันแขวนคอชุดทดสอบที่เหลือ มากสำหรับการทดสอบระบบอัตโนมัติ!
Spoike

ฉันไม่เห็นด้วย. การทดสอบ GUI นั้นยาก แต่ก็เป็นสาเหตุของข้อผิดพลาดเช่นกัน ไม่ได้ทดสอบพวกเขาขี้เกียจ
Ray

3
ประเด็นตรงนี้คือคุณไม่ควรทดสอบ GUI แต่ควรทดสอบผ่าน GUI เท่านั้น คุณสามารถทำการทดสอบ 'หัวขาด' ระหว่าง GUI ได้ รักษา GUI ให้บางที่สุดเท่าที่จะเป็นไปได้ - ใช้รสชาติของ MVP - จากนั้นคุณสามารถหนีไปได้โดยไม่ต้องทำการทดสอบเลย หากคุณพบว่าคุณมีข้อบกพร่องที่ครอบตัดในเลเยอร์ GUI บางตลอดเวลาครอบคลุมด้วยการทดสอบ .. แต่ส่วนใหญ่ฉันไม่คิดว่ามันคุ้มค่ากับความพยายาม GUI 'เดินสายไฟ' ข้อผิดพลาดมักจะง่ายต่อการแก้ไข ...
Gishu

@Spoike: การทดสอบด้วยตนเองที่แนะนำนั้นไม่เลวและไม่ได้ใช้ jUnit (หรือกรอบการทดสอบหน่วยอื่น ๆ ) เพื่อขับเคลื่อนการทดสอบอัตโนมัติที่ไม่ใช่การทดสอบหน่วย คุณไม่ควรใส่สิ่งเหล่านั้นไว้ในโครงการเดียวกันและไม่ถือว่าพวกมันเหมือนกับการทดสอบหน่วย (เช่นทำงานอย่างต่อเนื่องหรือหลังจากทุกงานสร้าง)
Merlyn Morgan-Graham

1
@ MerlynMorgan-Graham ฉันเห็นด้วยและฉันไม่ได้หมายความว่าคุณไม่ควรทดสอบ GUI ความเชื่อมั่นที่จัดขึ้นโดยสมาชิกในทีมว่ามันโอเคที่จะผสมผสานการทดสอบด้วยตนเองที่มีคู่มือกับการทดสอบแบบอัตโนมัติทำให้ฉันสับสน ฉันค้นพบในภายหลังว่ามันเป็นวิธีที่ยอดเยี่ยมในการทำให้ทุกคนที่ไม่คุ้นเคยกับ TDD หยุดใช้มัน ฉันพบว่าการทดสอบการใช้งานแบบผสม (ซึ่งระเหยได้) กับการทดสอบหน่วย (ซึ่งคาดว่าจะมีเสถียรภาพ) นั้นไม่ดีหากคุณต้องการทำตามกระบวนการ TDD
Spoike

14

The Sleeper หรือที่รู้จักในนาม Mount Vesuvius - Nick Pellow

การทดสอบที่กำหนดไว้สำหรับ FAIL ตามเวลาและวันที่ที่กำหนดในอนาคต ปัญหานี้มักเกิดจากการตรวจสอบขอบเขตที่ไม่ถูกต้องเมื่อทดสอบโค้ดที่ใช้วัตถุ Date หรือ Calendar บางครั้งการทดสอบอาจล้มเหลวหากทำงานในเวลาที่เจาะจงมากเช่นเที่ยงคืน

'The Sleeper' ไม่ควรสับสนกับรูปแบบต่อต้าน' Wait And See '

รหัสนั้นจะถูกแทนที่มานานก่อนปี 2000 - นักพัฒนาจำนวนมากในปี 1960


ฉันอยากจะเรียกสิ่งนี้ว่าภูเขาไฟที่อยู่เฉยๆ :) .. แต่ฉันรู้ว่าคุณกำลังพูดถึงอะไร .. เช่นวันที่ที่เลือกไว้เป็นวันที่ในอนาคตสำหรับการทดสอบในขณะที่เขียนจะกลายเป็นวันที่ปัจจุบัน / อดีตเมื่อวันนั้น ผ่านไป .. ทำลายการทดสอบ คุณช่วยโพสต์ตัวอย่าง .. เพื่ออธิบายเรื่องนี้ได้ไหม
Gishu

@Gishu - +1 ฉันคิดเหมือนกัน แต่ไม่สามารถตัดสินใจระหว่างสองคนได้ ฉันอัปเดตชื่อเพื่อให้ชัดเจนน้อยลง)
npellow

11

ต้นไม้ที่ตายแล้ว

การทดสอบที่สร้างต้นขั้ว แต่การทดสอบไม่ได้ถูกเขียนขึ้นจริง

ฉันเห็นสิ่งนี้จริงๆในรหัสการผลิตของเรา:

class TD_SomeClass {
  public void testAdd() {
    assertEquals(1+1, 2);
  }
}

ฉันไม่รู้ด้วยซ้ำว่าจะคิดยังไง


8
:) - หรือที่เรียกว่า Process Compliance Backdoor
Gishu

1
เรามีตัวอย่างของสิ่งนี้เมื่อเร็ว ๆ นี้ในการทดสอบและวิธีการทดสอบที่ได้รับการปรับปรุงซ้ำหลายครั้ง หลังจากการทำซ้ำสองสามครั้งการทดสอบก็เป็นการเรียกเมธอดภายใต้การทดสอบ และเนื่องจากวิธีการคืนค่าเป็นโมฆะในตอนนี้จึงไม่มีการยืนยันใด ๆ ที่จะยืนยัน ดังนั้นโดยพื้นฐานแล้วการทดสอบก็เพื่อให้แน่ใจว่าวิธีการไม่ได้เกิดข้อยกเว้น ไม่สำคัญว่ามันจะมีประโยชน์หรือไม่จริง ฉันพบมันในการตรวจสอบโค้ดและถามว่า "แล้ว ... เรากำลังทดสอบอะไรอยู่ที่นี่"
Marvo

11

ได้รับบิตโดยวันนี้:

พื้นเปียก :
การทดสอบจะสร้างข้อมูลที่คงอยู่ที่ใดที่หนึ่ง แต่การทดสอบจะไม่ทำความสะอาดเมื่อเสร็จสิ้น สิ่งนี้ทำให้การทดสอบ (การทดสอบเดียวกันหรือการทดสอบอื่น ๆ ) อาจล้มเหลวในการทดสอบครั้งต่อไป

ในกรณีของเราการทดสอบทิ้งไฟล์ไว้ใน "temp" dir โดยได้รับอนุญาตจากผู้ใช้ที่ทำการทดสอบครั้งแรก เมื่อผู้ใช้รายอื่นพยายามทดสอบบนเครื่องเดียวกัน: boom ในความคิดเห็นในเว็บไซต์ของ James Carr Joakim Ohlrogge เรียกสิ่งนี้ว่า "Sloppy Worker" และมันเป็นส่วนหนึ่งของแรงบันดาลใจสำหรับ "Generous Leftovers" ฉันชอบชื่อของฉันดีกว่า (ดูถูกน้อยกว่าคุ้นเคยมากกว่า)


คุณสามารถใช้กฎโฟลเดอร์ชั่วคราวของ junit เพื่อหลีกเลี่ยงพื้นเปียก
DaveFar

ประเภทนี้เกี่ยวข้องกับรูปแบบการต่อต้านการรวมอย่างต่อเนื่อง ใน CI ผู้พัฒนาทุกคนควรมีพื้นที่ทำงานและทรัพยากรของตนเองและเครื่องสร้างควรเป็นสภาพแวดล้อมของตัวเองเช่นกัน จากนั้นคุณหลีกเลี่ยงสิ่งต่าง ๆ เช่นปัญหาการอนุญาต (หรือบางทีคุณอาจซ่อนพวกเขาเพื่อให้พวกเขาเปิดการผลิตเท่านั้น)
Marvo

11

The Cuckoo - Frank Carver
การทดสอบหน่วยซึ่งอยู่ในกรณีทดสอบกับคนอื่น ๆ และสนุกกับกระบวนการติดตั้ง (อาจยาว) เช่นเดียวกับการทดสอบอื่น ๆ ในกรณีทดสอบ แต่จากนั้นทิ้งสิ่งประดิษฐ์บางส่วนหรือทั้งหมดออกจากการตั้งค่า และสร้างของตัวเอง
อาการขั้นสูงของ: การติดตั้งร่วมกันอย่างไม่เหมาะสม


10

The Secret Catcher - Frank Carver
การทดสอบที่มองแวบแรกดูเหมือนจะไม่ทำการทดสอบเนื่องจากไม่มีการยืนยัน แต่ "ปีศาจอยู่ในรายละเอียด" .. การทดสอบนั้นขึ้นอยู่กับข้อยกเว้นที่จะถูกโยนทิ้งและคาดว่ากรอบการทดสอบจะจับข้อยกเว้นและรายงานให้ผู้ใช้ทราบว่าเป็นความล้มเหลว

[Test]
public void ShouldNotThrow()
{
   DoSomethingThatShouldNotThrowAnException();
}

2
ในความเป็นจริงนี้อาจเป็นการทดสอบที่ถูกต้องในความคิดของฉัน - โดยเฉพาะอย่างยิ่งการทดสอบการถดถอย
Ilja Preuß

ขออภัยอีกครั้งที่สับสนกับ Silent catcher ... การทดสอบหน่วยควรระบุความตั้งใจอย่างชัดเจนเกี่ยวกับสิ่งที่ถูกทดสอบแทนที่จะพูดว่า 'นี่ควรทำงาน' .. (+1 tp มีอะไรดีกว่าไม่มีอะไรเลย esp ถ้าคุณอยู่ในการถดถอยแบบดั้งเดิม ประเทศ)
Gishu

1
ในการทดสอบประเภทนี้อย่างน้อยฉันจะได้รับการยกเว้นและกำหนดให้กับตัวแปร จากนั้นฉันยืนยันว่าไม่เป็นโมฆะ
โทมัส Eyde

4
เฟรมเวิร์กบางตัวมีการAssert.DoesNotThrow(SomeDelegateType act)ยืนยันสไตล์ที่สามารถใช้เฉพาะในกรณีเช่นนี้ ฉันพบว่าทั้งหมดนี้น้อยกว่าการมีกรณีทดสอบที่ประสบความสำเร็จเมื่อนวกรรมิกส่งกลับค่าที่ไม่ใช่ null แต่ล้มเหลวเมื่อตัวสร้างโยน คอนสตรัคจะไม่กลับมาเป็นโมฆะ (หมายเหตุ: ใช้เฉพาะกับภาษาที่รับประกันการสร้างเพื่อส่งกลับไม่ใช่ null)
Merlyn Morgan-Graham

10

ป่าเถื่อนด้านสิ่งแวดล้อม

การทดสอบ 'หน่วย' ซึ่งสำหรับ 'ความต้องการ' ที่หลากหลายเริ่มส่งผลกระทบต่อสิ่งแวดล้อมโดยใช้และการตั้งค่าตัวแปร / พอร์ตของสภาพแวดล้อม การรันการทดสอบสองอย่างพร้อมกันนี้จะทำให้เกิดข้อยกเว้น 'พอร์ตที่ใช้งานไม่ได้' เป็นต้น

การทดสอบเหล่านี้จะไม่ต่อเนื่องและปล่อยให้นักพัฒนาพูดว่า 'เรียกใช้อีกครั้ง'

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


@ gcrain .. การทดสอบควรกำหนดไว้ล่วงหน้า IMO แนวทางที่ดีกว่าคือการใช้พอร์ต 'ที่รู้จักกันดีในทีม' สำหรับการทดสอบและการล้างข้อมูลก่อนและหลังการทดสอบอย่างถูกต้องเพื่อให้สามารถใช้งานได้เสมอ ...
Gishu

1
@gishu - ปัญหาไม่ใช่ว่าจะไม่มีการตั้งค่า () และ teardown () วิธีการจัดการโดยใช้พอร์ตเหล่านี้ ปัญหาเป็นเช่นการเรียกใช้เซิร์ฟเวอร์ CI และการทดสอบหลายรุ่นในเวลาเดียวกันพยายามใช้หมายเลขพอร์ต hardcoded ในการทดสอบเดียวกัน
gcrain

10

การทดสอบของทัวริง

เครื่องมือทดสอบที่สร้างขึ้นโดยอัตโนมัติโดยเครื่องมือราคาแพงบางอย่างที่มีจำนวนมากยืนยันจำนวนมากที่รวบรวมจากชั้นเรียนภายใต้การทดสอบโดยใช้การวิเคราะห์การไหลของข้อมูลที่ฉลาดเกินไปโดยครึ่งหนึ่ง นักพัฒนากล่อมให้มีความมั่นใจผิด ๆ ว่าโค้ดของพวกเขาได้รับการทดสอบอย่างดีปลดพวกเขาจากความรับผิดชอบในการออกแบบและบำรุงรักษาการทดสอบที่มีคุณภาพสูง หากเครื่องสามารถเขียนการทดสอบให้คุณได้ทำไมมันไม่สามารถดึงนิ้วออกมาและเขียนแอพได้!

สวัสดีโง่ - คอมพิวเตอร์ที่ฉลาดที่สุดในโลกไปจนถึงเด็กฝึกงานใหม่ (จากการ์ตูนเอมิกาเล่มเก่า)


10

การทดสอบเสาเท้าสี่สิบ

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


9

Doppelgänger

ในการทดสอบบางอย่างคุณต้องคัดลอกบางส่วนของรหัสที่อยู่ภายใต้การทดสอบลงในคลาสใหม่ที่มีชื่อและแพคเกจเดียวกันและคุณต้องใช้ classpath magic หรือ classloader ที่กำหนดเองเพื่อให้แน่ใจว่าสามารถมองเห็นได้ก่อน ขึ้นไป)

รูปแบบนี้ระบุจำนวนการพึ่งพาที่ไม่ดีต่อสุขภาพซึ่งคุณไม่สามารถควบคุมได้จากการทดสอบ

ฉันมองที่ใบหน้าของเขา ... ใบหน้าของฉัน! มันเหมือนกระจก แต่ทำให้เลือดฉันแข็ง


7

The Mother Hen - Frank Carver
การตั้งค่าทั่วไปซึ่งทำได้มากกว่ากรณีทดสอบจริง ตัวอย่างเช่นการสร้างโครงสร้างข้อมูลที่ซับซ้อนทุกประเภทซึ่งมีค่าที่สำคัญและไม่เหมือนใครเมื่อการทดสอบยืนยันว่ามีหรือไม่มีของบางอย่างเท่านั้น
อาการขั้นสูงของ: การติดตั้งร่วมกันอย่างไม่เหมาะสม

ฉันไม่รู้ว่ามันทำอะไร ... ฉันกำลังเพิ่มอยู่ในกรณี - นักพัฒนานิรนาม


7

ทดสอบทุกอย่าง

ฉันไม่สามารถเชื่อว่าเรื่องนี้ยังไม่ได้รับการกล่าวถึงจนถึงขณะนี้ แต่ผลการทดสอบไม่ควรทำลายหลักการ Single รับผิดชอบ

ฉันเจอหลายครั้งแล้วที่การทดสอบที่ฝ่าฝืนกฎนี้เป็นฝันร้ายที่ต้องรักษาไว้


6

สายตี

ในการทดสอบลุคแรกนั้นครอบคลุมทุกอย่างและเครื่องมือการครอบคลุมโค้ดยืนยันด้วย 100% แต่ในการทดสอบความเป็นจริงจะมีเฉพาะโค้ดที่ไม่มีการวิเคราะห์ผลลัพธ์ใด ๆ

ครอบคลุม VS-สามารถเข้าถึงรหัส

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.