คำถามติดแท็ก unit-testing

การทดสอบหน่วยเป็นวิธีการที่แต่ละหน่วยของรหัสที่มาจะถูกทดสอบเพื่อตรวจสอบว่าพวกเขาจะเหมาะสำหรับการใช้งาน

2
ฉันควรจะทดสอบคลาสย่อยหรือคลาสแม่นามธรรมของฉันหรือไม่
ฉันมีโครงร่างการใช้งานเช่นเดียวกับข้อ 18 จาก Effective Java (การอภิปรายเพิ่มเติมที่นี่ ) มันเป็นคลาสนามธรรมที่มีวิธีการสาธารณะ 2 วิธี methodA () และ methodB () ที่เรียกวิธีการ subclasses เพื่อ "เติมช่องว่าง" ที่ฉันไม่สามารถกำหนดในลักษณะที่เป็นนามธรรม ฉันพัฒนาก่อนโดยการสร้างคลาสที่เป็นรูปธรรมและเขียนการทดสอบหน่วยสำหรับมัน เมื่อชั้นสองมาฉันสามารถแยกพฤติกรรมทั่วไปใช้ "ช่องว่างที่หายไป" ในชั้นสองและมันก็พร้อม (แน่นอนการทดสอบหน่วยถูกสร้างขึ้นสำหรับคลาสย่อยที่สอง) เวลาผ่านไปและตอนนี้ฉันมี 4 คลาสย่อยแต่ละการใช้งาน 3 วิธีการป้องกันแบบสั้นที่เฉพาะเจาะจงกับการใช้งานที่เป็นรูปธรรมของพวกเขาในขณะที่การใช้โครงร่างทำหน้าที่ทั่วไปทั้งหมด ปัญหาของฉันคือเมื่อฉันสร้างการใช้งานใหม่ฉันเขียนการทดสอบอีกครั้ง: คลาสย่อยเรียกวิธีตามที่กำหนดหรือไม่? วิธีการที่กำหนดมีคำอธิบายประกอบที่กำหนดหรือไม่ ฉันจะได้รับผลลัพธ์ที่คาดหวังจากวิธีการ A หรือไม่ ฉันจะได้รับผลลัพธ์ที่คาดหวังจากวิธีการ B หรือไม่ ในขณะที่เห็นข้อดีด้วยวิธีนี้: เป็นเอกสารข้อกำหนดของคลาสย่อยผ่านการทดสอบ มันอาจล้มเหลวอย่างรวดเร็วในกรณีที่มีการปรับโครงสร้างที่มีปัญหา ทดสอบคลาสย่อยโดยรวมและสาธารณะ API ("methodA () ทำงานอย่างไร" และไม่ "วิธีนี้ได้รับการป้องกันหรือไม่") ปัญหาที่ฉันมีคือการทดสอบสำหรับคลาสย่อยใหม่นั้นไม่ใช่เกมง่ายๆ: …

3
การทดสอบหน่วยยืนยันเดียวไม่ทำลายหลักการ DRY หรือไม่
เมื่อใดก็ตามที่ฉันเขียนการทดสอบหน่วยฉันมักจะพยายามยืนยันเพียงครั้งเดียวต่อการทดสอบเพื่อให้การดีบักง่ายขึ้นเมื่อการทดสอบล้มเหลว อย่างไรก็ตามเมื่อฉันทำตามกฎนี้ฉันรู้สึกว่าฉันกำลังคัดลอกรหัสเดียวกันในการทดสอบแต่ละครั้งอย่างต่อเนื่องและด้วยการทดสอบเพิ่มเติมมันจะยากที่จะกลับไปอ่านและบำรุงรักษา ดังนั้นการทดสอบแบบยืนยันเพียงครั้งเดียวจึงเป็นการละเมิด DRY หรือไม่ และมีกฎที่ดีหรือไม่ที่จะต้องปฏิบัติตามเพื่อหาสมดุลที่ดีเช่นเดียวกับการทดสอบหนึ่งวิธีต่อหนึ่งวิธี * * ฉันรู้ว่าอาจไม่ได้มีขนาดเดียวที่เหมาะกับการแก้ปัญหาทั้งหมดนี้ แต่มีวิธีแนะนำให้ใช้วิธีนี้หรือไม่

