การทดสอบคำขอ HTTP: เครื่องมือเอาตัวรอดของนักพัฒนา

เผยแพร่แล้ว: 2022-03-11

จะทำอย่างไรเมื่อชุดทดสอบไม่สามารถทำได้

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

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

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

การทดสอบอัตโนมัติ

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

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

การทดสอบหน่วย

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

 test “should return active users” do active_user = create(:user, active: true) non_active_user = create(:user, active: false) result = User.active assert_equal result, [active_user] end

การทดสอบการทำงาน

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

หมายเหตุ: ตัวอย่างทั้งหมดของเราอยู่ใน Ruby

 test "should get index" do get :index assert_response :success assert_not_nil assigns(:object) end

การทดสอบบูรณาการ

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

 test "login and browse site" do # login via https https! get "/login" assert_response :success post_via_redirect "/login", username: users(:david).username, password: users(:david).password assert_equal '/welcome', path assert_equal 'Welcome david!', flash[:notice] https!(false) get "/articles/all" assert_response :success assert assigns(:articles) end

การทดสอบในโลกอุดมคติ

การทดสอบได้รับการยอมรับอย่างกว้างขวางในอุตสาหกรรมนี้และเป็นเรื่องที่สมเหตุสมผล การทดสอบที่ดีช่วยให้คุณ:

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

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

ที่เกี่ยวข้อง: การทดสอบหน่วย, วิธีเขียนโค้ดที่ทดสอบได้ และเหตุใดจึงสำคัญ

การทดสอบในโลกแห่งความจริง

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

เวลา/กำหนดเวลา

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

ปัญหาลูกค้า

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

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

ขาดความรู้

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

'งานเยอะมาก'

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

สุดท้าย แต่ไม่ท้ายสุด ข้อสอบเขียนยาก และนักเรียนวิทยาศาสตร์คอมพิวเตอร์ไม่ได้รับการฝึกฝน

โอ้ และการปรับโครงสร้างใหม่ด้วยการทดสอบหน่วยก็ไม่สนุก

ความแตกต่างในความคิดเห็น

ในความคิดของฉัน การทดสอบหน่วยมีความสมเหตุสมผลสำหรับตรรกะของอัลกอริทึม แต่ไม่มากสำหรับการประสานงานโค้ดที่มีชีวิต

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

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

แต่คุณต้องการการทดสอบบางอย่าง

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

สิ่งที่ฉันใช้แทน

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

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

ที่เกี่ยวข้อง: จ้างวิศวกร QA อิสระ 3% อันดับแรก

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

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

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

ในทางปฏิบัติ: การทดสอบด้วยคำขอ HTTP

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

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

 # testing for fatal error http_code = `curl -X #{route[:method]} -s -o /dev/null -w "%{http_code}" #{Rails.application.routes.url_helpers.articles_url(host: 'localhost', port: 3000) }` if http_code !~ /200/ return “articles_url returned with #{http_code} http code.” end # testing for content active_user = create(:user, name: “user1”, active: true) non_active_user = create(:user, name: “user2”, active: false) content = `curl #{Rails.application.routes.url_helpers.active_user_url(host: 'localhost', port: 3000) }` if content !~ /#{active_user.name}/ return “Content mismatch active user #{active_user.name} not found in text body” #You can customise message to your liking end if content =~ /#{non_active_user.name}/ return “Content mismatch non active user #{active_user.name} found in text body” #You can customise message to your liking end

เส้น curl -X #{route[:method]} -s -o /dev/null -w "%{http_code}" #{Rails.application.routes.url_helpers.articles_url(host: 'localhost', port: 3000) } ครอบคลุมกรณีทดสอบจำนวนมาก วิธีใดก็ตามที่ทำให้เกิดข้อผิดพลาดในหน้าของบทความจะถูกจับที่นี่ ดังนั้นจึงครอบคลุมโค้ดหลายร้อยบรรทัดในการทดสอบครั้งเดียว

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

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

 ids = Article.all.select { |post| `curl -s -o /dev/null -w “%{http_code}” #{Rails.application.routes.url_helpers.article_url(post, host: 'localhost', port: 3000) }`.to_i != 200).map(&:id) return ids

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

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

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

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

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

ทดสอบหนึ่ง

ตรวจสอบว่าหน้ากลับมาโดยไม่มีข้อผิดพลาดร้ายแรง

ทดสอบหนึ่งครั้งตรวจสอบว่าหน้าเว็บกลับมาโดยไม่มีข้อผิดพลาดร้ายแรง

สังเกตว่าฉันสร้างรายการปลายทางทั้งหมดสำหรับ Post และทำซ้ำเพื่อตรวจสอบว่ามีการแสดงผลแต่ละหน้าโดยไม่มีข้อผิดพลาดอย่างไร สมมติว่าทุกอย่างเป็นไปด้วยดี และแสดงหน้าเว็บทั้งหมดแล้ว คุณจะเห็นสิ่งนี้ในเทอร์มินัล: ➜ sample_app git:(master) ✗ ruby test/http_request/post_test.rb List of failed url(s) -- []

