ถือว่าเป็น 'การปฏิบัติที่ไม่เหมาะสม' เพื่อตรวจสอบเนื้อหาของไฟล์ / การเข้ารหัสในการทดสอบหน่วยหรือไม่?


84

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

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

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

อย่างไรก็ตามเมื่อฉันส่งรหัสนี้ให้เพื่อนร่วมงานคนอื่น (ซึ่งเป็นหัวหน้าทีมของเราด้วย) ก็เดินมาหาฉันและบอกฉันว่าฉันไม่ควรทำสิ่งเหล่านี้อีกเพราะ:

"สิ่งเหล่านี้ไม่ได้อยู่ในการทดสอบหน่วย"

"การทดสอบหน่วยควรใช้เพื่อตรวจสอบการไหลของรหัสของคุณ"

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



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

8
ปัญหาของเพื่อนร่วมงานของคุณอย่างไรก็ตามเป็นไปได้ยากที่คุณจะทำการทดสอบเหล่านั้น ฉันจะมุ่งความสนใจไปที่การละทิ้งการอภิปราย / สงครามศักดิ์สิทธิ์ อาจเป็นไปได้ว่าการทดสอบเหล่านั้นช้าเกินไปสำหรับชุดที่คุณเพิ่มเข้าไป แต่ก็เป็นไปได้อย่างสิ้นเชิงว่าเพื่อนร่วมงานของคุณเพิ่งได้รับการแก้ไขตามแนวคิดของการทดสอบหน่วยและเป็นปัญหาจากปัญหาที่ไม่มีอยู่จริง ดังนั้นจึงเป็นการดีกว่าที่จะอธิบายให้ชัดเจนก่อนว่าปัญหาที่แท้จริงคืออะไร
gbr

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

5
แทนที่จะทดสอบว่าไฟล์มีเนื้อหาที่ถูกต้องและเข้ารหัสทำไมไม่ทดสอบว่ามันทำงานอย่างไร
immibis

คำตอบ:


156

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

ฉันจะไม่มุ่งเน้นไปที่สิ่งที่เป็นหรือไม่ทดสอบหน่วยและตระหนักว่าแม้ว่าการทดสอบการรวมมันอาจมีค่าในการทดสอบ


ความคิดเห็นไม่ได้มีไว้สำหรับการอภิปรายเพิ่มเติม การสนทนานี้ได้รับการย้ายไปแชท
โธมัสโอเวนส์

36

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

ปัญหาที่ฉันพยายามแก้ไขคืออะไร

โดยคำอธิบายคุณต้องตรวจสอบว่าสคริปต์ฐานข้อมูลใด ๆ ปฏิบัติตามมาตรฐานบางอย่าง

มีเครื่องมือ / กระบวนการใดบ้างที่สามารถใช้แก้ปัญหาได้

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

หากคุณสร้างส่วนหนึ่งของโครงสร้างพื้นฐานการสร้างของคุณเช่นการรวมไว้ใน Jenkins หรืออะไรทำนองนั้นมันสามารถใช้กับไฟล์ SQL ทั้งหมดในโครงการของคุณ

หน่วยทดสอบจะแก้ปัญหาสำหรับไฟล์ปัจจุบันของคุณเท่านั้น

ฉันจะสื่อสารความต้องการเครื่องมือได้อย่างไร

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

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


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

1
@ jpmc26 ฉันเห็นด้วยอย่างยิ่ง การสนทนาควรเริ่มต้นด้วยความจริงที่ว่าคุณเสียเวลาไปหลายชั่วโมงเพื่อหาว่ามีอะไรผิดปกติและการทดสอบหน่วยของคุณเป็นความพยายามครั้งแรกของคุณในการป้องกันไม่ให้ทีมที่เหลือเสียเวลาเท่ากัน อย่างไรก็ตามการทำงานร่วมกับหัวหน้าทีมที่ต้องตอบรับการจัดการและผู้มีส่วนได้ส่วนเสียมักจะได้รับความนิยมอย่างมาก ในฐานะหัวหน้าทีมฉันต้องการปกป้องเครื่องมือ / แนวทางปฏิบัติ / รหัสที่เราจัดการ ถ้าฉันเห็นการทดสอบหน่วยที่ไม่สามารถติดตามความต้องการที่แท้จริงได้ฉันก็น่าเป็นห่วงเช่นกัน
Berin Loritsch