5
วิธีการทดสอบไฟล์ jsp
ฉันกำลังพัฒนาแอปพลิเคชัน Java 6 EE และฉันกำลังทดสอบรหัส jsp ของฉันกับอีกอันหนึ่งด้วยเวอร์ชันการทดสอบของการเรียกใช้ฟังก์ชั่นและรหัสที่ใช้ในแอปพลิเคชันดั้งเดิม แต่ดูเหมือนจะหลวมและใช้งานไม่ได้ มีวิธีที่ดีในการทำแบบทดสอบนี้หรือไม่?

5
RSpec และแตงกวาคุ้มค่าหรือไม่
ฉันรู้ว่าโปรแกรมเมอร์ของ RoR ส่วนใหญ่กำลังทดสอบผู้ติดยาและฉันเข้าใจถึงข้อดีของชุดทดสอบขนาดใหญ่ แต่เมื่อฉันเริ่มการทดสอบฉันไม่เคยได้รับชุดใหญ่ดังกล่าวและฉันมักจะสงสัยว่า "ฉันกำลังทดสอบวิธีที่ถูกต้องหรือไม่ ฉันมักจะเกี่ยวข้องกับการทดสอบการรวมการทดสอบเฉพาะวิธีที่แอปพลิเคชันทำงาน ก่อนอื่นการทดสอบคุ้มค่าหรือไม่ ฉันหมายถึงเวลาที่ใช้ในการทดสอบการเขียนคุ้มค่าหรือไม่ จากนั้นฉันใช้ RSpec ฉันเพิ่งค้นพบแตงกวาใช้มันซักพัก แต่ฉันไม่รู้ว่าการเขียนทุกขั้นตอนเหล่านี้คุ้มค่าหรือไม่ ฉันรู้ว่าฉันสามารถนำขั้นตอนมาใช้ใหม่ได้ แต่ฉันไม่เคยรู้เลยว่าขั้นตอนเหล่านี้สมบูรณ์เกินไปหรือไม่: ตัวอย่างเช่นฉันใช้Given I am logged in as (.+)แต่ฉันไม่รู้ว่าต้องพูดในคำจำกัดความของมันหรือไม่Given there's a user called $1เพราะสามารถสร้างผู้ใช้ซ้ำได้ แต่นั่นก็ไม่คุ้มค่าที่จะก้าวไปก่อนGiven I am logged in as (.+)เสมอ มันเป็นโค้ดจำนวนมากที่ไม่ค่อยจะมีประโยชน์ ฉันเดาว่าไม่มีข้อผิดพลาดใหม่ ๆ ในส่วนที่ทดสอบทุกวัน ... แตงกวาคุ้มค่าจริง ๆ เมื่อเทียบกับ RSpec หรือไม่

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

2
การทดสอบ - ฐานข้อมูลในหน่วยความจำเทียบกับการเยาะเย้ย
เมื่อเขียนการทดสอบทำไมบางคนต้องการใช้ฐานข้อมูลในหน่วยความจำมากกว่าเพียงการล้อเลียนข้อมูล ฉันเห็นว่าฐานข้อมูลในหน่วยความจำอาจมีประโยชน์สำหรับการทดสอบคลังเก็บของ แต่ถ้าใช้เฟรมเวิร์ก (เช่น Spring Data) การทดสอบที่เก็บจะเป็นการทดสอบเฟรมเวิร์กไม่ใช่ตรรกะแอปพลิเคชัน อย่างไรก็ตามการเยาะเย้ยดูเหมือนจะเร็วและเป็นไปตามรูปแบบเดียวกันกับที่ใช้โดยทั่วไปเมื่อเขียนการทดสอบหน่วยและ TDD แล้วฉันจะพลาดอะไรไป? ฐานข้อมูลในหน่วยความจำจะมีประโยชน์เมื่อใด / ทำไม?

