วันเสาร์ที่ 7 กุมภาพันธ์ พ.ศ. 2558

TDD - 4 What Are We Doing with All These Tests?

Chapter 04 - What Are We Doing with All These Tests?  

ในการ test ครั้งนี้จะเป็นการ test ในส่วนของ การ รันค่าจากไฟล์ html ที่ตั้งให้เป็น
Home page ซึ่ง Home page ในที่นี้จะมีโค้ด HTML ที่จะ render ให้ client ผู้ซึ่ง request เข้ามา
โดย functional_tests.py นี้นั้นโดยที่รู้ ๆ กันอยู่ว่า เป็นในส่วนของกา


 รตรวจสอบการแสดงผลในมุมมองของผู้ใช้ว่ามี object นี้ไหม มีการแสดงผลที่ถูกต้องหรือเปล่า เมื่อให้ input เป็นในรูปแบบนี้แล้ว

output ตรงตาม concept ที่ตั้งใจไว้หรือเปล่า โดยจะมีการเรียกใช้ function ในการตรวจสอบ
อย่างเช่น self.assertIn('To-Do', self.browser.title)
เป็นการตรวจสอบค่า ที่อยู่ใน title ของ browser ของเราว่ามีคำว่า 'To-Do' หรือเปล่าหากไม่มีก็จะขึ้น error และปิดโปรแกรมลง ตามฟังก์ชัน teardown(self){...} (เป็นฟังก์ชันที่จะเรียกใช้เมื่อมีการ error)
ของ platform หรือมีการ return ค่าออกมาเป็น เท็จ (ไม่เห็น object)
ในตอนแรกนั้น functional_tests.py จะทำการเรียก server ที่รันไว้ ที่ localhost:8000 จากในบรรทัด
 self.browser.get('http://localhost:8000') โดย urls.py ก็จะทำหน้าที่ส่งต่อให้ function home_page ในไฟล์ lists/views.py โดยไฟล์ views.py นั้นก็จะทำหน้าที่โดยการแสดง home page ออกมา  ซึ่งโค้ดนั้นจะถูกตรวจสอบโดย test.py ว่าถูกต้องตามหลักไวยากรณ์ไหม มีแทกอะไรที่ขาดไปบ้างจาก platform ที่เราต้องการ 
เช่น ใช้ฟังก์ชั่น self.assertIn(b'<title>To-Do lists</title>', response.content)
หมายความว่าให้เช็คว่าในข้อความที่ได้ response ออกมานั้นมีคำว่า '<title>To-Do lists</title>' หรือไม่
หลังจากที่เราสร้างไฟล์เรียบร้อยแล้วก็ให้ใส่ code ลงไปในไฟล์โดยเริ่มต้นให้ลองใส่
===============views.py============== 
from django.shortcuts import render

def home_page(request):
    return render(request, 'home.html') 
เมื่อได้ทดสอบเขียนโค้ดดูแล้วลองรันโดย $ python3 manage.py test

 
ซึ่งในตอนแรกนั้นยังไม่ได้ทำการสร้างไฟล์ home page ก็มี error แจ้งเตือนขึ้นมาว่าไม่พบไฟล์ดังกล่าว ต่อมาจึงสร้างไฟล์ home.html ขึ้นใน directory -> lists/templates/ และทำการเขียนโค้ดลงในไฟล์ และเพิ่มโค้ดลงในส่วนของ settings.py file
===============home.html============== 
<html>
    <title>To-Do lists</title>
</html> 
 
==============Settings.py=============
INSTALLED_APPS = (
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'lists',
) 
หลังจากนั้นทดสอบรันโค้ดอีกรอบ $ python3 manage.py test
error ที่แจ้งเตือนว่าไม่พบไฟล์นั้น ได้หายไปแล้วกลายเป็นแจ้งเตือน error เกี่ยวกับ code ที่ return ค่า
กลับมาแทน หลังจากนั้นทดสอบเปลี่ยน code ที่ test.py โดยให้ที่การแบ่งค่าออกมาเป็น บรรทัดแทน

============================tests.py========================== 
self.assertTrue(response.content.strip().endswith(b'</html>')) 
ทดสอบดูอีกที $ python3 manage.py test ได้ผลลัพธ์ออกมาว่า การตรวจเช็ตไม่มีข้อผิดพลาดของ syntax
สามารถเปลี่ยนรูปแบบโค้ดเป็นการ decode ได้โดยเปลี่ยนรูปแบบ code ของ tests.py

============================tests.py========================== 
from django.template.loader import render_to_string
[...]

    def test_home_page_returns_correct_html(self):
        request = HttpRequest()
        response = home_page(request)
        expected_html = render_to_string('home.html')
        self.assertEqual(response.content.decode(), expected_html)
โดยผลที่ได้ก็จะเหมือนเดิม
ทดสอบการเปลี่ยนโค้ดของ home.html
===============================home.html=========================== 
<html>
    <head>
        <title>To-Do lists</title>
    </head>
    <body>
        <h1>Your To-Do list</h1>
        <input id="id_new_item" placeholder="Enter a to-do item" /> 
    </body>
</html>
โดยโค้ดในส่วนของ input นั้นจะเป็น input ในรูปแบบ default คือ textbox โดยที่ functional_tests.py
จะมีโค้ด inputbox = self.browser.find_element_by_id('id_new_item') ที่จะนำเอาค่า ของ object ใน
id : id_new_item เก็บไว้ในตัวแปรที่ชื่อ input เมื่อโปรแกรมเรียกใช้คำสั่ง
self.assertEqual(inputbox.get_attribute('placeholder'),'Enter a to-do item') ก็จะมีการเช็คค่า ว่าค่า placeholder ใน object นั้นตรงกับ 'Enter a to-do item' หรือเปล่า หากไม่ตรงก็จะ error และไปที่
function teardown โดยอัตโนมัติ ลองเพิ่ม หลังจากนั้นก็ทำการ git commit ค่าที่ปลี่ยนแปลงไป

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

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