ทำอย่างไรให้ดีขึ้นเมื่อทดสอบโค้ดของคุณเอง


45

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

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

พวกคุณคิดว่าฉันจะทำอะไรได้บ้างเพื่อเอาชนะสิ่งนี้? คุณใช้วิธีการใดเมื่อทดสอบโค้ดของคุณเอง?


28
เพียงเพราะองค์กรของคุณไม่ได้ใช้ TDD หรือการทดสอบหน่วยไม่ได้หมายความว่าคุณทำไม่ได้ตราบใดที่คุณยังคงดำเนินการตามกำหนดเวลาและสร้างรหัสคุณภาพ
Thomas Owens

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

6
@Brian ฉันคิดว่าคุณควรยอมรับพวกเขาไม่ว่าผู้อื่นจะใช้พวกเขาหรือไม่ บางทีการแสดงแนวปฏิบัติที่ดีอาจทำให้คนอื่นติดตาม
CaffGeek

คำตอบ:


20

งานของ coder คือการสร้างสิ่งต่าง ๆ

หน้าที่ของผู้ทดสอบคือการแบ่งสิ่งต่าง ๆ

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


27
-1 งานของ coder คือการสร้างสิ่งที่ทำงาน นั่นมักจะเกี่ยวข้องกับการทดสอบจำนวนหนึ่ง ฉันยอมรับว่าจำเป็นต้องมีบทบาทผู้ทดสอบแยกต่างหาก แต่มันไม่ใช่แนวป้องกันเพียงอย่างเดียว
Matthew Rodatus

8
@ Matthew Rodatus - จำนวนการทดสอบที่เกี่ยวข้องกับด้าน coder มีจุดประสงค์เพื่อตรวจสอบว่าสิ่งที่ควรใช้งานได้จริง ในด้านผู้ทดสอบจุดมุ่งหมายคือการหาจุดบกพร่องไม่ใช่เพื่อสังเกตว่ารหัสทำงาน
mouviciel

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

2
@mouviciel - ขั้วที่ผิดพลาด งานของ coder คือการสร้างสิ่งต่าง ๆ ที่ใช้งานได้และเขาก็ทำเช่นนั้นโดยการคิด a-Priori ภายใต้เงื่อนไขที่รหัสของเขาควรจะทำงาน อย่างน้อยที่สุดโดยการสร้างการทดสอบแบบทำลายล้าง + การวิเคราะห์ขอบเขต ad-hoc (อีกครั้งอย่างน้อยที่สุด ) นอกจากนี้ coder ที่ดียังใช้งานได้กับข้อมูลจำเพาะและข้อกำหนด (เมื่อถูกต้อง) สามารถทดสอบได้เสมอ ดังนั้น coder ที่ดีจึงพัฒนาการทดสอบที่ตรวจสอบความต้องการเหล่านี้ในโค้ด (และคุณมักจะทำโดยการเขียน req. การทดสอบที่ล้มเหลวตั้งแต่แรกจนกระทั่งคุณมีรหัสที่ผ่านการทดสอบ)
luis.espinal

2
@Dave Lasley - นี่คือประเด็นของฉัน: สถาปนิกไม่ใช่คนที่ดีที่สุดในการล้มบ้านของเขา: เขาภูมิใจเกินไปที่จะเห็นความบกพร่องที่แข็งแกร่ง มีเพียงสถาปนิกคนอื่น (ไม่ใช่คนที่อยู่นอกถนน) เท่านั้นที่สามารถนำสายตาไปที่บ้านและพบว่าบ้านอาจพังภายใต้เงื่อนไขบางประการที่สถาปนิกคนเดิมตาบอดเกินไปที่จะจินตนาการ
mouviciel

14

Franciso ฉันจะตั้งสมมติฐานที่นี่ตามสิ่งที่คุณพูด:

"เราไม่ได้ทำ TDD หรือการทดสอบหน่วยมันจะช่วยฉันได้มาก แต่ก็ไม่มีโอกาสที่มันจะเปลี่ยนไป"