1
@BerinLoritsch ในทางเทคนิคแล้วมันไม่ใช่การทดสอบหน่วยฉันอยากรู้ว่า "เทคนิค" อะไรที่คุณใช้ในการยืนยันนี้ เท่าที่ฉันสามารถบอกได้ไม่มีคำจำกัดความที่เป็นทางการของการทดสอบหน่วยและทุกคนต่างก็มีความคิดของตัวเองว่า " พวกเขา " คืออะไร
gbr

2
@gbr มีข้อตกลงแบบไม่เป็นทางการระหว่างนักพัฒนาที่การทดสอบหน่วยเป็นการทดสอบที่ทำงานแยกจากระบบภายนอก พวกเขาทดสอบรหัสเท่านั้นเองไม่ได้โต้ตอบกับไฟล์ฐานข้อมูลหรือบริการภายนอกอื่น ๆ วิกิพีเดียไม่เข้าใจเอกสารนี้: en.wikipedia.org/wiki/Unit_testing#External_work
jpmc26

1
@BerinLoritsch อาจเป็นไปได้ว่าเราทุกคนตีความคำถามในลักษณะที่แตกต่างกันอย่างไรก็ตามมันไม่ละเอียดมากนักและผู้เขียนยังไม่ได้กลับมาหาใครเลย ฉันไม่สนใจที่จะพูดคุยเพิ่มเติมเกี่ยวกับการจำแนกประเภทของการทดสอบเหล่านี้อย่างไรก็ตามสิ่งที่สำคัญคือถ้าพวกเขาควรมีอยู่ (ฉันค่อนข้างแน่ใจว่าพวกเขาควรจะ) และความถี่ที่จะให้พวกเขาทำงาน (ทุกครั้งที่เปลี่ยน IDE กระทำในท้องถิ่นทุกครั้งที่กดไปยังที่เก็บส่วนกลางทุก ๆ เวลาทีโอที ... )
gbr

19

เป็นการดีที่จะเรียกใช้การทดสอบที่เข้าถึงไฟล์ "การทดสอบหน่วย"

เขา: "สิ่งเหล่านี้ไม่ได้อยู่ในการทดสอบหน่วย"

คุณ: "เข้าท่า แต่ฉันไม่สามารถหาที่ที่ดีกว่าที่จะวางพวกเขาพวกเขาอยู่ที่ไหน?"

น่าเสียดายที่การทดสอบประเภทใดที่มีอยู่และวิธีการจัดระเบียบนั้นมีเฉพาะ บริษัท ทั้งหมด ดังนั้นคุณจะต้องค้นหาวิธีที่ บริษัท ของคุณจัดการกับการทดสอบเหล่านี้

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


2
เป็นการดีที่จะเรียกใช้การทดสอบที่เข้าถึงไฟล์ "การทดสอบหน่วย" นี่คือไฟล์ที่ถูกเข้าถึงคือไฟล์ต้นฉบับ มันจะเข้าถึงได้มากเท่ากับไฟล์ต้นฉบับ (เพื่อแยกวิเคราะห์) ความจริงที่ว่าการทดสอบอาจไม่ได้ทำในภาษาเดียวกันของ "หน่วย" ที่กำลังตรวจสอบ (SQL) ทำให้มันไม่เป็นไปตามหลัก แต่ไม่ควรส่งผลกระทบต่อการจำแนกประเภทของมันเป็นการทดสอบแบบหน่วย ดำเนินการต่อ ...
gbr

1
... ที่จริงแล้วการเข้ารหัสที่ถูกต้องของไฟล์คือ "การทดสอบ" ที่คอมไพเลอร์ทำทุกครั้งที่อ่านไฟล์ต้นฉบับ นี่คือปัญหาคือการแปลไฟล์ภายนอกในเวลาทำงาน "การทดสอบคอมไพเลอร์" จะไม่ถูกเรียกใช้โดยอัตโนมัติดังนั้นจึงเหมาะสมอย่างยิ่งที่จะเพิ่มไฟล์เหล่านั้นอย่างชัดเจนและฉันคิดว่ามันสามารถถูกพิจารณาว่าเป็น "การทดสอบหน่วย" อย่างถูกต้อง ตัวอย่าง SQL และดูเหมือนว่าเหมาะสมที่จะรวมไว้ในชุดการทดสอบ (ที่มีศักยภาพ) ซึ่งทำงานในทุก ๆ การดัดแปลงของไฟล์
gbr

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

