คำถามติดแท็ก tdd

TDD หมายถึงการพัฒนาที่ขับเคลื่อนด้วยการทดสอบหรือการออกแบบที่ขับเคลื่อนด้วยการทดสอบ มันเป็นวิธีปฏิบัติของการเขียนการทดสอบหน่วยก่อนที่จะเขียนรหัสเพื่อตอบสนองมันในสิ่งที่เรียกว่าวงจร Red-Green-Refactor

5
กำลังทดสอบรายการ ... ทั้งหมดในการทดสอบเดียวกันหรือหนึ่งการทดสอบสำหรับแต่ละเงื่อนไข?
ฉันกำลังทดสอบว่าฟังก์ชั่นทำตามที่คาดไว้ในรายการ ดังนั้นฉันต้องการทดสอบ f(null) -> null f(empty) -> empty f(list with one element) -> list with one element f(list with 2+ elements) -> list with the same number of elements, doing what expected วิธีที่ดีที่สุดคืออะไร? การทดสอบทุกกรณีในการทดสอบ (method) เดียวกันภายใต้ชื่อ "WorksAsExpected" วางหนึ่งการทดสอบสำหรับแต่ละกรณีจึงมี "WorksAsExpectedWhenNull" "WorksAsExpectedWhenEmpty" "WorksAsExpectedWhenSingleElement" "WorksAsExpectedWhenMoreElements" อีกทางเลือกหนึ่งที่ฉันไม่ได้คิด :-)
21 unit-testing  tdd 

5
วิธีการแก้ไขข้อผิดพลาดในการทดสอบหลังจากการเขียนการใช้งาน
การกระทำที่ดีที่สุดใน TDD คืออะไรหากหลังจากใช้ตรรกะอย่างถูกต้องการทดสอบยังคงล้มเหลว (เพราะมีข้อผิดพลาดในการทดสอบ)? ตัวอย่างเช่นสมมติว่าคุณต้องการพัฒนาฟังก์ชั่นต่อไปนี้: int add(int a, int b) { return a + b; } สมมติว่าเราพัฒนามันในขั้นตอนต่อไปนี้: ทดสอบการเขียน (ยังไม่มีฟังก์ชั่น): // test1 Assert.assertEquals(5, add(2, 3)); ผลลัพธ์มีข้อผิดพลาดในการรวบรวม เขียนการใช้งานฟังก์ชันหลอกตา: int add(int a, int b) { return 5; } ผลลัพธ์: test1ผ่าน เพิ่มกรณีทดสอบอื่น: // test2 -- notice the wrong expected value (should be 11)! Assert.assertEquals(12, …
21 tdd  mistakes 

5
ฉันจะทดสอบหน่วยเรียนที่ต้องใช้บริการโทรทางเว็บได้อย่างไร
ฉันพยายามทดสอบคลาสที่เรียกบริการเว็บของ Hadoop รหัสมีรูปแบบค่อนข้างมาก: method() { ...use Jersey client to create WebResource... ...make request... ...do something with response... } เช่นมีวิธีสร้างไดเรกทอรีวิธีสร้างโฟลเดอร์เป็นต้น ระบุว่ารหัสนั้นเกี่ยวข้องกับบริการเว็บภายนอกที่ฉันไม่สามารถควบคุมได้ฉันจะทดสอบหน่วยนี้ได้อย่างไร ฉันสามารถลองและเยาะเย้ยไคลเอนต์บริการเว็บ / การตอบสนอง แต่นั่นทำลายแนวทางที่ฉันได้เห็นมากเมื่อเร็ว ๆ นี้: "อย่าเยาะเย้ยวัตถุที่คุณไม่ได้เป็นเจ้าของ" ฉันสามารถตั้งค่าการใช้บริการเว็บจำลองที่ยังคงเป็นการทดสอบหน่วยหรือว่าเป็นการทดสอบการรวมหรือไม่ เป็นไปไม่ได้หรือที่จะทำการทดสอบหน่วยในระดับต่ำนี้ผู้ประกอบการ TDD จะทำเช่นนี้ได้อย่างไร?