จากนี้ฉันสงสัยว่าทีมของคุณไม่ได้ให้ความสำคัญกับการทดสอบหรือการจัดการมากนักจะไม่ให้เวลากับทีมในการลองและจัดระเบียบโค้ดที่มีอยู่และรักษาหนี้ทางเทคนิคให้น้อยที่สุด

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

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

การดูแลรหัสของคุณและคุณภาพของผลิตภัณฑ์ที่คุณพัฒนานั้นเป็นคุณสมบัติที่ดีและเป็นสิ่งที่คุณต้องการให้กำลังใจในคนอื่น ๆ


11

หากคุณโค้ดใน C, Objective-C หรือ C ++ คุณสามารถใช้CLang Static Analyzerเพื่อวิจารณ์แหล่งที่มาของคุณโดยไม่ต้องเรียกใช้จริง

มีเครื่องมือการดีบักหน่วยความจำที่มีอยู่: ValGrind, Guard Malloc บน Mac OS X, รั้วไฟฟ้าบน * NIX

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

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

ใช้การยืนยัน - แมโคร assert () ใน C, C ++ และ Objective-C หากภาษาของคุณไม่มีฟังก์ชั่นยืนยันให้เขียนด้วยตัวคุณเอง

ใช้การยืนยันอย่างอิสระแล้วปล่อยไว้ในรหัสของคุณ ฉันเรียก assert () "การทดสอบที่ดำเนินการทดสอบ" ฉันใช้มันบ่อยที่สุดเพื่อตรวจสอบสิ่งที่จำเป็นเบื้องต้นที่จุดเข้าใช้งานส่วนใหญ่ของฉัน นั่นเป็นส่วนหนึ่งของ "Programming by Contract" ซึ่งสร้างขึ้นในภาษาโปรแกรมไอเฟล อีกส่วนคือ postconditions นั่นคือใช้ assert () ที่ function return points แต่ฉันพบว่าฉันไม่ได้รับไมล์สะสมเท่าที่จำเป็น

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

ดังนั้นฟังก์ชั่นสมาชิกทุกคนสามารถตรวจสอบค่าคงที่เมื่อเข้าและออกและชั้นเรียนสามารถกำหนดฟังก์ชั่นที่เรียกว่า CheckInvariant ว่ารหัสอื่นใดสามารถเรียกได้ตลอดเวลา

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

(ด้วยเหตุผลบางอย่างที่ฉันไม่เคยทำในขณะที่ BeOS สามารถทำงานได้โดยไม่ต้องสลับไฟล์มันก็ไม่เสถียรอย่างนั้น Dominic Giampaolo ผู้เขียนระบบไฟล์ BFS กระตุ้นให้ฉันไม่เรียกใช้ BeOS โดยไม่ต้องสลับฉันไม่ ดูว่าทำไมเรื่องนี้ถึงมีความสำคัญ แต่ต้องเป็นสิ่งประดิษฐ์ในการนำไปใช้บางประเภท)

คุณควรทดสอบการตอบสนองของรหัสต่อข้อผิดพลาด I / O ลองจัดเก็บไฟล์ทั้งหมดของคุณบนเครือข่ายที่ใช้ร่วมกันแล้วถอดสายเคเบิลเครือข่ายของคุณในขณะที่แอปของคุณมีภาระงานสูง ปลดสายเคเบิลในทำนองเดียวกัน - หรือปิดระบบไร้สายของคุณ - หากคุณกำลังสื่อสารผ่านเครือข่าย

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

ลองฆ่าแอพของคุณด้วยตัวดีบั๊กเกอร์หรือ "kill -9" บน * NIX ขณะที่มันกำลังเขียนไฟล์ขนาดใหญ่ที่สำคัญ หากแอปของคุณได้รับการออกแบบมาอย่างดีไฟล์ทั้งหมดจะถูกเขียนหรือจะไม่ถูกเขียนเลยหรืออาจจะเขียนเพียงบางส่วนสิ่งที่เขียนจะไม่เสียหายกับข้อมูลที่บันทึกไว้ว่าสามารถใช้งานได้โดยสมบูรณ์ แอพเมื่ออ่านไฟล์อีกครั้ง