2
@Warbo มันเป็นวิธีปฏิบัติที่ไม่ดีในการเข้าถึงไฟล์ (โดยทั่วไป) และเหตุผล (ที่สำคัญที่สุด) ก็คือพวกเขาจะไม่ช้าถ้าพวกเขาเกี่ยวข้องกับ "GBs อ่านผ่านลิงค์ NFS ที่ไม่สม่ำเสมอ" พวกเขาจะช้าถ้าเช่นอ้าง Michael Feathers พวกเขาใช้เวลา 1 / 10th ของวินาที นั่นเป็นเพราะคุณต้องการเรียกใช้การทดสอบบ่อยที่สุดเท่าที่จะเป็นไปได้ในทุกการเปลี่ยนแปลงที่คุณทำใน IDE และเมื่อคุณมีการทดสอบจำนวนมาก (เท่าที่คุณควรจะเป็น) แม้แต่วินาทีที่ 10 ของวินาทีจะสะสมเป็นชั่วโมง (ดำเนินการต่อ ... )
gbr

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

14

Michael Feathers กล่าวสิ่งนี้ในหนังสือของเขาที่ทำงานอย่างมีประสิทธิภาพด้วยรหัสเดิม:

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

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

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


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

1
@gbr หากผลลัพธ์ของการทดสอบนั้นถูกต้องสิ่งอื่น ๆ ที่สำคัญคือการวิ่งเร็วแค่ไหน หากฉันมีการทดสอบ 100 ครั้งที่การทดสอบแต่ละครั้งใช้เวลาน้อยกว่า 0.1s พวกเขาจะทำงานในเวลาน้อยกว่า 10 วินาที ฉันยินดีที่จะเรียกใช้พวกเขาบ่อยครั้ง หากฉันมีการทดสอบ 1,000 ครั้งพวกเขาจะใช้เวลาไม่เกิน 1m40s นั่นนานเกินไปฉันจะไม่เรียกใช้งานพวกมันบ่อยนัก แต่ฉันจะเรียกใช้มันทันทีที่ฉันทำการเปลี่ยนแปลงด้วยการทดสอบกลุ่มเล็กกว่า 100 ครั้ง ฉันไม่สนใจว่ามันเป็นการทดสอบการยอมรับทางเทคนิคหรืออย่างอื่น ถ้าหากช่วยให้ฉันพบข้อผิดพลาดเร็วฉันจะทำโดยไม่คำนึงถึงความหมาย การทดสอบให้ค่าเมื่อเรียกใช้เท่านั้น
CJ Dennis

ฉันเห็นด้วยเป็นส่วนใหญ่ (ความเป็นอิสระเป็นอีกสิ่งที่สำคัญมากเช่น) แต่ถึงกระนั้นมันจะดีกว่าถ้า Michael Feathers ไม่ได้เพิ่มความสับสนเกี่ยวกับความหมายของ "การทดสอบหน่วย" ไม่ว่าเขาจะตำหนิโดยเฉพาะอย่างยิ่งสำหรับความสับสนนั้น (และหนังสือของเขาเป็นเลิศในส่วนที่ฉันขาดมันจนถึงตอนนี้) ฉันทำประเด็นค่อนข้างน้อยอยู่แล้ว
gbr

@ gbr เขาไม่ได้นิยามการทดสอบหน่วยใหม่เขาบอกว่าไม่ควรเป็นเกณฑ์ของคุณในการรวม เกณฑ์ของคุณควรมีประโยชน์และนั่นคือสิ่งที่เขากำหนด
CJ Dennis

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

10

ฉันได้เขียนการทดสอบที่คล้ายกันในบางครั้งกับไฟล์รหัสต้นฉบับไฟล์การกำหนดค่าและอื่น ๆ ฉันจะไม่เรียกพวกเขาว่าการทดสอบหน่วยเพราะ (a) พวกเขากำลังเข้าถึงระบบไฟล์และอาจไม่เร็วมาก (b) ฉันไม่สนใจว่าพวกเขาจะถูกดำเนินการในทุกการเช็คอิน (ตรงข้ามกับทุกคืนใน เซิร์ฟเวอร์ CI)

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

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


4

การทดสอบหน่วยนั้นเกี่ยวกับการทดสอบวิธีการหรือ 'หน่วย' ของรหัส คุณกำลังทดสอบกลุ่มตรรกะและรหัสที่เล็กที่สุดในซอฟต์แวร์ของคุณ

ต่อมาเมื่อคุณเข้าร่วมกับหน่วยอื่นคุณจะทำการทดสอบการรวม

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

