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

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

3
หน่วยทดสอบคลาสที่ใช้ DI โดยไม่ต้องทดสอบภายใน
ฉันมีชั้นเรียนซึ่งได้รับการปรับโครงสร้างใหม่ใน 1 ชั้นหลักและชั้นเรียนขนาดเล็ก 2 ชั้น คลาสหลักใช้ฐานข้อมูล (เหมือนคลาสของฉัน) และส่งอีเมล ดังนั้นคลาสหลักจะมีIPersonRepositoryและแบบIEmailRepositoryที่เขาส่งไปยังคลาสที่เล็กกว่า 2 คลาส ตอนนี้ฉันต้องการทดสอบหน่วยหลักและเรียนรู้ที่จะไม่คัดลอกงานภายในของชั้นเรียนเพราะเราควรจะสามารถเปลี่ยนงานภายในโดยไม่ต้องทำการทดสอบหน่วย แต่เป็นชั้นใช้IPersonRepositoryและIEmailRepositoryผมมีการระบุ (จำลอง / จำลอง) IPersonRepositoryผลการค้นหาสำหรับวิธีการบางอย่างสำหรับ คลาสหลักจะคำนวณข้อมูลบางส่วนตามข้อมูลที่มีอยู่และส่งคืนข้อมูลนั้น ถ้าฉันต้องการทดสอบสิ่งนั้นฉันไม่เห็นว่าฉันจะเขียนแบบทดสอบได้อย่างไรโดยไม่ระบุว่าIPersonRepository.GetSavingsByCustomerIdผลตอบแทน x แต่จากนั้นการทดสอบหน่วยของฉัน 'รู้' เกี่ยวกับงานภายในเพราะ 'รู้' ว่าวิธีไหนที่จะเยาะเย้ยและไม่ทำ ฉันจะทดสอบคลาสที่ฉีดการพึ่งพาโดยไม่ต้องทดสอบรู้เกี่ยวกับ internals ได้อย่างไร พื้นหลัง: จากประสบการณ์ของฉันการทดสอบจำนวนมากเช่นนี้สร้าง mocks สำหรับที่เก็บข้อมูลจากนั้นให้ข้อมูลที่ถูกต้องสำหรับ mocks หรือทดสอบว่ามีการเรียกเมธอดเฉพาะระหว่างการดำเนินการหรือไม่ ทั้งสองวิธีการทดสอบรู้เกี่ยวกับ internals ตอนนี้ฉันได้เห็นการนำเสนอเกี่ยวกับทฤษฎี (ซึ่งฉันเคยได้ยินมาก่อน) ว่าการทดสอบไม่ควรรู้เกี่ยวกับการนำไปใช้ ก่อนอื่นเพราะคุณไม่ได้ทดสอบวิธีการทำงาน แต่ยังเพราะเมื่อคุณเปลี่ยนการใช้งานการทดสอบหน่วยทั้งหมดล้มเหลวเพราะพวกเขา 'รู้' เกี่ยวกับการใช้งาน ในขณะที่ฉันชอบแนวคิดของการทดสอบที่ไม่รู้ว่าจะนำไปใช้อย่างไรฉันก็ไม่รู้ว่าจะทำอย่างไร

2
ความแตกต่างระหว่างการทดสอบกับข้อมูลจำเพาะ
ฉันมีปัญหาเกี่ยวกับแนวคิด ณ จุดนี้และฉันไม่สามารถหาข้อมูลใด ๆ เกี่ยวกับความแตกต่างระหว่างการทดสอบ (UnitTest ฯลฯ ) เทียบกับ Spec (Rspec ฯลฯ ) เท่าที่ฉันรู้รายละเอียดคือการทดสอบการรวมและการทดสอบเป็น UnitTest แต่เพียงแค่นั้น คุณช่วยอธิบายความแตกต่างได้อย่างไร