หากหน้าใดไม่แสดงผล คุณจะเห็นสิ่งนี้ (ในตัวอย่างนี้ หน้า posts/index page มีข้อผิดพลาดและไม่แสดงผล): ➜ sample_app git:(master) ✗ ruby test/http_request/post_test.rb List of failed url(s) -- [{:url=>”posts_url”, :params=>[], :method=>”GET”, :http_code=>”500”}]

ทดสอบสอง

ยืนยันว่าเนื้อหาที่คาดหวังทั้งหมดอยู่ที่นั่น:

การทดสอบที่สองยืนยันว่ามีเนื้อหาที่คาดหวังทั้งหมดอยู่ที่นั่น

หากพบเนื้อหาทั้งหมดที่เราคาดหวังในหน้า ผลลัพธ์จะเป็นดังนี้ (ในตัวอย่างนี้ เราตรวจสอบให้แน่ใจว่า posts/:id มีชื่อโพสต์ คำอธิบาย และสถานะ): ➜ sample_app git:(master) ✗ ruby test/http_request/post_test.rb List of content(s) not found on Post#show page with post id: 1 -- []

หากไม่พบเนื้อหาที่คาดหวังบนหน้า (ในที่นี้ เราคาดว่าหน้าจะแสดงสถานะของโพสต์ - 'ใช้งานอยู่' หากโพสต์มีการใช้งานอยู่ 'ปิดการใช้งาน' หากโพสต์ถูกปิดใช้งาน) ผลลัพธ์จะเป็นดังนี้: ➜ sample_app git:(master) ✗ ruby test/http_request/post_test.rb List of content(s) not found on Post#show page with post id: 1 -- [“Active”]

ทดสอบสาม

ตรวจสอบว่าหน้าแสดงผลในชุดข้อมูลทั้งหมด (ถ้ามี):

ทดสอบ 3 ตรวจสอบว่าหน้าแสดงผลในชุดข้อมูลทั้งหมด

หากหน้าเว็บทั้งหมดแสดงผลโดยไม่มีข้อผิดพลาด เราจะได้รายการที่ว่างเปล่า: ➜ sample_app git:(master) ✗ ruby test/http_request/post_test.rb List of post(s) with error in rendering -- []

หากเนื้อหาของบันทึกบางรายการมีปัญหาในการแสดงผล (ในตัวอย่างนี้ หน้าเว็บที่มี ID 2 และ 5 กำลังแสดงข้อผิดพลาด) ผลลัพธ์จะมีลักษณะดังนี้: ➜ sample_app git:(master) ✗ ruby test/http_request/post_test.rb List of post(s) with error on rendering -- [2,5]

หากคุณต้องการเล่นซอกับโค้ดสาธิตด้านบน นี่คือโครงการ github ของฉัน

ดังนั้นไหนดีกว่ากัน? มันขึ้นอยู่กับ…

การทดสอบคำขอ HTTP อาจเป็นทางออกที่ดีที่สุดของคุณหาก:

  • คุณกำลังทำงานกับเว็บแอป
  • คุณอยู่ในช่วงเวลาที่ลำบากและต้องการเขียนอะไรเร็วๆ นี้
  • คุณกำลังทำงานกับโปรเจ็กต์ใหญ่ โปรเจ็กต์ที่มีอยู่แล้วซึ่งไม่ได้เขียนการทดสอบ แต่คุณยังต้องการวิธีตรวจสอบโค้ด
  • รหัสของคุณเกี่ยวข้องกับคำขอและการตอบสนองอย่างง่าย
  • คุณไม่ต้องการใช้เวลาส่วนใหญ่ในการทดสอบ (ฉันอ่านที่ไหนสักแห่ง unit test = การบำรุงรักษานรก และฉันเห็นด้วยบางส่วนกับเขา/เธอ)
  • คุณต้องการทดสอบว่าแอปพลิเคชันทำงานกับค่าทั้งหมดในฐานข้อมูลที่มีอยู่หรือไม่

การทดสอบแบบดั้งเดิมเหมาะอย่างยิ่งเมื่อ:

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

ขอบคุณสำหรับการอ่านบทความ; ตอนนี้คุณควรมีวิธีการทดสอบที่คุณสามารถตั้งค่าเริ่มต้นได้ ซึ่งคุณสามารถวางใจได้เมื่อถึงเวลา

ที่เกี่ยวข้อง:
  • ประสิทธิภาพและประสิทธิภาพ: การทำงานกับ HTTP/3
  • เข้ารหัสไว้ ให้ปลอดภัย: การทำงานกับ ESNI, DoH และ DoT