สิ่งที่ควรทดสอบใน Javascript


12

ที่ทำงานเราเพิ่งเริ่มต้นกับแอปพลิเคชันที่ใช้ Javascript เป็นหลัก (จริงๆแล้วใช้ Coffeescript แต่ก็ยัง) ซึ่งฉันได้ใช้ระบบทดสอบอัตโนมัติโดยใช้ JsTestDriver และแฟบริค

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

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

ดังนั้นสิ่งที่ควรทดสอบหน่วยใน Javascript?


3
คุณแยกรหัสจาวาสคริปต์ที่คุณเขียนไว้ในโมดูล จากนั้นคุณก็ทดสอบอินพุตและเอาต์พุตของโมดูลเหล่านั้น โมดูลใด ๆ ที่จัดการกับ DOM หมายความว่าคุณต้องทดสอบ DOM ใช้เครื่องมือที่ดีกว่าจากนั้น jsTestDriver
Raynos

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

1
@NathanHoad คุณเขียนการทดสอบหน่วยที่เรียกใช้ในเบราว์เซอร์เอง nodeunit, qunit และ jasmine เป็นเครื่องมือที่เหมาะสม เมื่อใช้งานในเบราว์เซอร์คุณจะต้องใช้ DOM คุณสามารถใช้เครื่องมือเช่น testling เพื่อทำการทดสอบเบราว์เซอร์อัตโนมัติ
Raynos

1
ขอบคุณ ฉันมองไปที่ jsTestDriver ตามที่อ้างว่าสามารถเรียกใช้ในเบราว์เซอร์ซึ่งในขณะที่ความจริงทางเทคนิคฉันพบว่าไม่เหมือนกับการทำงานกับ QUnit ฉันได้ทำงานกับเครื่องมือของตัวเองในขณะที่ใช้ QUnit กับแผงเครื่องมือดีบั๊ก debug แบบกำหนดเอง การใช้ซีลีเนียมฉันจะสามารถตรวจสอบการทดสอบที่ล้มเหลวได้ นอกจากนี้ฉันสงสัยว่าเจ้านายของฉันจะจ่ายเงินสำหรับ testling แม้ว่ามันจะดูดีทีเดียว!
Nathan Hoad

คำตอบ:


4

ทดสอบทุกสิ่งที่คุณทำได้

ตรรกะบริสุทธิ์สามารถทดสอบได้ง่าย

หากรหัสของคุณโต้ตอบกับ DOM หรือเครือข่ายมันจะยากกว่ามาก

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

โค้ดที่ใช้ Ajax สามารถทดสอบได้โดยการเรียกฟังก์ชัน callback พร้อมข้อมูลคงที่ ฉันมีการทดสอบบางอย่างที่ฉันเขียนทับ$.ajaxด้วยฟังก์ชันของตัวเอง เพียงให้แน่ใจว่าคุณใส่ของจริงกลับมาเมื่อคุณทำเสร็จแล้ว!

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

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


จัสมินสามารถเยาะเย้ยฟังก์ชั่นการโทรและข้อมูลการตอบสนองคุณอาจมองว่าแทนที่จะฟังก์ชั่นที่เอาชนะ
Steve

ฉันควรชี้แจง - เรามีฟังก์ชั่นและเช่นในแต่ละหน้า $(document).ready(...)ผมได้พูดคุยมากขึ้นเกี่ยวกับการทดสอบรหัสที่รันภายใน
Nathan Hoad

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

@SeanMcMillan - ฉันพบว่ามันยากมากที่จะทดสอบบางส่วนของแอปพลิเคชันที่มีผลกระทบต่อ DOM เท่านั้นตัวอย่างเช่นฟังก์ชันที่ผูกเหตุการณ์หลายอย่างกับองค์ประกอบ DOM บางอย่างเท่านั้น คุณจะตรวจสอบว่าเหตุการณ์เหล่านั้นถูกเขียนอย่างเหมาะสมได้อย่างไร? ไม่ใช่การทดสอบหน่วยสิ่งที่สามารถทำได้ แต่การคลิกและการตรวจสอบเบราว์เซอร์จริง (โดยใช้ซีลีเนียมหรืออะไรก็ตาม)
vsync

@vsync: คุณสามารถทดสอบได้ว่าตัวจัดการการคลิกถูกแนบมากับองค์ประกอบ DOM ที่ให้มาโดยง่าย ฉันไม่คิดว่าเป็นไปได้ที่จะทดสอบว่า 'คลิก' เป็นตัวจัดการที่ถูกต้องและคุณได้แนบไปกับองค์ประกอบที่เหมาะสม
Sean McMillan

5

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

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

ปลั๊กอิน jquery, btw, ไม่ใช่เรื่องง่ายต่อการทดสอบหน่วย


ทุกจุดที่ดี! ฉันยอมรับว่าพวกเขาไม่สามารถทดสอบหน่วยได้ง่ายขึ้นอยู่กับว่าพวกเขาเขียนอย่างไร
Nathan Hoad

-1

ฉันเคยทำงานกับ Java และจากสิ่งที่ฉันเห็นการทดสอบหน่วย Java ง่ายกว่าการทดสอบหน่วย JavaScript เพราะ Java มีความเข้มงวดมากขึ้น

ฉันขายการพัฒนาโดยใช้การทดสอบนั้นเป็นสิ่งที่ดีที่สุดดังนั้นฉันจึงสำรวจวิธีทดสอบหน่วย JavaScript ใน Java ฉันได้จำลองรหัสที่ทำให้การเชื่อมต่อกับฐานข้อมูล, Data Access Objects และฉันเปรียบเทียบกับรหัสใน JavaScript ที่เปลี่ยน DOM และรหัสที่ทำให้ AJAX โทรไปยังเซิร์ฟเวอร์

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

แนวทางอื่นคือกระบวนการรวมอย่างต่อเนื่องเพื่อส่งอีเมลโดยระบุว่าพบการทดสอบหน่วยที่ล้มเหลว

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