ฐานข้อมูลมักมีดิสก์ I / O ที่ป้องกันความผิดพลาดอยู่เสมอ แต่แอพประเภทอื่น ๆ แม้ว่าระบบไฟล์ที่ถูกเจอร์นัลจะป้องกันความเสียหายของระบบไฟล์ในกรณีที่ไฟฟ้าขัดข้องหรือล่ม แต่ก็ไม่ได้ทำอะไรเลยเพื่อป้องกันความเสียหายหรือการสูญหายของข้อมูลของผู้ใช้ นั่นเป็นความรับผิดชอบของแอ็พพลิเคชันผู้ใช้ แต่แทบจะไม่ได้มีฐานข้อมูลใด ๆ เลยที่จะยอมรับข้อผิดพลาดได้


1
+1 คำแนะนำการปฏิบัติจำนวนมากที่ไม่ต้องการการสนับสนุนจากคนอื่น สิ่งเดียวที่ฉันต้องการเพิ่มคือว่ายืนยันสำหรับการจัดเก็บเอกสารและการตรวจสอบสภาพที่ไม่สามารถล้มเหลวเว้นแต่จะมีข้อผิดพลาดในรหัส ไม่เคยยืนยันสิ่งที่จะล้มเหลวเนื่องจาก 'โชคร้าย' เช่นเป็นไฟล์ที่สำคัญไม่ได้ถูกพบหรือการป้อนข้อมูลที่ไม่ถูกต้อง ฯลฯ
เอียน Goldby

10

เมื่อฉันดูการทดสอบรหัสของฉันฉันมักจะผ่านกระบวนการคิดต่างๆ:

  1. ฉันจะแบ่ง "สิ่งที่" นี้ออกเป็นชิ้นขนาดที่ทดสอบได้อย่างไร ฉันจะแยกสิ่งที่ฉันต้องการทดสอบได้อย่างไร ฉันควรสร้างสตับ / mocks อะไร
  2. สำหรับแต่ละอัน: ฉันจะทดสอบกลุ่มนี้ได้อย่างไรเพื่อให้แน่ใจว่าตอบสนองอย่างถูกต้องกับชุดอินพุตที่ถูกต้องที่เหมาะสม?
  3. สำหรับแต่ละกลุ่ม: ฉันจะทดสอบว่ากลุ่มตอบรับอย่างถูกต้องกับอินพุตที่ไม่ถูกต้องได้อย่างไร (ตัวชี้ NULL ค่าที่ไม่ถูกต้อง)
  4. ฉันจะทดสอบขอบเขตได้อย่างไร (เช่นค่าที่ไปจากการลงชื่อเข้าสู่แบบไม่ลงนาม 8 บิตถึง 16 บิต ฯลฯ )
  5. การทดสอบของฉันครอบคลุมรหัสได้ดีเพียงใด มีเงื่อนไขอะไรบ้างที่ฉันพลาดไป? [นี่เป็นสถานที่ที่ยอดเยี่ยมสำหรับเครื่องมือครอบคลุมรหัส] หากมีรหัสที่พลาดและไม่สามารถดำเนินการได้จำเป็นต้องมีหรือไม่ [นั่นเป็นคำถามอื่นทั้งหมด!]

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

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


5

นอกเหนือจากคำแนะนำที่ให้ไว้ในคำตอบอื่น ๆ ฉันขอแนะนำให้ใช้เครื่องมือวิเคราะห์แบบคงที่ (Wikipedia มีรายการเครื่องมือวิเคราะห์แบบคงที่จำนวนหนึ่งสำหรับภาษาต่างๆ ) เพื่อค้นหาข้อบกพร่องที่อาจเกิดขึ้นก่อนการทดสอบเริ่มต้น ความสามารถในการทดสอบของโค้ดเช่นความซับซ้อนของวงจร , มาตรการความซับซ้อนของ Halsteadและการทำงานร่วมกันและการมีเพศสัมพันธ์ (คุณสามารถวัดสิ่งเหล่านี้ได้ด้วยการใช้พัดลมเข้าและออก)

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