SQL ของคุณเป็นรหัสเช่นเดียวกับภาษาที่มีระดับต่ำกว่าเช่น C # หรือ Java และควรทดสอบเช่นนี้ และการตรวจสอบและการตรวจสอบเป็นของทุกระดับการทดสอบ ดังนั้นการเข้ารหัสและชุดคำสั่ง SET จึงรวมอยู่ด้วย แต่ไม่จำเป็นต้องทำการทดสอบอย่างเฉพาะเจาะจง สิ่งทั่วไปเช่นการจบบรรทัดหรือการปิดล้อมคุณสามารถใช้ตะขอหรือคุณสมบัติ SCM

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

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

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


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

@Warbo - ฉันจะเรียกว่าใกล้การทดสอบการรวม (แต่ไม่) การทดสอบหน่วยไม่ต้องการอะไรมากหรือมากเกินไป การทดสอบหน่วยควรมีขนาดเล็กและรวดเร็ว การทดสอบโดยการใช้งานจริงนำไปสู่สิ่งที่คุณอธิบาย .. การทดสอบที่เปราะบางนั้นเป็นสิ่งที่มีขนาดใหญ่กว่าหรือทำมากกว่าที่ควร 2. สูงมาก 3. ไม่มีความรับผิดชอบเดียว
Ross

3

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

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

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


2

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

git add -p

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

ในกรณีที่การเข้ารหัสไฟล์ทั้งหมดเปลี่ยนแปลงสิ่งต่าง ๆ จะเกิดขึ้น: อัลกอริทึมจะล้มเหลวในการกระจายไฟล์เก่าและใหม่ดังนั้นจึงgit add -pไม่เพิ่มอะไรเลย นี่จะปรากฏให้เห็นในคำสั่งอื่นที่ฉันทำก่อนการกระทำใด ๆ คือ

git status

ที่นี่คุณจะได้เห็นไฟล์เน้นด้วยสีแดงแสดงให้เห็นว่ามีมีการเปลี่ยนแปลง การตรวจสอบว่าทำไมสิ่งเหล่านี้ไม่ได้ทำให้git add -pเกิดปัญหาอย่างรวดเร็วจะทำให้ชัดเจน


อธิษฐานบอกว่าสิ่งนี้จะช่วยผู้พัฒนาในอนาคตให้หลีกเลี่ยงปัญหาเดียวกันได้อย่างไร? ... สิ่งที่เกี่ยวกับการทดสอบแบบอัตโนมัติ (ยังถูกต้องเกี่ยวกับการยืนยันและการออกแบบโดยสัญญา) คือการที่พวกเขาจะดี ERM, อัตโนมัติ
vaxquis

@vaxquis มันช่วยป้องกันปัญหาเดียวกันที่แน่นอน - แม้ว่าจะค่อนข้างบังเอิญ, เป็นผลข้างเคียงของเวิร์กโฟลว์ที่เป็นความคิดที่ดีสำหรับเหตุผลที่แตกต่างกัน ประเด็นของฉันคือปัญหานี้อาจเกิดขึ้นได้ทั้งหมดแสดงให้เห็นว่าทีมของ OP ไม่ได้ใช้ประโยชน์จาก VCS ของพวกเขาได้ดีมาก - ไม่มีสิ่งใดเทียบกับการทดสอบอัตโนมัติ แต่ค่าของมันคือการทดสอบคุณสมบัติความหมายซึ่งอาจแตกหักโดยการเปลี่ยนแปลงอย่างไม่มีเหตุผลกับตรรกะของโปรแกรม ไม่ได้ตรวจสอบวิธีโง่ ๆ ที่เป็นไปได้ซึ่งซอร์สโค้ดอาจเปลี่ยนแปลง
leftaroundabout

ด้วยเหตุผลของคุณเราไม่จำเป็นต้องคาดเข็มขัดนิรภัย เราก็ต้องขับรถอย่างระมัดระวังมากขึ้นและก่อให้เกิดอุบัติเหตุน้อย ... คุณพลาด OP จุดหลักยกระดับ - ของข้อผิดพลาดของมนุษย์ VCSไม่สามารถปกป้องคุณได้ นอกจากนี้ FWIW: หากการทดสอบเป็นแบบอัตโนมัติก็ควรเป็นแบบอัตโนมัติ มนุษย์เป็นจุดอ่อนที่สุดในกระบวนการวิศวกรรม gitเป็นตัวอย่างที่ดีที่สุด - เครื่องมือที่ยอดเยี่ยม แต่แทบจะใช้ไม่ได้กับมนุษย์ทั่วไป
vaxquis

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