2
การทดสอบหน่วยเพื่อทดสอบการสร้างวัตถุโดเมน
ฉันมีการทดสอบหน่วยซึ่งมีลักษณะดังนี้: [Test] public void Should_create_person() { Assert.DoesNotThrow(() => new Person(Guid.NewGuid(), new DateTime(1972, 01, 01)); } ฉันยืนยันว่ามีการสร้างวัตถุบุคคลที่นี่เช่นการตรวจสอบความถูกต้องจะไม่ล้มเหลว ตัวอย่างเช่นหาก Guid เป็นโมฆะหรือวันเดือนปีเกิดเร็วกว่า 01/01/1900 การตรวจสอบจะล้มเหลวและข้อยกเว้นจะถูกโยนทิ้ง (หมายถึงการทดสอบล้มเหลว) ตัวสร้างมีลักษณะดังนี้: public Person(Id id, DateTime dateOfBirth) : base(id) { if (dateOfBirth == null) throw new ArgumentNullException("Date of Birth"); elseif (dateOfBith < new DateTime(1900,01,01) throw new ArgumentException("Date of Birth"); …

3
วิธีจัดการพารามิเตอร์ส่วนกลางอย่างถูกต้องสำหรับการทดสอบหน่วยในงูใหญ่?
เรากำลังใช้อัลกอริทึมมากมายซึ่งโดยทั่วไปจะมีพารามิเตอร์ที่แชร์สาธารณะรู้จักและความปลอดภัย ปัจจุบันเราใช้คลาสที่เก็บพารามิเตอร์ทั้งหมดและวัตถุโกลบอลที่กำหนดไว้ล่วงหน้าสองรายการ: class PublicParams(object): p = q = 0 def __init__(self, p, q): self.p = p self.q = q # used for tests publicParams_test = PublicParams(15,7) # Some 2048 bit numbers for example publicParams_secure = PublicParams(128378947298374928374,128378947298374928374) จากนั้นอัลกอริธึมนำPublicParamsวัตถุเป็นอาร์กิวเมนต์ที่เป็นค่าเริ่มต้นไปยังการผลิตpublicParams_secure def AlgoOne(n, publicParams = publicParams_secure): # do stuff with publicParams.p # ... AlgoTwo(x, …

2
การทดสอบอัลกอริธึม (แบบกำหนดค่าได้) ที่มีหลายหรือยากที่จะพิสูจน์คำตอบที่ถูกต้อง
ผมอยากจะเขียนคำนำที่นี้คำถามจะคล้ายกัน แต่คำถามของฉันไม่ได้เกี่ยวข้องกับการสุ่มเพียง determinism จู้จี้จุกจิกดังนั้นคำตอบของ "ใช้เมล็ดพันธุ์ที่รู้จักกัน" ไม่ได้จริงๆใช้ ในทำนองเดียวกันนี้เป็นคำถามที่คล้ายกันอีกครั้ง แต่ผมไม่ได้คาดหวังว่าอัลกอริทึมที่เคยล้มเหลว - ผมก็ไม่ทราบว่าวิธีที่มันจะถูกต้อง คำถามนี้เกิดขึ้นขณะทดสอบอัลกอริธึมกราฟ แต่ไม่มีข้อ จำกัด สำหรับพวกเขา อัลกอริทึมบางอย่างเช่น A * สามารถมีคำตอบที่ถูกต้องได้หลายคำตอบ คุณอาจได้รับคำตอบอย่างใดอย่างหนึ่งซึ่งขึ้นอยู่กับการใช้งานจริงของคุณ สิ่งนี้สามารถทำให้พวกเขาทดสอบได้ยากเพราะคุณไม่รู้ว่ามันกำลังคายแบบไหนก่อนและใช้เวลานานมากในการคำนวณคำตอบด้วยมือ ในกรณีเฉพาะของฉันฉันได้รับมันโดยการปรับเปลี่ยน Floyd-Warshall เพื่อคายเส้นทางที่สั้นที่สุดเท่าที่จะทำได้และใช้เวลาทดสอบมือ มันมีประโยชน์ในการเป็นคุณสมบัติที่ดีในสิทธิของตนเอง จากนั้นฉันสามารถทดสอบฟังก์ชั่นอื่น ๆ ในแง่ของเส้นทางที่ถูกต้องที่ทราบจาก FW (หากเส้นทางที่ถูกส่งคืนเป็นเส้นทางใดเส้นทางหนึ่งที่ส่งคืนโดย FW สำหรับคู่เริ่มต้น / สิ้นสุดนั้นถูกต้อง) แน่นอนว่าใช้งานได้กับกราฟที่มีความหนาแน่นสูงเท่านั้นเนื่องจาก FW ทำงานอย่างไร แต่ก็ยังดีอยู่ อย่างไรก็ตามอาจไม่สามารถใช้ได้กับอัลกอริทึมทั้งหมดที่มีคุณสมบัตินี้ จนถึงตอนนี้คำตอบที่ดีที่สุดที่ฉันพบคือการทดสอบลักษณะของคำตอบที่ถูกต้องมากกว่าคำตอบที่ถูกต้อง หากต้องการย้อนกลับไปยังอัลกอริธึมพา ธ ที่สั้นที่สุดคุณสามารถตรวจสอบค่าใช้จ่ายของเส้นทางที่ส่งคืนเทียบกับต้นทุนที่ถูกต้องที่ทราบและตรวจสอบให้แน่ใจว่าเส้นทางนั้นถูกต้อง งานนี้ แต่ก็สามารถใช้ความเสี่ยงของการไม่ตรวจสอบทุกอย่างอย่างถูกต้องตามเกณฑ์ที่มากขึ้นสำหรับความถูกต้องมีโดยเฉพาะอย่างยิ่งถ้าการตรวจสอบเป็นตัวเองที่ซับซ้อน (เช่นในขณะที่ขั้นตอนวิธีการที่ถูกต้องมีอยู่การตรวจสอบขั้นต่ำต้นไม้ทอดเป็นปัญหาหนักที่รู้จักกัน; อาจจะหนักกว่า การสร้าง MST เอง) ซึ่งในกรณีนี้คุณต้องทดสอบรหัสการทดสอบของคุณอย่างกว้างขวาง …

3
วิธีการจำลองวิธีด้วยวัตถุที่มีการเข้ารหัสยาก?
ฉันกำลังทำงานกับแอพพลิเคชั่นที่มีหลายเลเยอร์ ชั้นการเข้าถึงข้อมูลเพื่อดึงและบันทึกข้อมูลจากแหล่งข้อมูลตรรกะทางธุรกิจเพื่อจัดการข้อมูลส่วนติดต่อผู้ใช้เพื่อแสดงข้อมูลบนหน้าจอ ฉันยังทำการทดสอบหน่วยของชั้นตรรกะทางธุรกิจด้วย ข้อกำหนดเพียงอย่างเดียวคือการทดสอบการไหลของตรรกะเลเยอร์ธุรกิจ ดังนั้นฉันจึงใช้ Moq framework เพื่อจำลองชั้นการเข้าถึงข้อมูลและหน่วยทดสอบชั้นตรรกะทางธุรกิจด้วยหน่วย MS ฉันใช้การเขียนโปรแกรมอินเทอร์เฟซเพื่อทำให้การออกแบบลดลงมากที่สุดเพื่อให้การทดสอบหน่วยสามารถทำได้ ชั้นการเข้าถึงข้อมูลชั้นธุรกิจโทรผ่านส่วนต่อประสาน ฉันกำลังประสบปัญหาเมื่อฉันพยายามทดสอบหนึ่งในวิธีการตรรกะทางธุรกิจ วิธีการนั้นจะทำงานและสร้างวัตถุและส่งต่อไปยัง data access layer เมื่อฉันพยายามที่จะเยาะเย้ยวิธีการเข้าถึงข้อมูลเลเยอร์แล้วก็ไม่สามารถจำลองได้สำเร็จ ที่นี่ฉันพยายามสร้างรหัสตัวอย่างเพื่อแสดงปัญหาของฉัน รุ่น: public class Employee { public string Name { get; set; } } ชั้นการเข้าถึงข้อมูล: public interface IDal { string GetMessage(Employee emp); } public class Dal : IDal { public string GetMessage(Employee emp) …

10
เครื่องมือ / คำแนะนำเกี่ยวกับวิธีการปฏิเสธอาร์กิวเมนต์คุณภาพของรหัสครอบคลุม
ตอนนี้ฉันรู้ว่าผู้คนสามารถพิจารณาคำถามนี้ซ้ำหรือถามหลายครั้งในกรณีนี้ฉันจะขอบคุณลิงก์ไปยังคำถามที่เกี่ยวข้องพร้อมคำตอบสำหรับคำถามของฉัน เมื่อเร็ว ๆ นี้ฉันไม่เห็นด้วยกับบางคนเกี่ยวกับการครอบคลุมโค้ด ฉันมีกลุ่มคนที่ต้องการให้ทีมงานของเราลดการมองการครอบคลุมโค้ดทั้งหมดโดยอ้างว่าการครอบคลุม 100% ไม่ได้หมายถึงการทดสอบคุณภาพที่ดีและรหัสคุณภาพดี ฉันสามารถผลักดันกลับได้โดยการขายอาร์กิวเมนต์ที่ Code Coverage บอกฉันว่ายังไม่ได้ทดสอบอย่างแน่นอนและช่วยให้เรามุ่งเน้นไปที่พื้นที่เหล่านั้น (ข้างต้นได้รับการกล่าวถึงในลักษณะคล้ายกันในคำถาม SO อื่น ๆ เช่นนี้ - /programming/695811/pitfalls-of-code-coverage ) ข้อโต้แย้งจากคนเหล่านี้คือ - จากนั้นทีมจะตอบสนองโดยการสร้างการทดสอบคุณภาพต่ำอย่างรวดเร็วและทำให้เสียเวลาโดยไม่เพิ่มคุณภาพที่สำคัญ ในขณะที่ผมเข้าใจมุมมองของผมกำลังมองหาวิธีที่จะทำให้เป็นกรณีที่แข็งแกร่งมากขึ้นสำหรับความคุ้มครองรหัสโดยการแนะนำเครื่องมือที่มีประสิทธิภาพมากขึ้น / (Functional, Statement,Decision, Branch, Condition, State, LCSAJ, path, jump path, entry/exit, Loop, Parameter Value etc)กรอบที่ดูแลเกณฑ์ที่ครอบคลุมมากขึ้น สิ่งที่ฉันกำลังมองหาคือข้อเสนอแนะสำหรับการรวมกันของเครื่องมือครอบคลุมรหัสและการปฏิบัติ / กระบวนการที่จะไปกับพวกเขาซึ่งสามารถช่วยฉันตอบโต้ข้อโต้แย้งดังกล่าวในขณะที่รู้สึกสะดวกสบายกับคำแนะนำของฉัน ฉันยังยินดีรับฟังความคิดเห็น / ข้อเสนอแนะใด ๆ ที่ยึดตามประสบการณ์ / ความรู้ของคุณเกี่ยวกับวิธีการโต้แย้งเช่นกันเพราะในขณะที่อัตนัยการครอบคลุมโค้ดได้ช่วยให้ทีมของฉันตระหนักถึงคุณภาพของรหัสและคุณค่าของการทดสอบมากขึ้น แก้ไข: เพื่อลดความสับสนเกี่ยวกับการเข้าใจจุดอ่อนของการครอบคลุมโค้ดทั่วไปฉันต้องการชี้ให้เห็นว่าฉันไม่ได้อ้างถึงเครื่องมือ …

3
การเยาะเย้ยระดับคอนกรีต - ไม่แนะนำ
ฉันเพิ่งอ่านข้อความที่ตัดตอนมาจากหนังสือ "Growing Object-Oriented Software" ซึ่งอธิบายเหตุผลบางอย่างว่าทำไมไม่แนะนำให้ใช้การล้อเลียนระดับคอนกรีต นี่คือตัวอย่างโค้ดของการทดสอบหน่วยสำหรับคลาส MusicCentre: public class MusicCentreTest { @Test public void startsCdPlayerAtTimeRequested() { final MutableTime scheduledTime = new MutableTime(); CdPlayer player = new CdPlayer() { @Override public void scheduleToStartAt(Time startTime) { scheduledTime.set(startTime); } } MusicCentre centre = new MusicCentre(player); centre.startMediaAt(LATER); assertEquals(LATER, scheduledTime.get()); } } และคำอธิบายแรกของเขา: ปัญหาด้วยวิธีนี้คือมันทิ้งความสัมพันธ์ระหว่างวัตถุโดยนัย ฉันหวังว่าเราได้ทำให้ชัดเจนแล้วในตอนนี้ความตั้งใจของการพัฒนาขับเคลื่อนทดสอบกับวัตถุจำลองคือการค้นพบความสัมพันธ์ระหว่างวัตถุ …

3
ฉันจะวาดเส้นแบ่งระหว่างการทดสอบหน่วยและการทดสอบการรวมได้อย่างไร พวกเขาควรจะแยกจากกัน?
ฉันมีกรอบ MVC ขนาดเล็กที่ฉันทำงานอยู่ มันคือฐานรหัสไม่ใช่เรื่องใหญ่ แต่มันก็ไม่ได้มีแค่สองสามชั้น ในที่สุดฉันก็ตัดสินใจที่จะกระโดดและเริ่มเขียนแบบทดสอบ (ใช่ฉันรู้ว่าฉันควรจะทำอย่างนั้นมาตลอด แต่มันก็ API ไม่เสถียรอย่างยิ่งจนถึงตอนนี้) อย่างไรก็ตามแผนของฉันคือทำให้ง่ายมากในการทดสอบรวมถึงการทดสอบการรวม ตัวอย่างการทดสอบการรวมตัวจะเป็นไปตามบรรทัดเหล่านี้: วัตถุคำขอ HTTP ปลอม -> กรอบงาน MVC -> วัตถุตอบกลับ HTTP -> ตรวจสอบว่าการตอบสนองนั้นถูกต้อง เพราะนี่เป็นสิ่งที่ทำได้โดยไม่ต้องใช้เครื่องมือพิเศษ (เบราว์เซอร์อัตโนมัติเป็นต้น) ฉันสามารถทำได้ด้วยกรอบการทดสอบตามปกติ (ฉันใช้ NUnit) ตอนนี้คำถามใหญ่ ฉันจะวาดเส้นแบ่งระหว่างการทดสอบหน่วยและการทดสอบการรวมได้ที่ไหน ฉันควรทดสอบทีละชั้น (มากที่สุดเท่าที่จะทำได้) ด้วยการทดสอบหน่วย? ควรวางการทดสอบการรวมในโครงการทดสอบเดียวกันกับโครงการทดสอบหน่วยของฉันหรือไม่

3
ฉันสามารถใช้เหตุผลอะไรในการ "ขาย" แนวคิด BDD ให้กับทีมที่ไม่เต็มใจยอมรับมัน
ฉันเป็นแกนนำของวิธีการขับเคลื่อนการพัฒนาพฤติกรรม (BDD) ฉันใช้ BDD มาสองสามปีแล้วและได้ปรับใช้StoryQเป็นกรอบทางเลือกของฉันเมื่อพัฒนาแอพพลิเคชั่น DotNet แม้ว่าฉันได้ทำการทดสอบหน่วยมาหลายปีแล้วและก่อนหน้านี้ได้เปลี่ยนวิธีการทดสอบเป็นครั้งแรก แต่ฉันก็พบว่าฉันได้รับประโยชน์มากขึ้นจากการใช้กรอบการทำงานของ BDD เนื่องจากการทดสอบของฉันจับความต้องการของความต้องการค่อนข้าง ชัดเจนภาษาอังกฤษภายในรหัสของฉันและเนื่องจากการทดสอบของฉันสามารถดำเนินการยืนยันหลายโดยไม่สิ้นสุดการทดสอบครึ่งทาง - หมายถึงฉันสามารถดูว่าการยืนยันที่เฉพาะเจาะจงผ่าน / ล้มเหลวได้อย่างรวดเร็วโดยไม่ต้องแก้จุดบกพร่องเพื่อพิสูจน์มัน นี่เป็นส่วนเล็ก ๆ ของภูเขาน้ำแข็งสำหรับฉันอย่างที่ฉันสังเกตเห็นว่าฉันสามารถดีบักทั้งรหัสทดสอบและการติดตั้งในลักษณะที่ตรงเป้าหมายมากขึ้นด้วยผลลัพธ์ที่ทำให้ประสิทธิภาพการทำงานของฉันเติบโตขึ้นอย่างมีนัยสำคัญ กำหนดได้อย่างง่ายดายว่ามีข้อผิดพลาดเกิดขึ้นที่ใดหากมีปัญหาเกิดขึ้นเพื่อให้สามารถสร้างการรวมได้เนื่องจากเอาท์พุทที่เข้าสู่บันทึกการสร้าง นอกจากนี้ StoryQ api มีไวยากรณ์ที่ไพเราะน่ารักซึ่งง่ายต่อการเรียนรู้และสามารถนำไปใช้ได้หลายวิธีโดยไม่ต้องพึ่งพาภายนอกเพื่อใช้งาน ดังนั้นด้วยผลประโยชน์ทั้งหมดนี้คุณจะคิดว่ามันง่ายที่จะแนะนำแนวคิดให้กับทีมอื่น ๆ น่าเสียดายที่สมาชิกในทีมคนอื่น ๆ ยังลังเลที่จะดู StoryQ เพื่อประเมินมันอย่างถูกต้อง (ให้ความบันเทิงกับความคิดในการใช้ BDD) และเชื่อมั่นซึ่งกันและกันเพื่อลองและลบองค์ประกอบของ StoryQ ออกจากกรอบการทดสอบหลักของเราเอง แม้ว่าในตอนแรกพวกเขาจะสนับสนุนการใช้ StoryQ และแม้ว่ารหัสที่พวกเขาต้องการลบจะไม่ส่งผลกระทบต่อส่วนอื่น ๆ ของระบบการทดสอบของเรา การทำเช่นนั้นจะเป็นการเพิ่มปริมาณงานโดยรวมอย่างมีนัยสำคัญและขัดต่อธัญพืชจริง ๆ เพราะฉันเชื่อมั่นในประสบการณ์จริงว่าเป็นวิธีที่ดีกว่าในการทำงานในลักษณะการทดสอบครั้งแรกในสภาพแวดล้อมการทำงานเฉพาะของเราและสามารถนำไปสู่ การปรับปรุงคุณภาพของซอฟต์แวร์ของเราเนื่องจากฉัน เราพบว่าง่ายต่อการติดกับการทดสอบครั้งแรกโดยใช้ BDD เพื่อชี้แจงเพิ่มเติมส่วนใหญ่ของการทดสอบหน่วยที่เรามีแนวโน้มที่จะค่อนข้างเปราะบางและยากที่จะรักษาเป็นโฮลดิ้งจากปีของการทดสอบที่ใช้ไม่ดีที่ไม่เต็มใจที่จะยึดติดกับกระบวนการทดสอบขับเคลื่อนได้เห็นนักพัฒนาถอยกลับ ทำการทดสอบทั้งหมดเมื่อสิ้นสุดโครงการ (บุคคลเดียวกันนี้อ้างว่าเป็น Agile!) …

5
ตกลงเพื่อทำซ้ำรหัสสำหรับการทดสอบหน่วยหรือไม่
ฉันเขียนอัลกอริธึมการเรียงลำดับสำหรับการกำหนดชั้นเรียนและฉันยังได้เขียนการทดสอบบางอย่างเพื่อให้แน่ใจว่าอัลกอริทึมนั้นได้ดำเนินการอย่างถูกต้อง การทดสอบของฉันมีความยาวเพียง 10 บรรทัดและมี 3 ในนั้น แต่เพียง 1 บรรทัดที่เปลี่ยนแปลงระหว่าง 3 ดังนั้นจึงมีรหัสซ้ำจำนวนมาก มันจะดีกว่าที่จะ refactor รหัสนี้เป็นวิธีอื่นที่เรียกว่าจากการทดสอบแต่ละครั้งหรือไม่ ฉันจะไม่ต้องเขียนแบบทดสอบอื่นเพื่อทดสอบการเปลี่ยนโครงสร้างหรือไม่? ตัวแปรบางตัวสามารถเลื่อนขึ้นไปถึงระดับคลาสได้ การทดสอบคลาสและวิธีการควรเป็นไปตามกฎเดียวกันกับคลาส / วิธีการปกติหรือไม่ นี่คือตัวอย่าง: [TestMethod] public void MergeSortAssertArrayIsSorted() { int[] a = new int[1000]; Random rand = new Random(DateTime.Now.Millisecond); for(int i = 0; i < a.Length; i++) { a[i] = rand.Next(Int16.MaxValue); } int[] b …

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