1
+1 สำหรับความซับซ้อนของวัฏจักร "ฉันพบว่ามันยากมากที่จะทำตามเส้นทางที่เป็นไปได้ทั้งหมดเพื่อหาข้อบกพร่อง" บอกเป็นนัยว่ารหัสของ OP อาจต้องแบ่งออกเป็นชิ้นเล็ก ๆ ที่ซับซ้อนน้อยลง
Toby

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

3

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

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


3

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

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

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


1
+1 สำหรับการกล่าวถึงสิ่งต่าง ๆ จากมุมมองของผู้ใช้
Matthew Rodatus

3

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

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

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

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


2
  • เขียนแบบทดสอบก่อนเขียนรหัส
  • เมื่อใดก็ตามที่คุณแก้ไขข้อผิดพลาดที่ไม่ได้รับการทดสอบให้เขียนการทดสอบเพื่อตรวจจับข้อบกพร่องนั้น

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


2

นอกจากความคิดเห็นอื่น ๆ ทั้งหมดเนื่องจากคุณบอกว่าเพื่อนร่วมงานของคุณเก่งในการเขียนแบบทดสอบที่ไม่มีความสุขทำไมไม่ลองให้พวกเขาจับคู่กับคุณในการเขียนการทดสอบ

วิธีที่ดีที่สุดในการเรียนรู้คือดูว่ามันทำไปแล้วและดึงสิ่งที่คุณเรียนรู้มาจากสิ่งนั้น


2

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

ตอนนี้เนื่องจากคุณอาจไม่ต้องการทำการพัฒนาที่ขับเคลื่อนการทดสอบ ...

ใส่การตรวจสอบความถูกต้องของข้อมูลที่เข้ามาทั้งหมด อย่าไว้ใจใคร เฟรมเวิร์ก. net มีข้อยกเว้นมากมายขึ้นอยู่กับอาร์กิวเมนต์ที่ไม่ถูกต้องการอ้างอิงที่เป็นโมฆะและสถานะที่ไม่ถูกต้อง คุณควรนึกถึงการใช้การตรวจสอบความถูกต้องของอินพุตบนเลเยอร์ UI ดังนั้นจึงเป็นกลอุบายเดียวกันในมิดเดิลแวร์

แต่คุณควรทำการทดสอบอัตโนมัติบางประเภท สิ่งนั้นช่วยชีวิต


2

จากประสบการณ์ของฉัน

หน่วยทดสอบถ้ามันไม่อัตโนมัติอย่างสมบูรณ์ก็ไม่มีประโยชน์ มันเป็นเหมือนเจ้านาย Pointy Haired ที่สามารถซื้อได้ ทำไมเพราะหน่วยทดสอบสัญญาให้คุณประหยัดเวลา (และเงิน) โดยอัตโนมัติกระบวนการทดสอบบางอย่าง แต่เครื่องมือของหน่วยทดสอบบางตัวทำในสิ่งที่ตรงกันข้ามมันบังคับให้โปรแกรมเมอร์ทำงานในรูปแบบแปลก ๆ และบังคับให้ทำแบบทดสอบมากเกินไป ส่วนใหญ่จะไม่ประหยัดเวลาทำงาน แต่เพิ่มเวลาในการย้ายจาก QA ไปยังนักพัฒนา

UML เป็นอีกครั้ง waster ไวท์บอร์ด + ปากกาเดียวสามารถทำได้เหมือนกันถูกกว่าและรวดเร็ว