จากข้อมูลของ OP พบว่าไฟล์ในรูปแบบที่ไม่ถูกต้องเกิดขึ้นสองครั้งแล้วดังนั้นจึงมีแนวโน้มว่าจะเกิดขึ้นโดยบังเอิญ
gnasher729

1

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


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

1
"ความล้มเหลวเฉพาะตอนรันไทม์ทำให้แอปแข็งแกร่งขึ้นได้อย่างไร" ส่งข้อยกเว้นถ้าการตรวจสอบล้มเหลว ในการทดสอบของคุณเพียงแค่ตรวจสอบว่าส่วนของรหัสที่กำลังทดสอบส่งกลับผลลัพธ์ที่คาดไว้: นี่เป็นการลบภาระเพื่อตรวจสอบอีกหนึ่งเหตุผลสำหรับความล้มเหลว
ดร. Gianluigi Zane Zanettini

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

1
ฉันจะแนะนำสิ่งนี้ ข้อผิดพลาดคือรายละเอียดการใช้งาน ฉันคิดว่าคำตอบจะแตกต่างกันมากหากการเข้ารหัสซึ่งหลบอยู่ในเขตข้อมูลส่วนตัวมากกว่าไฟล์แบบสแตนด์อโลน! ดูเหมือนว่า OP จะมีปัญหา 2 ประการ: ไฟล์ทรัพยากรอาจมีการเข้ารหัสไม่ดีและการผลิตจะทำงานต่างจาก dev โดยการตรวจสอบไฟล์ที่ runtime ก่อนที่มันจะถูกใช้งานเราจะแก้ไขปัญหาที่สอง: dev และ prod จะโยนข้อผิดพลาดเดียวกัน การทดสอบหน่วยสามารถมุ่งเน้นไปที่การทำงานจริงมากกว่ารายละเอียดการใช้งาน การตรวจสอบ "ภายใน" เหล่านี้จะถูกใช้เช่นเดียวกับวิธีการส่วนตัว
Warbo

1
@ Dr.GianluigiZaneZanettini Bah ... ฉันยอมแพ้ ... อย่างที่ฉันเห็นคำตอบของคุณหลังจากคำอธิบายของคุณในความคิดเห็นดีที่สุดไม่ใช่หัวข้อ (ไม่ใช่คำตอบสำหรับคำถาม) แต่ในความเป็นจริงแล้ว มันผิดปกติธรรมดา! ไม่จำเป็นต้องเขียนการทดสอบเพิ่มเติม ??? ฉันไม่มีชื่อเสียงพอที่จะลงคะแนนได้ แต่ให้พิจารณาว่าฉันทำหรือไม่ และฉันไม่คิดว่าจะมีค่ามากนักในการดำเนินการสนทนานี้
gbr

1

การทดสอบเป็นรหัสเดียวกับที่อื่นและหากซับซ้อนเพียงพอก็จะได้รับประโยชน์จาก ... การทดสอบหน่วย ดูเหมือนง่ายที่สุดในการเพิ่มการตรวจสอบสิ่งที่จำเป็นก่อนหน้านี้ลงในการทดสอบโดยตรง

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

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


1
ผู้เขียนไม่ได้พูดทุกที่ว่าสคริปต์ SQL เป็นส่วนหนึ่งของการทดสอบบางอย่างคุณดูเหมือนจะมีคำถามที่ผิด
gbr

มียากที่จะเข้าใจฉันคิดว่าสคริปต์ SQL เป็นส่วนหนึ่งของการทดสอบ
h22

ความคิดเห็นของคุณ "ยากที่จะเข้าใจ" ...
gbr

ยากที่จะเข้าใจ. การลงคำถาม
h22

1

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

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

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

ฉันเคยใช้การทดสอบประเภทนี้อย่างกว้างขวางในอดีต - พวกเขาได้ช่วยเราเจ็บปวดอันเจ็บปวด


และถ้าใครซักคนอยากอธิบาย downvote ฉันก็จะซาบซึ้งมัน
Murph

1

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

SQL ไม่ใช่สิ่งที่สามารถทดสอบแยกได้ดังนั้นการทดสอบใด ๆ ของ SQL นั้นไม่ได้เป็นการทดสอบหน่วยและแน่นอนว่าสำหรับคำสั่ง SELECT นั้นเกือบจะแน่นอนว่ามีผลข้างเคียง เราสามารถเรียกมันว่าเป็นการทดสอบการรวมเข้าด้วยกันไม่ใช่การทดสอบหน่วย

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

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

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