6
การเพิ่มการทดสอบหน่วยมีเหตุผลสำหรับรหัสดั้งเดิมที่รู้จักกันดีหรือไม่
ฉันกำลังพูดถึงการทดสอบหน่วยในความหมาย TDD (ไม่ใช่ "การรวม" โดยอัตโนมัติหรือสิ่งที่คุณต้องการเรียกว่าการทดสอบ) รหัสดั้งเดิมในรหัส (C ++) โดยไม่มีการทดสอบ (ดู: Michael Feathers ' ทำงานอย่างมีประสิทธิภาพด้วยรหัสดั้งเดิม ) แต่ยังเป็นรหัสดั้งเดิมใน: รหัสที่ทีมของเราทำงานด้วยกันมา 10-5 ปีที่ผ่านมาดังนั้นเราจึงมักจะมีความคิดที่ดีเกี่ยวกับสถานที่ที่จะนำสิ่งต่าง ๆ มาเปลี่ยนอะไรบางอย่าง เรามีการทดสอบหน่วยในสถานที่ (ผ่าน Boost.Test) สำหรับบางโมดูลที่มาในภายหลังหรือเป็นแบบ "ธรรมชาติ" สำหรับการทดสอบหน่วย (เช่นคอนเทนเนอร์เฉพาะแอปทั่วไปสตริงสิ่งผู้ช่วยเครือข่าย ฯลฯ ) เรายังไม่มีการทดสอบการยอมรับอัตโนมัติที่เหมาะสม ตอนนี้เมื่อเร็ว ๆ นี้ฉันมี "ความสุข" ที่จะใช้คุณสมบัติใหม่ 3 อย่างที่ผู้ใช้งานต้องเผชิญ แต่ละคนใช้เวลาประมาณ 1-2 ชั่วโมงในการเร่งความเร็วด้วยส่วนรหัสที่ฉันต้องการเปลี่ยน 1-2 ชั่วโมงชั่วโมงในการใช้รหัส (เล็กน้อย) ที่ฉันต้องเปลี่ยนและอีก 1-2 ชั่วโมงเพื่อให้แน่ใจว่าแอป วิ่งอย่างถูกต้องในภายหลังและมันก็ควรจะทำ ตอนนี้ฉันเพิ่มรหัสเล็กน้อย (ฉันคิดว่าวิธีหนึ่งและสองสามบรรทัดสำหรับแต่ละคุณสมบัติ) …
21 c++  tdd  legacy  unit-testing 

6
วิธีลบฟังก์ชั่นหรือคุณสมบัติเมื่อใช้ TDD
ในข้อความเกี่ยวกับ TDD ฉันมักจะอ่านเกี่ยวกับ "ลบการทำซ้ำ" หรือ "ปรับปรุงการอ่าน" ในระหว่างขั้นตอนการสร้างใหม่ แต่อะไรทำให้ฉันลบฟังก์ชันที่ไม่ได้ใช้ออก สำหรับการพูดเช่นขอให้มีชั้นเรียนCด้วยวิธีการและa() b()ตอนนี้ผมคิดว่ามันจะดีที่จะมีวิธีการที่จะขับรถเข้าไปf() Cในความเป็นจริงf()แทนที่ทุกสายที่จะb()มีข้อยกเว้นของการทดสอบหน่วยที่กำหนดไว้ / b()อธิบาย ไม่จำเป็นอีกต่อไป - ยกเว้นการทดสอบ มันเป็นการประหยัดเพียงแค่ลบb()และการทดสอบทั้งหมดที่ใช้หรือไม่ เป็นส่วนหนึ่งของ "ปรับปรุงการอ่าน" หรือไม่?

3
การออกแบบการทดสอบหน่วยสำหรับระบบ stateful
พื้นหลัง การทดสอบพัฒนาการขับเคลื่อนได้รับความนิยมหลังจากเรียนจบแล้วและในอุตสาหกรรม ฉันพยายามที่จะเรียนรู้ แต่สิ่งสำคัญบางอย่างยังคงหลบหนีฉัน ผู้เสนอ TDD พูดหลายสิ่งหลายอย่างเช่น (ต่อไปนี้เรียกว่า "หลักการยืนยันเดียว" หรือSAP ): บางครั้งฉันก็คิดว่าการทดสอบ TDD นั้นเรียบง่ายมีความหมายและสง่างามเท่าที่จะทำได้ บทความนี้สำรวจเล็กน้อยเกี่ยวกับสิ่งที่ต้องการทำแบบทดสอบที่ง่ายและย่อยสลายได้มากที่สุด: มีเป้าหมายสำหรับการยืนยันเดียวในแต่ละการทดสอบ ที่มา: http://www.artima.com/weblogs/viewpost.jsp?thread=35578 พวกเขายังพูดแบบนี้ (ซึ่งต่อไปจะเรียกว่า "หลักการวิธีการส่วนตัว" หรือPMP ): โดยทั่วไปคุณไม่ได้ทดสอบหน่วยวิธีการส่วนตัวโดยตรง เนื่องจากเป็นข้อมูลส่วนบุคคลให้พิจารณารายละเอียดการใช้งาน ไม่มีใครเคยเรียกหนึ่งในพวกเขาและคาดหวังว่ามันจะทำงานในรูปแบบเฉพาะ คุณควรทดสอบส่วนต่อประสานสาธารณะแทน หากวิธีการที่เรียกวิธีการส่วนตัวของคุณทำงานได้ตามที่คุณคาดไว้คุณจะถือว่าส่วนขยายนั้นวิธีส่วนตัวของคุณทำงานอย่างถูกต้อง ที่มา: คุณทำการทดสอบวิธีการส่วนตัวอย่างไร สถานการณ์ ฉันพยายามทดสอบระบบการประมวลผลข้อมูลที่เป็นรัฐ ระบบสามารถทำสิ่งที่แตกต่างกันสำหรับข้อมูลชิ้นเดียวกันที่ได้รับจากสถานะก่อนที่จะรับข้อมูลนั้น พิจารณาการทดสอบที่ตรงไปตรงมาที่สร้างสถานะขึ้นในระบบจากนั้นทดสอบพฤติกรรมที่วิธีการที่กำหนดไว้มีวัตถุประสงค์เพื่อทดสอบ SAP แนะนำว่าฉันไม่ควรทดสอบ "ขั้นตอนการสร้างรัฐ" ฉันควรสมมติว่าสถานะเป็นสิ่งที่ฉันคาดหวังจากรหัสการสะสมแล้วทดสอบการเปลี่ยนสถานะเดียวที่ฉันพยายามทดสอบ PMP แนะนำว่าฉันไม่สามารถข้ามขั้นตอน "state build up" นี้ได้และเพียงทดสอบวิธีการที่ควบคุมการทำงานนั้นอย่างอิสระ ผลลัพธ์ในรหัสจริงของฉันคือการทดสอบที่มีการป่องซับซ้อนซับซ้อนยาวและยากที่จะเขียน และหากการเปลี่ยนสถานะเปลี่ยนไปการทดสอบจะต้องเปลี่ยน ... ซึ่งจะดีกับการทดสอบขนาดเล็กที่มีประสิทธิภาพ แต่ใช้เวลานานมากและสับสนกับการทดสอบแบบป่องยาวเหล่านี้ ปกติแล้วจะทำอย่างไร?

3
ความยากลำบากในการใช้ TDD และการสร้างใหม่ (หรือ - ทำไมจึงเจ็บปวดกว่าที่ควรจะเป็น)
ฉันต้องการสอนตัวเองให้ใช้วิธีการของ TDD และฉันก็มีโครงการที่ฉันอยากจะทำอยู่พักหนึ่ง มันไม่ใช่โครงการขนาดใหญ่ดังนั้นฉันคิดว่ามันจะเป็นตัวเลือกที่ดีสำหรับ TDD อย่างไรก็ตามฉันรู้สึกว่ามีบางอย่างผิดปกติ ขอยกตัวอย่าง: ในระดับสูงโครงการของฉันเป็นส่วนเสริมสำหรับ Microsoft OneNote ที่จะให้ฉันติดตามและจัดการโครงการได้ง่ายขึ้น ตอนนี้ฉันยังต้องการให้ตรรกะทางธุรกิจสำหรับสิ่งนี้แยกออกจาก OneNote มากที่สุดในกรณีที่ฉันตัดสินใจที่จะสร้างที่เก็บข้อมูลที่กำหนดเองของฉันเองและกลับมาสิ้นสุดวันหนึ่ง ก่อนอื่นฉันเริ่มต้นด้วยการทดสอบการยอมรับคำธรรมดาเบื้องต้นเพื่อสรุปสิ่งที่ฉันต้องการให้คุณสมบัติแรกของฉันทำ ดูเหมือนบางสิ่งนี้ (ทำให้ลดความกระชับลง): ผู้ใช้คลิกสร้างโครงการ ผู้ใช้พิมพ์ชื่อเรื่องของโครงการ ตรวจสอบว่าโครงการสร้างขึ้นอย่างถูกต้อง ข้ามสิ่งที่ UI และการวางแผนตัวกลางฉันมาทดสอบหน่วยแรกของฉัน: [TestMethod] public void CreateProject_BasicParameters_ProjectIsValid() { var testController = new Controller(); Project newProject = testController(A.Dummy<String>()); Assert.IsNotNull(newProject); } จนถึงตอนนี้ดีมาก สีแดงเขียว refactor ฯลฯ เอาล่ะตอนนี้มันต้องการบันทึกของจริง ตัดขั้นตอนที่นี่ฉันปิดท้ายด้วยสิ่งนี้ [TestMethod] public void CreateProject_BasicParameters_ProjectMatchesExpected() { …

3
การทดสอบหน่วย C ++: ต้องทดสอบอะไร
TL; DR การเขียนแบบทดสอบที่ดีและมีประโยชน์นั้นยากและมีค่าใช้จ่ายสูงในภาษาซีพลัสพลัส นักพัฒนาที่มีประสบการณ์คุณสามารถแบ่งปันเหตุผลของคุณเกี่ยวกับอะไรและเวลาที่จะทดสอบ? เรื่องยาว ฉันเคยทำการพัฒนาที่ขับเคลื่อนด้วยการทดสอบทั้งทีมจริง ๆ แล้ว แต่มันก็ไม่ได้ผลสำหรับเรา เรามีการทดสอบมากมาย แต่ดูเหมือนว่าพวกเขาจะไม่ครอบคลุมกรณีที่เรามีข้อบกพร่องและการถดถอยจริงซึ่งมักจะเกิดขึ้นเมื่อมีการโต้ตอบหน่วยไม่ใช่จากพฤติกรรมที่แยกได้ นี่เป็นเรื่องยากมากที่จะทดสอบในระดับหน่วยที่เราหยุดทำ TDD (ยกเว้นส่วนประกอบที่ทำให้การพัฒนาเร็วขึ้น) และใช้เวลาเพิ่มการครอบคลุมการทดสอบการรวมแทน ในขณะที่การทดสอบหน่วยขนาดเล็กไม่เคยตรวจจับข้อบกพร่องจริง ๆ และเป็นเพียงค่าบำรุงรักษา แต่การทดสอบการรวมนั้นคุ้มค่ากับความพยายาม ตอนนี้ฉันได้รับโปรเจ็กต์ใหม่และฉันสงสัยว่าจะลองทำอย่างไร มันเป็นแอพพลิเคชั่น C ++ / OpenGL ดั้งเดิมดังนั้นการทดสอบการรวมเข้าด้วยกันจึงไม่ใช่ทางเลือก แต่การทดสอบหน่วยใน C ++ นั้นค่อนข้างยากกว่าใน Java (คุณต้องทำสิ่งต่าง ๆ อย่างชัดเจนvirtual) และโปรแกรมไม่ได้เน้นวัตถุมากดังนั้นฉันจึงไม่สามารถเยาะเย้ย / ทำอะไรบางอย่างได้ ฉันไม่ต้องการแยกออกจากกันและ OO-ize ทุกสิ่งเพียงเพื่อเขียนการทดสอบเพื่อประโยชน์ในการเขียนการทดสอบ ดังนั้นฉันถามคุณ: ฉันควรเขียนทดสอบอะไร เช่น: ฟังก์ชั่น / คลาสที่ฉันคาดว่าจะเปลี่ยนบ่อย? ฟังก์ชั่น / คลาสที่ยากต่อการทดสอบด้วยตนเอง? ฟังก์ชั่น …

5
ฉันจะเริ่มต้นการทดสอบในการต่อต้านการทดสอบได้อย่างไร [ปิด]
ปิด คำถามนี้จะต้องมีมากขึ้นมุ่งเน้น ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้มุ่งเน้นที่ปัญหาเดียวโดยแก้ไขโพสต์นี้ ปิดให้บริการใน4 ปีที่แล้ว ฉันมีคำสารภาพที่ต้องทำ: การทดสอบอัตโนมัติอย่างเป็นทางการไม่ได้เป็นส่วนหนึ่งของพื้นฐานการเขียนโปรแกรมของฉัน ตอนนี้ฉันทำงานใน บริษัท ขนาดใหญ่ที่มีนักพัฒนาหลายคน (ส่วนใหญ่เป็นนักพัฒนาเว็บประเภทใดประเภทหนึ่ง) และเห็นได้ชัดว่าพวกเขาส่วนใหญ่ไม่ได้ทดสอบ * เช่นกัน (* ฉันจะไม่พูดต่อไปอย่างเป็นทางการโปรดสรุป) หากฉันรอรับการสนับสนุนจากองค์กรของฉันเพื่อเริ่มการทดสอบมันจะไม่เกิดขึ้น ถ้าฉันพยายามที่จะ "เปลี่ยนแปลงสิ่งต่าง ๆ จากภายใน" โดยการทดสอบการจัดการที่ฉันจะหมดแรงก่อนที่จะเกิดการเปลี่ยนแปลง ฉันต้องเริ่มการทดสอบตอนนี้ แต่ด้วย TDD และตระกูลของมันฉันจะจบลงด้วยรหัสการทดสอบมากมายพร้อมกับรหัสการผลิต ระบบควบคุมเวอร์ชันของเรา (รวมศูนย์ทั้งหมด) ไม่ได้จัดระเบียบไว้สำหรับการจัดเก็บรหัสทดสอบ ฉันจะต้องหาที่สำหรับทุกอย่างบนเวิร์กสเตชันของฉัน เป็นไปได้หรือไม่ที่จะเริ่มฝึกฝนการทดสอบซอฟต์แวร์ในวัฒนธรรมที่ไม่ได้ให้คุณค่าหรือจัดหาเครื่องมือสำหรับการทดสอบส่วนตัว? คุณใช้เทคนิคและเครื่องมือใดในการทดสอบเมื่อเครื่องมือและองค์กรอย่างเป็นทางการไม่มีที่สำหรับการทดสอบกรอบและระบบอัตโนมัติ
20 testing  tdd 

5
การทดสอบหน่วยนำไปสู่การวางนัยทั่วไปก่อนกำหนด (โดยเฉพาะในบริบทของ C ++) หรือไม่
บันทึกเบื้องต้น ฉันจะไม่เข้าไปในความแตกต่างของชนิดที่แตกต่างกันของการทดสอบมีมีอยู่แล้วไม่กี่คำถามในเว็บไซต์เหล่านี้เกี่ยวกับการที่ ฉันจะใช้สิ่งที่มีและที่กล่าวว่า: การทดสอบหน่วยในแง่ของ "การทดสอบหน่วยแยกได้ที่เล็กที่สุดของแอปพลิเคชัน"ซึ่งคำถามนี้มาจริง ปัญหาการแยกตัว คืออะไรหน่วย isolatable ที่เล็กที่สุดของโปรแกรม อย่างที่ฉันเห็นมันขึ้นอยู่กับว่าคุณกำลังใช้ภาษาอะไร Micheal Feathers พูดถึงแนวคิดของรอยต่อ : [WEwLC, p31] ตะเข็บเป็นสถานที่ที่คุณสามารถเปลี่ยนพฤติกรรมในโปรแกรมของคุณโดยไม่ต้องแก้ไขในสถานที่นั้น และโดยไม่ต้องลงรายละเอียดฉันเข้าใจตะเข็บ - ในบริบทของการทดสอบหน่วย - เป็นสถานที่ในโปรแกรมที่ "การทดสอบ" ของคุณสามารถเชื่อมต่อกับ "หน่วย" ของคุณ ตัวอย่าง การทดสอบหน่วย - โดยเฉพาะอย่างยิ่งใน C ++ ต้องการรหัสจากการทดสอบเพื่อเพิ่มตะเข็บเพิ่มเติมที่จะถูกเรียกอย่างเคร่งครัดสำหรับปัญหาที่ระบุ ตัวอย่าง: การเพิ่มอินเทอร์เฟซเสมือนซึ่งการใช้งานที่ไม่ใช่เสมือนจะเพียงพอ การแยก - การสรุป (?) - คลาส (เล็ก) เพิ่มเติม "เพียงแค่" เพื่ออำนวยความสะดวกในการเพิ่มการทดสอบ การแยกโครงการที่ดำเนินการได้ครั้งเดียวออกเป็น libs ที่ "อิสระ" ดูเหมือน …

2
ตัวอย่างการทดสอบหน่วยที่ดีสำหรับนักพัฒนา C ฝังตัว [ปิด]
ปิด. คำถามนี้เป็นคำถามปิดหัวข้อ ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ อัพเดตคำถามเพื่อให้เป็นหัวข้อสำหรับ Software Engineering Stack Exchange ปิดให้บริการใน6 ปีที่ผ่านมา ฉันจะพูดคุยกับแผนกของฉันในสัปดาห์หน้าเกี่ยวกับการทดสอบหน่วยและการพัฒนาที่เน้นการทดสอบ เป็นส่วนหนึ่งของเรื่องนี้ฉันจะแสดงตัวอย่างจริงจากรหัสบางอย่างที่ฉันเขียนเมื่อเร็ว ๆ นี้ แต่ฉันยังต้องการแสดงตัวอย่างง่ายๆที่ฉันจะเขียนในการพูดคุย ฉันค้นหาตัวอย่างที่ดีจากเว็บ แต่ฉันพยายามหาสิ่งที่เหมาะสมกับการพัฒนาของเราโดยเฉพาะ ซอฟต์แวร์เกือบทั้งหมดที่เราเขียนนั้นเป็นระบบควบคุมฝังตัวลึกที่ทำงานบนไมโครคอนโทรลเลอร์ขนาดเล็ก มีรหัส C จำนวนมากที่ใช้งานได้ง่ายกับการทดสอบหน่วย (ฉันจะพูดถึงการทดสอบหน่วยบนพีซีแทนที่จะเป็นเป้าหมายเอง) ตราบใดที่คุณยังไม่ชัดเจนในเลเยอร์ 'ก้น': สิ่งที่พูดถึงโดยตรง ไปยังอุปกรณ์ต่อพ่วงไมโครคอนโทรลเลอร์ อย่างไรก็ตามตัวอย่างส่วนใหญ่ที่ฉันพบมักใช้การประมวลผลแบบสตริง (เช่นตัวอย่างตัวเลข Dive Into Python เลขโรมันที่ยอดเยี่ยม) และเนื่องจากเราแทบจะไม่เคยใช้สตริงสิ่งนี้จึงไม่เหมาะ (เกี่ยวกับฟังก์ชันไลบรารีเท่านั้นโดยทั่วไปแล้วโค้ดของเราใช้ มีmemcpy, memcmpและmemset,strcat หรือนิพจน์ทั่วไปไม่ถูกต้อง) ดังนั้นในคำถาม: ทุกคนสามารถเสนอตัวอย่างที่ดีของฟังก์ชั่นที่ฉันสามารถใช้เพื่อสาธิตการทดสอบหน่วยในเซสชั่นสดได้หรือไม่? คำตอบที่ดีในความเห็น (อาจมีการเปลี่ยนแปลง) ของฉันอาจจะ: ฟังก์ชั่นที่เรียบง่ายพอที่ทุกคน (แม้กระทั่งผู้ที่เขียนโค้ดเป็นครั้งคราว) สามารถเข้าใจได้ ฟังก์ชั่นที่ไม่ปรากฏว่าไม่มีจุดหมาย (เช่นการทำพาริตีหรือซีอาร์ซีน่าจะดีกว่าฟังก์ชั่นที่คูณสองตัวเลขด้วยกันและเพิ่มค่าคงที่แบบสุ่ม); ฟังก์ชั่นที่สั้นพอที่จะเขียนต่อหน้าผู้คน (ฉันอาจใช้ประโยชน์จากคลิปบอร์ดมากมายของ …

8
ไฟล์เดียวหรือหลายไฟล์สำหรับการทดสอบหน่วยในชั้นเดียว?
ในการวิจัยการทดสอบแนวปฏิบัติที่ดีที่สุดเพื่อช่วยรวบรวมแนวทางสำหรับองค์กรของฉันฉันพบว่ามันดีกว่าหรือมีประโยชน์ในการแยกการทดสอบการทดสอบ (คลาสทดสอบ) หรือเพื่อทำการทดสอบทั้งหมดสำหรับคลาสเดียวในไฟล์เดียว Fwiw ฉันหมายถึง "การทดสอบหน่วย" ในความหมายที่บริสุทธิ์ว่าเป็นการทดสอบในกล่องสีขาวที่กำหนดเป้าหมายไปที่คลาสเดี่ยวหนึ่งการยืนยันต่อการทดสอบหนึ่งการอ้างอิงทั้งหมดที่ล้อเลียนเป็นต้น ตัวอย่างสถานการณ์เป็นคลาส (เรียกว่าเอกสาร) ที่มีสองวิธี: CheckIn และ CheckOut แต่ละวิธีใช้กฎต่าง ๆ ฯลฯ ที่ควบคุมพฤติกรรมของพวกเขา ตามกฎข้อหนึ่งต่อการทดสอบฉันจะมีการทดสอบหลายวิธีสำหรับแต่ละวิธี ฉันสามารถวางทั้งหมดของการทดสอบในครั้งเดียวDocumentTestsระดับที่มีชื่อชอบและCheckInShouldThrowExceptionWhenUserIsUnauthorizedCheckOutShouldThrowExceptionWhenUserIsUnauthorized หรือผมอาจจะมีสองชั้นทดสอบเฉพาะกิจการ: และCheckInShould CheckOutShouldในกรณีนี้ชื่อการทดสอบของฉันจะสั้นลง แต่พวกเขาจะจัดระเบียบเพื่อให้การทดสอบทั้งหมดสำหรับพฤติกรรมที่เฉพาะเจาะจง (วิธีการ) อยู่ด้วยกัน ฉันแน่ใจว่ามีทั้งของมืออาชีพและนักต้มตุ๋นที่จะเข้าใกล้และสงสัยว่าถ้าใครไปเส้นทางด้วยไฟล์หลาย ๆ ไฟล์และถ้าเป็นเช่นนั้นทำไม? หรือถ้าคุณเลือกวิธีการไฟล์เดียวทำไมคุณถึงรู้สึกว่ามันดีกว่า

4
การใช้การทดสอบหน่วยใน บริษัท ที่ไม่ได้ทำ
หัวหน้าฝ่ายพัฒนาซอฟต์แวร์ของ บริษัท ของฉันเพิ่ง "ลาออก" (ถูกไล่ออก) และตอนนี้เรากำลังมองหาวิธีปรับปรุงการพัฒนาที่ บริษัท ของเรา เราต้องการนำการทดสอบหน่วยในซอฟต์แวร์ทั้งหมดที่สร้างจากที่นี่ออก ข้อเสนอแนะจากนักพัฒนาคือ: เรารู้ว่าการทดสอบนั้นมีค่า แต่คุณเปลี่ยนสเปคอยู่เสมอดังนั้นมันจึงเป็นการเสียเวลา และกำหนดเวลาของคุณแน่นมากเราไม่มีเวลาเพียงพอที่จะทำการทดสอบ คำติชมจากประธานเจ้าหน้าที่บริหารคือ: ฉันต้องการให้ บริษัท ของเรามีการทดสอบอัตโนมัติ แต่ฉันไม่รู้ว่าจะทำให้มันเกิดขึ้นได้อย่างไร เราไม่มีเวลาเขียนเอกสารขนาดใหญ่ นักพัฒนาจะได้รับรายละเอียดในขณะนี้ได้อย่างไร เลื่อนคำจากปากหรือ PowerPoint เห็นได้ชัดว่าเป็นปัญหาใหญ่ คำแนะนำของฉันคือ: ให้ชุดข้อมูลการทดสอบและการทดสอบหน่วย นั่นคือสเป็ค ขึ้นอยู่กับการจัดการที่ชัดเจนและมีปริมาณเกี่ยวกับสิ่งที่ต้องการ นักพัฒนาสามารถใส่ฟังก์ชั่นอื่น ๆ ที่พวกเขารู้สึกว่าจำเป็นและไม่จำเป็นต้องได้รับการทดสอบ ถ้าคุณเคยอยู่ใน บริษัท ที่อยู่ในสถานการณ์เช่นนี้คุณจะแก้ปัญหาอย่างไร วิธีนี้ดูสมเหตุสมผลหรือไม่?
19 unit-testing  tdd 

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

7
abstractions ต้องลดการอ่านรหัสหรือไม่?
ผู้พัฒนาที่ดีที่ฉันทำงานด้วยบอกกับฉันเมื่อเร็ว ๆ นี้เกี่ยวกับความยากลำบากบางอย่างที่เขามีในการใช้คุณสมบัติในโค้ดบางตัวที่เราได้รับมา เขากล่าวว่าปัญหาคือรหัสนั้นยากที่จะปฏิบัติตาม จากนั้นฉันมองลึกเข้าไปในผลิตภัณฑ์และรู้ว่ามันยากแค่ไหนที่จะเห็นเส้นทางของโค้ด มันใช้อินเทอร์เฟซและเลเยอร์นามธรรมมากมายที่พยายามเข้าใจว่าสิ่งที่เริ่มต้นและสิ้นสุดนั้นค่อนข้างยาก มันทำให้ฉันคิดถึงเวลาที่ฉันได้ดูโครงการที่ผ่านมา (ก่อนที่ฉันจะทราบถึงหลักการของโค้ดที่สะอาด) และพบว่ามันยากมากที่จะได้รับในโครงการส่วนใหญ่เป็นเพราะเครื่องมือนำทางรหัสของฉัน จะต้องใช้ความพยายามเป็นพิเศษในการค้นหาการใช้งานที่เป็นรูปธรรมหรือสิ่งที่มีสายในสถาปัตยกรรมประเภทปลั๊กอินบางอย่าง ฉันรู้ว่านักพัฒนาบางคนหันมาใช้ถังบรรจุแบบพึ่งพาอย่างเคร่งครัดด้วยเหตุผลนี้ มันทำให้เส้นทางของซอฟต์แวร์สับสนจนความยากในการนำทางรหัสเพิ่มขึ้นแบบทวีคูณ คำถามของฉันคือ: เมื่อกรอบงานหรือรูปแบบนำเสนอค่าใช้จ่ายมากเช่นนี้มันจะคุ้มหรือไม่ มันเป็นอาการของรูปแบบการใช้งานที่ไม่ดีหรือไม่? ฉันเดาว่าผู้พัฒนาควรดูภาพรวมของสิ่งที่นามธรรมนำมาสู่โครงการเพื่อช่วยให้พวกเขาผ่านพ้นความยุ่งยาก โดยปกติแล้วมันยากที่จะทำให้พวกเขาเห็นภาพรวมขนาดใหญ่ ฉันรู้ว่าฉันไม่สามารถขายความต้องการของ IOC และ DI ด้วย TDD สำหรับนักพัฒนาเหล่านั้นการใช้เครื่องมือเหล่านั้นทำให้การอ่านโค้ดเป็นเรื่องลำบากมากเกินไป

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