2
ทำไมคุณสมบัติการทดสอบหน่วยมักจะต้องมีวิธีการสาธารณะ?
ฉันเพิ่งสังเกตเห็นว่าการเพิ่ม [TestInitialize] ไปยังวิธีการที่ได้รับการป้องกันในชุดประกอบ. NET ไม่ได้รับความเคารพ แต่ถ้าฉันทำวิธีการแบบสาธารณะ ฉันสังเกตเห็นหลายครั้งในอดีตด้วยวิธีการทดสอบ เทคนิคการพูดมันเป็นเรื่องง่ายที่จะสะท้อนให้เห็นถึงวิธีการส่วนตัวเป็นวิธีสาธารณะ ตามความเป็นจริงแล้วการไตร่ตรองเป็นวิธีที่ใช้ในการทดสอบหน่วยวิธีส่วนตัว เหตุใดฉันจึงต้องทำให้วิธีการทดสอบหน่วยของฉันเป็นแบบสาธารณะทั้งหมด

3
การแข่งขันทดสอบหน่วย
นายจ้างของฉันใช้การแข่งขันแบบทดสอบรายวัน หนึ่งวันเต็มจะทุ่มเทให้กับการเขียนแบบทดสอบหน่วย - แน่นอนเราทำการทดสอบเพิ่มเติมตลอดทั้งเดือน แต่นี่เป็นทั้งวัน - และ "ผู้ชนะ" ของการแข่งขันจะได้รับรางวัล อย่างไรก็ตามเราพบว่ามันยากที่จะตัดสินว่าใครเป็นผู้ชนะ เรากำหนดคะแนนสำหรับแต่ละกรณีทดสอบ ดังนั้นถ้าคุณเขียนการทดสอบหน่วยเช่นนี้ ... for (int i = 0; i < 100; i++) { assertTrue(i*i, square(i)); } คุณจะได้รับ 100 คะแนน เห็นได้ชัดว่านี่เป็นตัวอย่างง่าย ๆ แต่มันแสดงให้เห็นถึงปัญหากับการกำหนด "คะแนน" ให้กับแต่ละกรณีทดสอบ เราเป็นร้านค้า Java & Javascript เป็นหลัก ดังนั้นฉันจึงแนะนำการนับจำนวนสาขารหัสที่ทดสอบเป็นเมตริก เราสามารถนับจำนวนสาขาที่ทดสอบผ่านเครื่องมือครอบคลุมรหัสได้อย่างง่ายดาย (เช่น EclEmma) อย่างไรก็ตามไม่แน่ใจว่าเราจะทำอย่างไรกับการทดสอบซีลีเนียมของเราและรับรหัสที่ครอบคลุมในแหล่ง Javascript (ความคิดใด ๆ ?) ไม่มีใครมีข้อเสนอแนะใด ๆ …

2
คุณจะทดสอบหน่วย \ ใช้วิธี TDD สำหรับโครงการ ETL และการรายงานได้อย่างไร
โครงการ ETL เป็นโครงการที่สร้างขึ้นโดยใช้เครื่องมือ ETL (ดึงข้อมูล - แปลง - โหลด) เช่น SSIS, PowerCenter เป็นต้น โดยทั่วไปจะเกี่ยวข้องกับการอ่านข้อมูลจากแหล่งภายนอกโหลดไปยังฐานข้อมูลการแสดงการแปลงและโหลดไปยังฐานข้อมูลสุดท้าย ตัวอย่างง่ายๆคือการใช้ SSIS เพื่ออ่านไฟล์ excel ที่เตรียมไว้โดยครูผู้สอนโดยใช้ SSIS และโหลดลงในฐานข้อมูล จากนั้นเขียนกระบวนงานที่เก็บไว้หรือแพ็คเกจ SSIS เพิ่มเติมเพื่อคำนวณคะแนนของนักเรียนแต่ละคนและโหลดข้อมูลนั้นลงใน data mart \ warehouse จากนั้นคุณสร้างกระบวนงานที่เก็บไว้ด้านบนของตลาดเพื่อสร้างผลลัพธ์ที่ใช้โดยเครื่องมือการรายงาน (SSRS \ Excel \ etc) เพื่อสร้างการแสดงภาพประกอบเพลง ฉันพยายามที่จะเข้าใจวิธีการใช้ TDD และการทดสอบหน่วยที่เหมาะสมในสถานการณ์นี้ การทดสอบสำหรับ ETL นั้นส่วนใหญ่เกี่ยวกับการทำให้มั่นใจว่าข้อมูลที่โหลดในตาราง staging ตรงกันคือเซ็ตย่อยที่ถูกต้องของข้อมูลจากแหล่งที่มา ดังนั้นการนำการทดสอบไปใช้จะนำไปสู่การใช้ ETL รุ่นมินิ ผลลัพธ์ของรายงาน SP ขึ้นอยู่กับข้อมูลในตารางด้วยตนเองดังนั้นจึงไม่มีชุดข้อมูลเอาต์พุตที่เสถียรโดยไม่ต้องมีฝันร้ายในการบำรุงรักษาแม้ว่าคุณจะสร้างฐานข้อมูลที่มีข้อมูลการทดสอบแบบสครับ ตัวอย่าง: …
12 unit-testing  sql  tdd 