BTW วิธีการเขียนโปรแกรมที่ดี (และหลีกเลี่ยงข้อบกพร่อง)?

  • a) อะตอมมิกซิตี้ ฟังก์ชั่นเดียวที่ทำได้ง่าย ๆ (หรืองานเดี่ยวสองสามอย่าง) เนื่องจากเข้าใจง่ายจึงติดตามได้ง่ายและแก้ไขได้ง่าย

  • b) homology ตัวอย่างเช่นถ้าคุณเรียกฐานข้อมูลโดยใช้ขั้นตอนการจัดเก็บจากนั้นทำรหัสที่เหลือ

  • c) ระบุลดและแยก "รหัสโฆษณา" รหัสส่วนใหญ่เป็นสำเนา & วางค่อนข้างสวย โค้ดโฆษณานั้นตรงกันข้ามรหัสที่ใหม่และทำหน้าที่เป็นต้นแบบมันสามารถล้มเหลวได้ รหัสนี้มีแนวโน้มที่จะเกิดข้อผิดพลาดทางตรรกะดังนั้นจึงเป็นสิ่งสำคัญที่จะลดแยกและระบุมัน

  • d) รหัส "น้ำแข็งบาง" เป็นรหัสที่คุณรู้ว่ามันเป็น "ไม่ถูกต้อง" (หรืออาจเป็นอันตราย) แต่ยังคงต้องการเช่นรหัสที่ไม่ปลอดภัยสำหรับกระบวนการหลายภารกิจ หลีกเลี่ยงถ้าคุณสามารถ

  • e) หลีกเลี่ยงรหัสกล่องดำซึ่งรวมถึงรหัสที่คุณไม่ได้ทำ (ตัวอย่างเช่นเฟรมเวิร์ก) และนิพจน์ทั่วไป มันง่ายที่จะพลาดบั๊กด้วยโค้ดประเภทนี้ ตัวอย่างเช่นฉันทำงานในโครงการโดยใช้ Jboss และฉันไม่พบข้อผิดพลาด 10 ข้อใน Jboss (ใช้รุ่นที่เสถียรล่าสุด) มันเป็น PITA ที่จะค้นหาสิ่งเหล่านั้น หลีกเลี่ยงการไฮเบอร์เนตเป็นพิเศษมันซ่อนการใช้งานดังนั้นข้อบกพร่อง

  • f) เพิ่มความคิดเห็นในรหัสของคุณ

  • g) อินพุตของผู้ใช้เป็นแหล่งของข้อบกพร่อง ระบุมัน ตัวอย่างเช่น SQL Injection เกิดจากอินพุตของผู้ใช้

  • h) ระบุองค์ประกอบที่ไม่ดีของทีมและแยกงานที่ได้รับมอบหมาย โปรแกรมเมอร์บางคนมีแนวโน้มที่จะสกรูรหัส

  • i) หลีกเลี่ยงรหัสที่ไม่จำเป็น ยกตัวอย่างเช่นถ้าคลาสต้องการอินเตอร์เฟสจากนั้นใช้มันมิฉะนั้นหลีกเลี่ยงการเพิ่มรหัสที่ไม่เกี่ยวข้อง

a) และ b) เป็นกุญแจสำคัญ ตัวอย่างเช่นฉันมีปัญหากับระบบเมื่อฉันคลิกปุ่ม (บันทึก) มันไม่ได้บันทึกฟอร์ม จากนั้นฉันก็ทำรายการตรวจสอบ:

  • ปุ่มใช้งานได้หรือไม่ ... ใช่
  • เก็บฐานข้อมูลบางอย่าง ไม่ดังนั้นข้อผิดพลาดอยู่ในขั้นตอนกลาง
  • แล้วคลาสที่จัดเก็บในฐานข้อมูลทำงานอย่างไร ไม่ <- ตกลงฉันพบข้อผิดพลาด (มันเกี่ยวข้องกับการอนุญาตฐานข้อมูล) จากนั้นฉันตรวจสอบไม่เพียง แต่ขั้นตอนนี้ แต่ทุกขั้นตอนที่ทำเหมือนกัน (เพราะความคล้ายคลึงกันของรหัส) ฉันใช้เวลา 5 นาทีในการติดตามข้อผิดพลาดและ 1 นาทีในการแก้ปัญหา (และข้อบกพร่องอื่น ๆ อีกมากมาย)

และ sidenote

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


2

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

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

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

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

2

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

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

ส่วนหนึ่งฉันเทศนาตัวเองที่นี่เพราะฉันทำสิ่งนี้ให้น้อยลงกว่าที่ฉันรู้

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