วันพฤหัสบดีที่ 15 มีนาคม พ.ศ. 2561

Test-Driven Development with Python(Chapter 3)

เนื่องจากเดิมอันเดิมยาวและติดกันเกินไปทำให้ยากต่อการอ่าน
จึงแยก (Week 3-2) - (Week 5-1) Test-Driven Development with Python ออกเป็น 7 part

Chapter 3

เริ่มต้น chapter 3 ทำการสร้าง app ใน project superlists ของเราชื่อ app lists

ทดสอบใช้ tests.py ที่ django สร้างให้ใน default สร้าง app ขั้นต้นเป็น unittest ของเรา test ในมุมมองของผู้พัฒนา โดยในขั้นต้นลองเขียนทดสอบ function math ง่ายก่อนคือ 1+1 เท่ากับ 3 หรือไม่ ว่าจะเฟลเทสหรือไม่ ถ้าไม่เฟลแปลว่าเครื่องคอมพิวเตอร์ของเรามีปัญหา


เมื่อ test จะแสดง message ว่า 2 != 3 แสดงว่า machinery ทำงานปกติ
แล้วจึงทดสอบใช้ git status แสดงสถานะว่ามีไฟล์ไหนที่ยังไม่เพิ่มเข้ามาบ้าง แล้ว add app lists ที่เราสร้างขึ้นมาใหม่เข้าไปใน vcs ของเรา




ทดสอบ git diff --staged จะแสดงการเปลี่ยนเปลงเกี่ยวกับ commit



ทำการ commit โดยมี message ว่า "Add app for lists, with deliberately failing unit test"



ต่อมาทำการแก้ไฟล์ unit test ของเราโดย import home_page (ซึ่งยังไม่ได้สร้าง) จาก views.py ของ app



ทดสอบ run เกิด message (ไม่เป็นตามในหนังสือ) บอกว่าหา module ชื่อ 'django.core.urlresolvers' ไม่เจอ เกิดจากตอน import ที่อยู่ในหนังสือเป็นเวอร์ชันเก่า




จึงทำการค้นหาว่า version ใหม่กว่า (django 2.0) import อย่างไร





แล้วนำไปแก้ใน tests.py
หลังทำการแก้ จะแสดง message บอกว่า หา home_page เพราะยังไม่ได้สร้าง
จึงไปสร้าง home_page เป็นตัวแปรแบบง่ายๆเพื่อทดสอบ error message ของ unit test
เมื่อ run unit test จะติด test_root_url_resolves_to_home_page_view (lists.tests.HomePageTest) ฟังก์ชันเทสที่เราสร้างมา error โดยไม่เจอ url เพราะเรายังไม่ได้ทำการ map urls
โดยเครื่องคอมพิวเตอร์ติดปัญหาใช้ function เก่าของ django ซึ่งคือ url() ไม่ได้ จึงแก้ปัญหาโดยใช้ path แทน
ดังรูป


และทำการ import views ของ app lists แล้วจึงเพิ่ม path ของ home_page เข้าไปใน urls.py
เมื่อ run unit test จะแสดง TypeError เพราะ home_page ยังเป็นแค่ตัวแปร
ต่อมาเปลี่ยน home_page เป็น function ใน views.py
แล้วจึงลอง unit test จะผ่าน
ทำการ commit โดยมี message ว่า "First unit test and url mapping, dummy view"
หลังจากนั้นว่านึง link ของอาจารย์มีการ maintenance
จึงเปลี่ยนไปใช้ website ของต้นตำหรับ โดยหนังสือของต้นฉบับมีการ update เป็น version ใหม่เรียบร้อยทำให้ไม่ต้องกังวลเกี่ยวกับ version django เก่าใหม่อีกต่อไป


ต่อมาเพิ่ม unit test อีก 1 function คือ test ว่า home_page ของเรา return html กลับไปถูกหรือไม่
#1 : สร้าง httpRequest
#2 : ส่ง home_page view เป็น HttpResponse
#3 : กำหนด decode() เป็น utf-8 format
#4 : ตรวจสอบว่าเริ่มด้วย '<html>' หรือไม่
#5 : ตรวจสอบว่ามี '<title>To-Do lists</title>' ซักที่ใน html ของเราหรือไม่
#6 : ตรวจสอบว่าลงท้ายด้วย '</html>' หรือไม่
เมื่อรัน test จะแสดง typeError เพราะ home_page() ที่เราสร้างไม่ได้กำหนด argument
ทดสอบเพิ่ม argument ใน home_page
เมื่อรัน test จะแสดง AttributeError เพราะ ไม่มี attribute ภายใน home_page() (เรียกแล้ว pass เลย)
ทดสอบเพิ่ม return HttpResponse() กลับไป
เมื่อรัน test จะแสดง AssertionError เพราะยังไม่ได้ใส่ html code / สร้าง template html ใดๆ

ต่อมาทดสอบโดยการเพิ่มส่ง HttpResponse <html> กลับไป
ทดสอบอีกรอบ ก็จะติด assert ถัดไปใน test (#5 ในข้างต้น)
จึงเพิ่ม <title>To-Do lists</title> ตอน return HttpResponse เข้าไปอีก
ทดสอบอีกรอบ ก็จะติด assert ถัดไปใน test (#6 ในข้างต้น)
จึงเพิ่ม </html> ตอน return HttpResponse เข้าไปอีก
เมื่อทำทั้งหมดให้ตาม test แล้ว เมื่อ unit test แล้วจึง unit test ผ่าน
ต่อมารัน functional test จะถึงจุดที่จงใจ return fail message finish the test! พอดี

ถึงขั้นนี้จึงไกลพอที่จะ commit -am (คล้ายๆ -a แต่เพิ่ม message ตามหลังได้)
ต่อมาทดสอบดู log ที่เราทำมาเป็นแบบ --online โชว์รายละเอียดภายในบรรทัดเดียวแบบย่อๆ

ไม่มีความคิดเห็น:

แสดงความคิดเห็น