4
มีวิธีที่ดีกว่าในการเขียนการทดสอบหน่วยกว่าชุดของ 'AssertEquals' หรือไม่?
นี่คือตัวอย่างพื้นฐานของการทดสอบหน่วยของฉันที่ต้องใช้โดยใช้ qunit: <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>Insert title here</title> <link rel="stylesheet" href="qunit/qunit-1.13.0.css"> <script src = "qunit/qunit-1.13.0.js"></script> <script src = "../js/fuzzQuery.js"></script> <script> test("Fuzz Query Basics", function() { equal(fuzzQuery("name:(John Smith)"), "name:(John~ Smith~)"); equal(fuzzQuery("name:Jon~0.1"), "name:Jon~0.1"); equal(fuzzQuery("Jon"), "Jon~"); //etc } ); </script> </head> <body> …

1
การทดสอบหน่วยใน Django
ฉันพยายามอย่างหนักที่จะเขียนการทดสอบหน่วยที่มีประสิทธิภาพสำหรับโครงการขนาดใหญ่ Django ฉันมีความครอบคลุมการทดสอบที่ดีพอสมควร แต่ฉันได้ตระหนักว่าการทดสอบที่ฉันเขียนคือการทดสอบการรวม / การยอมรับไม่ใช่การทดสอบหน่วยเลยและฉันมีส่วนสำคัญของแอปพลิเคชันที่ไม่ได้รับการทดสอบอย่างมีประสิทธิภาพ ฉันต้องการแก้ไขโดยเร็วที่สุดนี้ นี่คือปัญหาของฉัน สคีมาของฉันนั้นมีความสัมพันธ์ลึกซึ้งและมุ่งเน้นไปที่เวลาอย่างมากทำให้วัตถุต้นแบบของฉันมีความสัมพันธ์ภายในสูงและมีสถานะเป็นจำนวนมาก แบบสอบถามวิธีการแบบจำลองของฉันจำนวนมากขึ้นอยู่กับช่วงเวลาและฉันมีจำนวนมากauto_now_addเกิดขึ้นในเขตข้อมูลที่ประทับเวลา ดังนั้นลองใช้วิธีที่มีลักษณะเช่นนี้: def summary(self, startTime=None, endTime=None): # ... logic to assign a proper start and end time # if none was provided, probably using datetime.now() objects = self.related_model_set.manager_method.filter(...) return sum(object.key_method(startTime, endTime) for object in objects) วิธีใดวิธีหนึ่งในการทดสอบบางอย่างเช่นนี้ ที่นี่ฉันอยู่ไกล เกิดขึ้นกับฉันว่าวัตถุประสงค์การทดสอบหน่วยควรได้รับพฤติกรรมเยาะเย้ยby key_methodบนข้อโต้แย้งของมันคือการsummaryกรอง / รวมอย่างถูกต้องเพื่อให้ได้ผลลัพธ์ที่ถูกต้อง? …

5
มันจะมีประโยชน์กับวิธีการทดสอบหน่วยที่ตรรกะเพียงอย่างเดียวคือยาม?
ว่าฉันมีวิธีเช่นนี้ public void OrderNewWidget(Widget widget) { if ((widget.PartNumber > 0) && (widget.PartAvailable)) { WigdetOrderingService.OrderNewWidgetAsync(widget.PartNumber); } } ฉันมีวิธีการหลายอย่างในรหัสของฉัน (ครึ่งหน้ากับการเรียกใช้ async Web Service) ฉันกำลังถกเถียงกันว่าเป็นประโยชน์หรือไม่ที่จะให้มันครอบคลุมการทดสอบหน่วย ใช่มีเหตุผลอยู่ที่นี่ แต่มันเป็นเพียงตรรกะยาม (หมายความว่าฉันต้องแน่ใจว่าฉันมีสิ่งที่ฉันต้องการก่อนที่จะอนุญาตให้มีการให้บริการทางเว็บเกิดขึ้น) ส่วนหนึ่งของฉันบอกว่า "แน่ใจว่าคุณสามารถทดสอบหน่วยได้ แต่ก็ไม่คุ้มค่ากับเวลา" (ฉันอยู่ในโครงการที่ล้าสมัยไปแล้ว) แต่อีกด้านของฉันบอกว่าถ้าคุณไม่ได้ทดสอบหน่วยและใครบางคนเปลี่ยน Guards ก็อาจมีปัญหาได้ แต่ส่วนแรกของฉันบอกกลับถ้ามีคนเปลี่ยนทหารยามคุณจะทำงานให้พวกเขามากขึ้น (เพราะตอนนี้พวกเขาต้องเปลี่ยนทหารและหน่วยทดสอบทหาร) ตัวอย่างเช่นหากบริการของฉันมีความรับผิดชอบในการตรวจสอบความพร้อมใช้งานของ Widget ฉันอาจไม่ต้องการให้มีการป้องกันอีกต่อไป หากอยู่ในการทดสอบหน่วยฉันต้องเปลี่ยนสถานที่สองแห่งตอนนี้ ฉันเห็นข้อดีข้อเสียในทั้งสองวิธี ดังนั้นฉันคิดว่าฉันจะถามสิ่งที่คนอื่นทำ
12 c#  unit-testing 

2
การทดสอบหน่วยทั้งหมดในหนึ่งปฏิบัติการหรือแยกพวกเขา?
เมื่อเขียนการทดสอบสำหรับซอฟต์แวร์หนึ่งชิ้นกล่าวว่าห้องสมุดคุณต้องการรวบรวมการทดสอบหน่วยทั้งหมดเป็นหนึ่งหรือแยกพวกมันออกเป็นหลาย ๆ โปรแกรม? เหตุผลที่ฉันถามคือตอนนี้ฉันใช้CUnitเพื่อทดสอบห้องสมุดที่ฉันทำงานอยู่ การทดสอบจะแบ่งออกเป็นชุดแยกต่างหากที่รวบรวมเป็นหนึ่งปฏิบัติการเสร็จสมบูรณ์ด้วยผลลัพธ์ที่พิมพ์ออกมาสำหรับความล้มเหลว ตอนนี้การสร้างระบบห้องสมุดที่เป็นCMake (ซึ่งแม้จะมีชื่อของมันมีน้อยจะทำอย่างไรกับ Cunit) ซึ่งมาพร้อมกับกรอบการทดสอบของตัวเองCTest CTest อนุญาตให้ฉันลงทะเบียนรายการของไฟล์ปฏิบัติการที่ทำหน้าที่เป็นแบบทดสอบ ฉันกำลังไตร่ตรองว่าจะใช้ CTest สำหรับการทดสอบอัตโนมัติหรือไม่ อย่างไรก็ตามสิ่งนี้จะทำให้ฉันต้องแยกการทดสอบที่ฉันได้เขียนไว้ในเป้าหมายการคอมไพล์แยกต่างหาก มิฉะนั้นฉันไม่สามารถใช้คุณสมบัติขั้นสูงของ CTests บางอย่างเช่นการทดสอบที่เลือกสรร ฉันรู้ว่านี่เป็นคำถามเพิ่มเติมเกี่ยวกับเครื่องมือที่ใช้และการจัดการและการประชุมของพวกเขา แต่นอกเหนือจากนั้นมีเหตุผลอื่นอีกหรือไม่ที่จะชอบการทดสอบที่สามารถใช้งานได้มากกว่าการทดสอบแยกต่างหาก? หรือในทางกลับกัน?

3
สิ่งที่ควรทดสอบใน Javascript
ที่ทำงานเราเพิ่งเริ่มต้นกับแอปพลิเคชันที่ใช้ Javascript เป็นหลัก (จริงๆแล้วใช้ Coffeescript แต่ก็ยัง) ซึ่งฉันได้ใช้ระบบทดสอบอัตโนมัติโดยใช้ JsTestDriver และแฟบริค เราไม่เคยเขียนอะไรเกี่ยวกับ Javascript มากขนาดนี้มาก่อนจนถึงตอนนี้เราไม่เคยทำการทดสอบ Javascript เลย ฉันไม่แน่ใจว่าเราควรทำการทดสอบอะไรในการทดสอบหน่วยของเรา เราได้เขียนปลั๊กอิน JQuery สำหรับสิ่งต่าง ๆ ดังนั้นจึงค่อนข้างชัดเจนว่าควรตรวจสอบความถูกต้องให้มากที่สุดกับ JsTestDriver แต่ทุกคนในทีมของฉันดูเหมือนจะคิดว่าเราควรทดสอบ Javascript ระดับหน้าเว็บด้วย ฉันไม่คิดว่าเราควรทดสอบ Javascript ในระดับหน้าเป็นการทดสอบหน่วย แต่ใช้ระบบเช่น Selenium เพื่อยืนยันว่าทุกอย่างทำงานได้ตามที่คาดไว้ เหตุผลหลักของฉันสำหรับเรื่องนี้คือในขณะนี้การทดสอบ Javascript ในระดับหน้ารับประกันว่าจะล้มเหลวผ่าน JsTestDriver เพราะพวกเขากำลังพยายามเข้าถึงองค์ประกอบใน DOM ที่ไม่มีอยู่จริง ดังนั้นสิ่งที่ควรทดสอบหน่วยใน Javascript?

1
มีการศึกษาเกี่ยวกับความสัมพันธ์ระหว่างการทดสอบซอฟต์แวร์กับประสิทธิภาพของนักพัฒนาหรือไม่? [ปิด]
ปิด. คำถามนี้เป็นคำถามปิดหัวข้อ ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้เป็นหัวข้อสำหรับ Software Engineering Stack Exchange ปิดให้บริการใน6 ปีที่ผ่านมา มีการศึกษาเกี่ยวกับความสัมพันธ์ระหว่างการทดสอบซอฟต์แวร์ (หน่วยและ / หรือการทดสอบการรวม) และการพัฒนาของนักพัฒนาหรือไม่?

8
มันสมเหตุสมผลหรือไม่ที่จะทำการทดสอบหน่วยใบอนุญาต
ฉันสงสัยว่ามีประโยชน์ / ความเสี่ยงของ (ไม่) ใส่ใบอนุญาตในรหัสทดสอบซึ่งส่วนใหญ่ประกอบด้วยการทดสอบหน่วย คุณคิดอย่างไร? ฉันสนใจเป็นพิเศษในการออกใบอนุญาตภายใต้ (L) GPL, Apache, MIT และ BSD แก้ไข : สมมติฐานคือรหัสที่ไม่ใช่การทดสอบได้รับการเผยแพร่แล้วภายใต้ใบอนุญาตบางส่วน แต่รหัสการทดสอบไม่ได้ดังนั้นคำถามคือว่าจะเผยแพร่มันและถ้าเป็นเช่นนั้นจะนำใบอนุญาตเดียวกันกับมัน

4
วิธีการแบบค่อยเป็นค่อยไปในการฉีดพึ่งพา
ฉันกำลังทำงานเพื่อให้บทเรียนในหน่วยของฉันเป็นแบบทดสอบได้โดยใช้การฉีดแบบพึ่งพา แต่ชั้นเรียนเหล่านี้บางแห่งมีลูกค้าจำนวนมากและฉันยังไม่พร้อมที่จะปรับโครงสร้างพวกเขาทั้งหมดเพื่อเริ่มผ่านการพึ่งพา ดังนั้นฉันพยายามทำมันทีละน้อย; ทำให้การพึ่งพาเริ่มต้นสำหรับตอนนี้ แต่ช่วยให้พวกเขาถูกแทนที่สำหรับการทดสอบ วิธีการหนึ่งที่ฉันกำลังสร้างคือการย้ายการเรียก "ใหม่" ทั้งหมดเป็นวิธีการของตนเองเช่น: public MyObject createMyObject(args) { return new MyObject(args); } จากนั้นในการทดสอบหน่วยของฉันฉันสามารถคลาสย่อยนี้และแทนที่ฟังก์ชันสร้างดังนั้นพวกเขาจึงสร้างวัตถุปลอมแทน นี่เป็นวิธีที่ดีหรือไม่? มีข้อเสียหรือไม่? โดยทั่วไปแล้วจะเป็นการดีไหมหากมีการอ้างอิงแบบกำหนดค่าตายตัวตราบใดที่คุณสามารถแทนที่การทดสอบได้ ฉันรู้ว่าวิธีการที่ต้องการคือการกำหนดไว้อย่างชัดเจนในตัวสร้างและฉันต้องการไปที่นั่นในที่สุด แต่ฉันสงสัยว่านี่เป็นก้าวแรกที่ดีหรือไม่ ข้อเสียอย่างหนึ่งที่เพิ่งเกิดขึ้นกับฉัน: หากคุณมีคลาสย่อยจริงที่คุณต้องการทดสอบคุณไม่สามารถใช้คลาสย่อยทดสอบที่คุณเขียนสำหรับคลาสแม่ได้ คุณจะต้องสร้างคลาสย่อยทดสอบสำหรับแต่ละคลาสย่อยจริงและมันจะต้องแทนที่ฟังก์ชั่นการสร้างเดียวกัน

3
NUnit สำหรับ C # เปรียบเทียบกับเครื่องมือทดสอบหน่วยที่รวมเข้ากับ Visual Studio อย่างไร
ฉันต้องทำงานเป็นทีมเพื่อพัฒนาแอปพลิเคชั่นเดสก์ท็อประดับกลางที่พัฒนาโดยใช้ C # .NET ก่อนหน้านี้ฉันยังไม่ได้ใช้การทดสอบหน่วยและการพัฒนาขับเคลื่อนทดสอบ ฉันทราบว่ามีเครื่องมือและกรอบงานมากมายสำหรับแอปพลิเคชันการทดสอบหน่วย C # ณ ตอนนี้ฉันได้รับทราบถึง Nunit และเครื่องมือทดสอบหน่วยที่รวมเข้ากับ Visual Studio ฉันอยากรู้ว่าทั้งสองเปรียบเทียบกันอย่างไร

1
ฉันจะทดสอบตรรกะของฐานข้อมูลได้อย่างไร
ฉันยังคงมีปัญหาในการแก้ไขปัญหาเล็ก ๆ เมื่อพูดถึง TDD ฉันต้องการวิธีที่จะได้รับชุดบันทึกข้อมูลที่กรองจากชั้นข้อมูล (linq2SQL) โปรดทราบว่าฉันใช้ linq สร้างชั้นเรียนจากที่สร้างขึ้นจาก DBML ตอนนี้ปัญหาคือฉันต้องการเขียนแบบทดสอบนี้ ฉัน: ก) ใส่บันทึกในการทดสอบก่อนแล้วจึงดำเนินการวิธีการและทดสอบผลลัพธ์ b) ใช้ข้อมูลที่อาจอยู่ในฐานข้อมูล การไม่สนใจเหตุผลนี้อาจทำให้สิ่งต่าง ๆ แตกหักได้ c) คุณเคยแนะนำอะไรบ้าง
12 c#  unit-testing 

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