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

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

11
คุณจะตรวจสอบปัญหาการพึ่งพากับการทดสอบหน่วยเมื่อคุณใช้วัตถุจำลองได้อย่างไร
คุณมีคลาส X และคุณเขียนการทดสอบหน่วยบางอย่างที่ตรวจสอบพฤติกรรม X1 นอกจากนี้ยังมีคลาส A ซึ่งใช้ X เป็นตัวอ้างอิง เมื่อคุณเขียนการทดสอบหน่วยสำหรับ A คุณจำลอง X ในคำอื่น ๆ ในขณะที่การทดสอบหน่วย A คุณตั้งค่า (สมมุติ) พฤติกรรมของจำลองของ X ให้เป็น X1 เวลาผ่านไปผู้คนใช้ระบบของคุณต้องการการเปลี่ยนแปลง X วิวัฒนาการ: คุณแก้ไข X เพื่อแสดงพฤติกรรม X2 เห็นได้ชัดว่าการทดสอบหน่วยสำหรับ X จะล้มเหลวและคุณจะต้องปรับตัว แต่อะไรกับ A? การทดสอบหน่วยสำหรับ A จะไม่ล้มเหลวเมื่อปรับเปลี่ยนพฤติกรรมของ X (เนื่องจากการเยาะเย้ยของ X) วิธีการตรวจสอบว่าผลลัพธ์ของ A จะแตกต่างกันเมื่อทำงานด้วย X "จริง" (แก้ไข) X ฉันคาดหวังคำตอบตามบรรทัดของ: "นั่นไม่ใช่จุดประสงค์ของการทดสอบหน่วย" …

18
การทดสอบหน่วยมีประโยชน์จริง ๆ หรือไม่? [ปิด]
ฉันเพิ่งจบการศึกษาระดับปริญญาใน CS และตอนนี้ฉันมีงานเป็นนักพัฒนาจูเนียร์. NET (C #, ASP.NET และแบบฟอร์มเว็บ) ย้อนกลับไปเมื่อฉันยังอยู่ในมหาวิทยาลัยเรื่องของการทดสอบหน่วยได้รับความคุ้มครอง แต่ฉันไม่เคยเห็นประโยชน์ของมันเลย ฉันเข้าใจสิ่งที่ควรทำคือระบุว่าบล็อกของรหัสนั้นเหมาะสมกับการใช้งานหรือไม่ อย่างไรก็ตามฉันไม่เคยต้องเขียนบททดสอบมาก่อนและไม่เคยรู้สึกว่าจำเป็นต้องทำ ตามที่ฉันได้กล่าวไปแล้วฉันมักจะพัฒนาด้วยเว็บฟอร์ม ASP.NET และเมื่อเร็ว ๆ นี้ฉันคิดถึงการเขียนแบบทดสอบหน่วย แต่ฉันมีคำถามสองสามข้อเกี่ยวกับเรื่องนี้ ฉันอ่านแล้วว่าการทดสอบหน่วยมักเกิดขึ้นจากการเขียน "mocks" ในขณะที่ฉันเข้าใจแนวคิดนี้ฉันไม่สามารถหาวิธีที่ฉันควรจะเขียน mocks สำหรับเว็บไซต์ที่มีการเปลี่ยนแปลงอย่างสมบูรณ์และเกือบทุกอย่างขึ้นอยู่กับข้อมูลที่มาจากฐานข้อมูล ตัวอย่างเช่นฉันใช้ล็อตซ้ำที่มีเหตุการณ์ ItemDataBound ฯลฯ (อีกครั้งขึ้นอยู่กับข้อมูลที่เป็น "ไม่ทราบ") ดังนั้นคำถามข้อที่ 1: การเขียนการทดสอบหน่วยสำหรับเว็บ ASP.NET เป็นสิ่งที่ทำบ่อยและถ้าเป็น: ฉันจะแก้ไขปัญหา "สภาพแวดล้อมแบบไดนามิก" ได้อย่างไร เมื่อฉันพัฒนาฉันต้องผ่านการลองผิดลองถูกมากมาย นั่นไม่ได้หมายความว่าฉันไม่รู้ว่าฉันกำลังทำอะไร แต่ฉันหมายความว่าฉันมักจะเขียนโค้ดตีCtrl F5และดูว่าเกิดอะไรขึ้น ในขณะที่วิธีการนี้ทำงานได้เกือบตลอดเวลาบางครั้งฉันก็รู้สึกว่าตัวเองไร้ความรู้สึกเล็ก ๆ น้อย ๆ (เพราะประสบการณ์น้อยของฉัน) บางครั้งฉันก็เสียเวลาเช่นนี้เช่นกัน ดังนั้นคำถามข้อ 2: คุณช่วยแนะนำให้ฉันเริ่มเขียนการทดสอบหน่วยได้ไหม ฉันคิดว่ามันอาจช่วยฉันในการใช้งานจริง …

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

10
วิธีการจูงใจเพื่อนร่วมงานให้เขียนการทดสอบหน่วย? [ปิด]
เรากำลังทำงานเกี่ยวกับผลิตภัณฑ์ขนาดใหญ่ที่ได้รับการผลิตประมาณ 5 ปี codebase นั้น .. กำลังทำงานอยู่ ไม่ค่อยดี แต่มันใช้งานได้ ฟีเจอร์ใหม่ ๆ จะถูกนำไปผลิตและทดสอบด้วย QA ขนาดเล็ก ข้อบกพร่องได้รับการแก้ไข ฯลฯ แต่ไม่มีใครยกเว้นฉันเขียนการทดสอบหน่วย ไม่มีใครใช้พลังของ "การติดตาม" ข้อบกพร่องลงโดยการเขียนการทดสอบหน่วยเพื่อให้แน่ใจว่าข้อผิดพลาดพิเศษ (กรณีทดสอบ) นี้จะไม่เกิดขึ้นอีกเลย ฉันได้คุยกับฝ่ายบริหาร ฉันได้พูดคุยกับนักพัฒนา ฉันได้พูดคุยกับทุกคนใน บริษัท ทั้งหมด ทุกคนพูดว่า: "ใช่เราต้องเขียนบททดสอบเพิ่มอีก!" ประมาณหนึ่งปีที่แล้ว ตั้งแต่นั้นมาฉันได้บังคับให้แนะนำการตรวจสอบโค้ดล่วงหน้า ( Gerrit ) และการรวมอย่างต่อเนื่อง ( Jenkins ) ฉันจัดการประชุมเกี่ยวกับการทดสอบหน่วยและฉันก็แสดงให้เห็นถึงประโยชน์ของการเขียนการทดสอบหน่วย แต่ดูเหมือนไม่มีใครสนใจ คำถามที่ 1: ฉันจะกระตุ้นเพื่อนร่วมงานให้เขียนการทดสอบหน่วยได้อย่างไร Q2: ฉันจะยังคงมีแรงจูงใจในการปฏิบัติตามมาตรฐานคุณภาพรหัสส่วนตัวของฉันได้อย่างไร (บางครั้งมันน่าผิดหวังจริงๆ!) PS: ข้อเท็จจริงที่น่าผิดหวังบางอย่าง (เข้าถึงได้ใน 1 …

15
เราควรออกแบบรหัสของเราตั้งแต่ต้นเพื่อเปิดใช้การทดสอบหน่วยหรือไม่
มีการถกเถียงกันในทีมของเราในขณะนี้ว่าการปรับเปลี่ยนการออกแบบรหัสเพื่อให้การทดสอบหน่วยเป็นกลิ่นรหัสหรือในระดับที่สามารถทำได้โดยไม่ต้องมีกลิ่นรหัส สิ่งนี้เกิดขึ้นเพราะเราเพิ่งเริ่มวางแนวทางปฏิบัติที่มีอยู่ใน บริษัท พัฒนาซอฟต์แวร์อื่น ๆ โดยเฉพาะเราจะมีบริการ Web API ที่จะบางมาก ความรับผิดชอบหลักของมันคือการจัดการคำขอ / ตอบกลับเว็บและเรียก API พื้นฐานที่มีตรรกะทางธุรกิจ ตัวอย่างหนึ่งคือเราวางแผนที่จะสร้างโรงงานที่จะคืนค่าประเภทวิธีการตรวจสอบสิทธิ์ เราไม่จำเป็นต้องให้อินเทอร์เฟซสืบทอดเนื่องจากเราไม่ได้คาดหวังว่ามันจะเป็นสิ่งอื่นนอกเหนือจากรูปแบบที่เป็นรูปธรรม อย่างไรก็ตามหากต้องการทดสอบบริการ Web API เราจะต้องจำลองโรงงานนี้ นี่หมายถึงว่าเราออกแบบคลาสคอนโทรลเลอร์ API ของเว็บเพื่อยอมรับ DI (ผ่าน Constructor หรือ Setter) ซึ่งหมายความว่าเราออกแบบส่วนของคอนโทรลเลอร์เพียงเพื่อให้ DI และใช้อินเตอร์เฟสที่เราไม่ต้องการหรือเราใช้ เฟรมเวิร์กของบุคคลที่สามอย่าง Ninject เพื่อหลีกเลี่ยงการออกแบบคอนโทรลเลอร์ในลักษณะนี้ แต่เราจะต้องสร้างอินเทอร์เฟซ บางคนในทีมดูเหมือนไม่เต็มใจที่จะออกแบบรหัสเพื่อการทดสอบ ดูเหมือนว่าฉันจะต้องมีการประนีประนอมบางอย่างถ้าคุณหวังว่าจะทดสอบหน่วย แต่ฉันไม่แน่ใจว่าบรรเทาความกังวลของพวกเขาอย่างไร เพื่อให้ชัดเจนนี่คือโครงการใหม่ล่าสุดดังนั้นจึงไม่ได้เกี่ยวกับการแก้ไขโค้ดเพื่อเปิดใช้งานการทดสอบหน่วย มันเกี่ยวกับการออกแบบโค้ดที่เราจะเขียนให้ทดสอบได้

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

10
เส้นแบ่งระหว่างตรรกะการทดสอบหน่วยแอปพลิเคชันกับการสร้างภาษาที่ไม่ไว้ใจอยู่ที่ไหน
พิจารณาฟังก์ชั่นเช่นนี้: function savePeople(dataStore, people) { people.forEach(person => dataStore.savePerson(person)); } มันอาจจะใช้แบบนี้: myDataStore = new Store('some connection string', 'password'); myPeople = ['Joe', 'Maggie', 'John']; savePeople(myDataStore, myPeople); ให้เราสมมติว่าStoreมีการทดสอบหน่วยของตนเองหรือได้รับการจัดหาจากผู้ขาย ในกรณีใด ๆ Storeเราไว้วางใจ และให้เราต่อไปคิดว่าจัดการข้อผิดพลาด - เช่นข้อผิดพลาดการเชื่อมต่อฐานข้อมูล - savePeopleไม่ได้เป็นความรับผิดชอบของ ที่จริงให้เราสมมติว่าตัวร้านนั้นเป็นฐานข้อมูลเวทมนต์ที่ไม่สามารถผิดพลาดได้ แต่อย่างใด ด้วยสมมติฐานเหล่านี้คำถามคือ: ควรsavePeople()ทดสอบหน่วยหรือจำนวนการทดสอบดังกล่าวเพื่อทดสอบการสร้างforEachภาษาในตัว? แน่นอนเราสามารถผ่านการเยาะเย้ยdataStoreและยืนยันที่dataStore.savePerson()เรียกว่าครั้งเดียวสำหรับแต่ละคน แน่นอนคุณสามารถโต้แย้งว่าการทดสอบดังกล่าวมีความปลอดภัยต่อการเปลี่ยนแปลงการใช้งานเช่นหากเราตัดสินใจแทนที่forEachด้วยการforวนซ้ำดั้งเดิมหรือวิธีการทำซ้ำอื่น ๆ ดังนั้นการทดสอบไม่ได้อย่างสิ้นเชิงจิ๊บจ๊อย และยังดูเหมือนว่าใกล้มาก ... นี่เป็นอีกตัวอย่างที่อาจมีผลมากกว่า พิจารณาฟังก์ชั่นที่ไม่ทำอะไรเลยนอกจากประสานงานวัตถุหรือฟังก์ชั่นอื่น ๆ ตัวอย่างเช่น: function bakeCookies(dough, pan, …

11
การทดสอบหน่วยจะช่วยให้ซิตี้กรุ๊ปหลีกเลี่ยงข้อผิดพลาดราคาแพงนี้หรือไม่
ฉันอ่านเกี่ยวกับ snafu นี้: ค่าใช้จ่ายข้อผิดพลาด Programming ซิตี้กรุ๊ป $ 7 หลังจากการทำธุรกรรมที่ legit เข้าใจผิดว่าเป็นข้อมูลการทดสอบเป็นเวลา 15 ปี เมื่อระบบเปิดตัวในกลางปี ​​1990 รหัสโปรแกรมจะกรองธุรกรรมใด ๆ ที่ได้รับรหัสสาขาสามหลักจาก 089 ถึง 100 และใช้คำนำหน้าเหล่านั้นเพื่อวัตถุประสงค์ในการทดสอบ แต่ในปี 1998 บริษัท เริ่มใช้รหัสสาขาตัวอักษรและตัวเลขเมื่อขยายธุรกิจ ในหมู่พวกเขาคือรหัส 10B, 10C และอื่น ๆ ซึ่งระบบถือว่าอยู่ในช่วงที่ยกเว้นและการทำธุรกรรมของพวกเขาจะถูกลบออกจากรายงานใด ๆ ที่ส่งไปยังสำนักงาน ก.ล.ต. (ฉันคิดว่าสิ่งนี้แสดงให้เห็นว่าการใช้ตัวบ่งชี้ข้อมูลที่ไม่ชัดเจนคือ ... ย่อยที่ดีที่สุดมันจะดีกว่ามากที่จะเติมและใช้Branch.IsLiveคุณสมบัติที่ชัดเจนเชิงความหมาย) นอกเหนือจากนั้นปฏิกิริยาแรกของฉันคือ "การทดสอบหน่วยจะช่วยให้ที่นี่" ... แต่พวกเขาจะ? ฉันเพิ่งอ่านว่าเพราะเหตุใดการทดสอบหน่วยส่วนใหญ่จึงหมดความสนใจและดังนั้นคำถามของฉันคืออะไรการทดสอบหน่วยที่จะล้มเหลวในการแนะนำรหัสสาขาตัวอักษรและตัวเลขมีลักษณะอย่างไร

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

11
คงเป็น "ความชั่วร้าย" ในระดับสากลสำหรับการทดสอบหน่วยและถ้าเป็นเช่นนั้นทำไม Resharper จึงแนะนำ [ปิด]
ฉันได้พบว่ามีเพียง 3 วิธีในการทดสอบหน่วยอ้างอิง (จำลอง / ต้นขั้ว) ที่คงที่ใน C # .NET: ไฝ TypeMock JustMock เนื่องจากว่าสองสิ่งนี้ไม่ฟรีและไม่มีการปล่อยรุ่น 1.0 การเยาะเย้ยสิ่งคงไม่ง่ายเกินไป นั่นทำให้วิธีการคงที่และ "ความชั่วร้าย" (ในแง่การทดสอบหน่วย) หรือไม่? และถ้าเป็นเช่นนั้นทำไม resharper จึงต้องการให้ฉันทำอะไรที่คงที่ (การสมมติว่า resharper ไม่ได้เป็น "ความชั่วร้าย" ด้วย) ชี้แจง: ฉันกำลังพูดถึงสถานการณ์เมื่อคุณต้องการทดสอบหน่วยวิธีและวิธีการที่เรียกว่าวิธีการคงที่ในหน่วย / ระดับที่แตกต่างกัน โดยคำจำกัดความส่วนใหญ่ของการทดสอบหน่วยหากคุณเพียงให้วิธีการทดสอบเรียกวิธีการคงที่ในหน่วย / ชั้นเรียนอื่น ๆ แล้วคุณไม่ได้ทดสอบหน่วยคุณกำลังทดสอบบูรณาการ (มีประโยชน์ แต่ไม่ใช่การทดสอบหน่วย)

6
เป็นการปฏิบัติที่ไม่ถูกต้องหรือไม่ในการบังคับใช้คำสั่งการเรียกใช้การทดสอบหน่วย?
ฉันกำลังเขียนการทดสอบสำหรับโครงการที่ประกอบด้วยหลาย submodules กรณีทดสอบแต่ละข้อที่ฉันเขียนขึ้นจะทำงานแยกกันและฉันจะล้างข้อมูลทั้งหมดระหว่างการทดสอบ แม้ว่าการทดสอบจะดำเนินการอย่างเป็นอิสระ แต่ฉันกำลังพิจารณาที่จะบังคับใช้คำสั่งการดำเนินการเนื่องจากบางกรณีต้องการมากกว่าหนึ่ง submodule ตัวอย่างเช่น submodule กำลังสร้างข้อมูลและอีกอันหนึ่งกำลังเรียกใช้แบบสอบถามบนข้อมูล หาก submodule ที่สร้างข้อมูลมีข้อผิดพลาดการทดสอบสำหรับ submodule แบบสอบถามจะล้มเหลวเช่นกันแม้ว่า submodule นั้นจะทำงานได้ดี ฉันไม่สามารถทำงานกับข้อมูลจำลองได้เนื่องจากฟังก์ชั่นหลักที่ฉันกำลังทดสอบคือการเชื่อมต่อกับเซิร์ฟเวอร์ระยะไกลกล่องดำซึ่งรับเฉพาะข้อมูลจาก submodule แรกเท่านั้น ในกรณีนี้มันตกลงเพื่อบังคับใช้คำสั่งการดำเนินการสำหรับการทดสอบหรือมันเป็นการปฏิบัติที่ไม่ดี? ฉันรู้สึกว่ามีกลิ่นในการตั้งค่านี้ แต่ฉันไม่สามารถหาวิธีที่ดีกว่า แก้ไข: คำถามมาจากวิธีการจัดโครงสร้างการทดสอบที่การทดสอบหนึ่งเป็นการตั้งค่าการทดสอบอื่น? เนื่องจากการทดสอบ "ก่อนหน้า" ไม่ใช่การตั้งค่า แต่ทดสอบรหัสที่ดำเนินการตั้งค่า

12
ถือว่าเป็น 'การปฏิบัติที่ไม่เหมาะสม' เพื่อตรวจสอบเนื้อหาของไฟล์ / การเข้ารหัสในการทดสอบหน่วยหรือไม่?
บริบทนิดหน่อย: ก่อนหน้านี้วันนี้ฉันต้องอัปเดตรหัส SQL บางส่วนที่เพื่อนร่วมงานคนอื่นของฉันมอบให้และเนื่องจากเป็นสคริปต์ที่ค่อนข้างใหญ่จึงถูกจัดเก็บเป็นไฟล์แยกต่างหาก ในขณะที่ทำสิ่งนี้ฉันได้แนะนำข้อผิดพลาดสองข้อที่เราได้รับกลับไปเมื่อไม่กี่เดือน ได้แก่ : ไม่ว่าด้วยเหตุผลใดก็ตามไฟล์ ASCII นั้นถูกเข้ารหัสใน UTF-16 (เพื่อนร่วมงานได้ส่งไฟล์ให้ฉันทางอีเมลซึ่งอาจเป็นสาเหตุให้เกิดปัญหา) สคริปต์ขาดSETคำสั่งเริ่มต้น(จำเป็นเนื่องจากมีบางสิ่งที่ไดรเวอร์อยู่ในการผลิต แต่ไม่ใช่ในการติดตั้งใหม่ทั้งหมด) หลังจากแก้ไขจุดบกพร่องนี้ประมาณหนึ่งชั่วโมง (อีกครั้ง) ฉันตัดสินใจที่จะเขียนการทดสอบหน่วยเพื่อให้แน่ใจว่าสิ่งนี้จะไม่เกิดขึ้นอีก (และมีวิธีที่รวดเร็วในการแก้ไขในข้อความยืนยันเพื่อให้แก้ไขได้ง่ายสำหรับนักพัฒนาในอนาคต) อย่างไรก็ตามเมื่อฉันส่งรหัสนี้ให้เพื่อนร่วมงานคนอื่น (ซึ่งเป็นหัวหน้าทีมของเราด้วย) ก็เดินมาหาฉันและบอกฉันว่าฉันไม่ควรทำสิ่งเหล่านี้อีกเพราะ: "สิ่งเหล่านี้ไม่ได้อยู่ในการทดสอบหน่วย" "การทดสอบหน่วยควรใช้เพื่อตรวจสอบการไหลของรหัสของคุณ" ฉันค่อนข้างจะขัดแย้งกันในขณะนี้เนื่องจากฉันยังคงคิดว่าสิ่งที่ฉันทำไม่ถูกต้องเนื่องจากข้อผิดพลาดนี้จะไม่ได้รับการแนะนำในอนาคตอย่างไรก็ตามเพื่อนร่วมงานคนนี้ทำงานในฐานะผู้อาวุโส เราใช้เวลาของเราไป ฉันควรทำอย่างไร? ฉันทำผิดแบบนี้เหรอ? ถือว่าเป็นการปฏิบัติที่ไม่ดีหรือไม่?

11
การทดสอบหน่วยไม่ควรใช้วิธีการของฉันเอง?
วันนี้ฉันกำลังดูวิดีโอ "พื้นฐานJUnit " และผู้เขียนกล่าวว่าเมื่อทำการทดสอบวิธีการที่กำหนดในโปรแกรมของคุณคุณไม่ควรใช้วิธีการอื่นของคุณเองในกระบวนการ เพื่อที่จะเจาะจงมากขึ้นเขากำลังพูดถึงการทดสอบวิธีการสร้างเรกคอร์ดที่ใช้ชื่อและนามสกุลของอาร์กิวเมนต์และใช้เพื่อสร้างเรกคอร์ดในตารางที่กำหนด แต่เขาอ้างว่าในกระบวนการทดสอบวิธีนี้เขาไม่ควรใช้วิธีDAOอื่น ๆ ของเขาในการสืบค้นฐานข้อมูลเพื่อตรวจสอบผลลัพธ์สุดท้าย (เพื่อตรวจสอบว่าบันทึกถูกสร้างขึ้นจริงด้วยข้อมูลที่ถูกต้อง) เขาอ้างว่าสิ่งนั้นเขาควรเขียนรหัสJDBCเพิ่มเติมเพื่อสืบค้นฐานข้อมูลและตรวจสอบผลลัพธ์ ฉันคิดว่าฉันเข้าใจจิตวิญญาณของการอ้างสิทธิ์ของเขา: คุณไม่ต้องการให้กรณีทดสอบของวิธีใดวิธีหนึ่งขึ้นอยู่กับความถูกต้องของวิธีอื่น ๆ (ในกรณีนี้วิธี DAO) และสิ่งนี้สามารถทำได้โดยการเขียนการตรวจสอบของคุณเองอีกครั้ง / สนับสนุนรหัส (ซึ่งควรจะเฉพาะเจาะจงมากขึ้นและเพ่งความสนใจไปจึงรหัสที่ง่ายขึ้น) อย่างไรก็ตามเสียงในหัวของฉันเริ่มคัดค้านด้วยข้อโต้แย้งเช่นการทำสำเนารหัสความพยายามเพิ่มเติมที่ไม่จำเป็น ฯลฯ ฉันหมายถึงถ้าเราใช้แบตเตอรี่ทดสอบทั้งหมดและเราทดสอบวิธีสาธารณะทั้งหมดของเราอย่างละเอียด (รวมถึงวิธี DAO ในกรณีนี้) ไม่ควร ไม่เป็นไรที่จะใช้วิธีการเหล่านั้นบางอย่างขณะทดสอบวิธีอื่น ๆ หากหนึ่งในนั้นไม่ได้ทำในสิ่งที่มันควรจะเป็นกรณีทดสอบของตัวเองจะล้มเหลวและเราสามารถแก้ไขและเรียกใช้แบตเตอรี่ทดสอบอีกครั้ง ไม่จำเป็นต้องทำสำเนารหัส (แม้ว่ารหัสที่ซ้ำกันจะค่อนข้างง่ายกว่า) หรือสูญเสียความพยายาม ฉันมีความรู้สึกที่แข็งแกร่งเกี่ยวกับเรื่องนี้เนื่องจากแอปพลิเคชันExcel - VBA หลายตัวที่ฉันเขียน (ต้องผ่านการทดสอบหน่วยอย่างถูกต้องด้วยRubberduck สำหรับ VBA ) ซึ่งการใช้คำแนะนำนี้จะหมายถึงการทำงานพิเศษเพิ่มเติมจำนวนมากโดยไม่มีประโยชน์ คุณช่วยแบ่งปันความเข้าใจเกี่ยวกับเรื่องนี้ได้ไหม?

8
วิธีการทดสอบหน่วยควรจะเขียนโดยไม่เยาะเย้ยอย่างกว้างขวาง?
ตามที่ผมเข้าใจจุดของการทดสอบหน่วยคือการทดสอบหน่วยของรหัสในการแยก หมายความว่า: พวกเขาไม่ควรทำลายโดยการเปลี่ยนแปลงรหัสที่ไม่เกี่ยวข้องใดๆ ใน codebase การทดสอบหน่วยเดียวควรทำลายข้อบกพร่องในหน่วยการทดสอบซึ่งตรงข้ามกับการทดสอบการรวม (ซึ่งอาจแบ่งเป็นฮีป) ทั้งหมดนี้แสดงถึงว่าควรมีการเยาะเย้ยจากภายนอกหน่วยทดสอบ และฉันหมายถึงการพึ่งพาภายนอกทั้งหมดไม่เพียง แต่ "เลเยอร์นอก" เช่นระบบเครือข่ายระบบไฟล์ฐานข้อมูล ฯลฯ นี้นำไปสู่ข้อสรุปเชิงตรรกะที่แทบทุกหน่วยทดสอบความต้องการที่จะเยาะเย้ย ในทางกลับกันการค้นหาอย่างรวดเร็วของ Google เกี่ยวกับการเยาะเย้ยเผยให้เห็นบทความมากมายที่อ้างว่า "การเยาะเย้ยเป็นกลิ่นรหัส" และส่วนใหญ่ควรหลีกเลี่ยง (แม้ว่าจะไม่สมบูรณ์) ตอนนี้สำหรับคำถาม การทดสอบหน่วยควรเขียนอย่างถูกต้องอย่างไร? เส้นแบ่งระหว่างพวกเขากับการทดสอบการรวมอยู่ตรงไหน? อัปเดต 1 โปรดพิจารณารหัสหลอกต่อไปนี้: class Person { constructor(calculator) {} calculate(a, b) { const sum = this.calculator.add(a, b); // do some other stuff with the `sum` } } การทดสอบที่ทดสอบPerson.calculateวิธีการโดยไม่มีการเยาะเย้ยการCalculatorพึ่งพา …

11
เป็นการปฏิบัติที่ไม่ถูกต้องหรือไม่ที่จะแก้ไขโค้ดอย่างเคร่งครัดเพื่อการทดสอบ
ฉันมีการถกเถียงกับเพื่อนร่วมงานโปรแกรมเมอร์เกี่ยวกับว่ามันเป็นการปฏิบัติที่ดีหรือไม่ดีในการปรับเปลี่ยนรหัสการทำงานเพียงเพื่อให้สามารถทดสอบได้ (ผ่านการทดสอบหน่วยตัวอย่าง) ความคิดเห็นของฉันคือว่ามันใช้ได้ภายในขอบเขตของการบำรุงรักษาวัตถุที่ดีและการปฏิบัติด้านวิศวกรรมซอฟต์แวร์ที่แน่นอน (ไม่ใช่ "ทำให้ทุกอย่างเป็นสาธารณะ" ฯลฯ ) ความคิดเห็นของเพื่อนร่วมงานของฉันคือการแก้ไขรหัส (ใช้งานได้) เพื่อการทดสอบเท่านั้นผิด เป็นเพียงตัวอย่างง่ายๆลองนึกถึงโค้ดชิ้นนี้ที่ใช้โดยองค์ประกอบบางส่วน (เขียนใน C #): public void DoSomethingOnAllTypes() { var types = Assembly.GetExecutingAssembly().GetTypes(); foreach (var currentType in types) { // do something with this type (e.g: read it's attributes, process, etc). } } ฉันได้แนะนำว่ารหัสนี้สามารถแก้ไขเพื่อเรียกวิธีอื่นที่จะทำงานจริง: public void DoSomething(Assembly asm) { // not …

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