มาเขียน Unit Testing ใน Python กัน
หลังจากผู้เขียนได้ศึกษาเกี่ยวกับการเขียนเทสให้กับโค๊ดของเรา จึงได้ไปเจอ module ตัวหนึ่งที่ใช้สำหรับในการเทส จึงขอมาแชร์ ครับ
module ในนี้ ชื่อว่า
- unittest
ซึ่งไว้สำหรับ การ Test ซึ่ง ปกติ ใน ภาษาPython สามารถ Test ได้ง่ายๆคือ ใช้ คำสั่ง
assert “Actually” == “Result”
แล้วทำไมเราต้องเทส
เพราะ เราต้องทำให้มั่นใจว่า method ที่เราเขียน หรือ โค๊ดที่เราเขียนนั้นใช้ได้จริง หรือก็คือ เป็นสิ่งรับประกัน โค๊ดเราตัวหนึ่ง
มาเริ่มกันเลย
ก่อนอื่นต้องสร้าง method ง่ายๆเพื่อเตรียมสำหรับเทสกันก่อนเลย
โดยจะเป็น method ง่ายๆ คือ บวก ลบ คูณ แล้วก็หารนะครับ
โค๊ดก็ประมาณนี้:
def add(x, y):
return x + y
def multipy(x, y):
return x * y
def divi(x, y):
return x / y
def minus(x, y):
return x - y
อธิบาย — คือ มีการรับค่าตัวแปร 2 ตัว คือ x , y แล้ว return ออกตาม method นั้นๆนะครับ
ต่อไปฝั่ง TestCase
อันดับแรก ขอเทส แบบปกติโดยไม่ใช้ module นะครับ
if __name__ == '__main__':
assert 5 == add(3,2)
assert 6 == multipy(3,2)
assert 10 == minus(20,10)
assert 5 == divi(10,2)
ถ้าถูกต้องโค๊ดจะรันไม่มีปัญหา แต่ถ้าผิด จะแจ้งนะครับ ดังนี้
assert 6 == add(3, 2)
AssertionError
ง่ายๆใช่มั้ยครับ ต่อไปเรามาลองใช้ module นะครับ
สร้าง อีกไฟล์หนึ่งนะครับ จาก นั้น import unittest และ ไฟล์ของเรานะครับ
import unittest
from LearnTests import learnTest
class TestCase(unittest.TestCase):
def test_case1(self):
return ''if __name__ == '__main__':
unittest.main()
ก็จะมีโครงการใช้งานคร่าวๆแบบข้างบนนะครับ
มาลองเทสกัน
“self.assertEqual(ค่าที่ได้จากmethod,ค่าที่ควรจะเป็น,ข้อความอธิบายเมื่อไม่ถูก)”
def test_add(self):
result = learnTest.add(3, 6)
act = 10
self.assertEqual(result, act, 'เกิดข้อผิดพลาดค่าที่ควรได้ %d แต่ได้ %d' % (act, result))
เมื่อลองรันโค๊ดดูเราจะเห็นว่า จะ Error และจะมีบอกว่าผิดที่อะไรนะครับ
AssertionError: 9 != 10 : เกิดข้อผิดพลาดค่าที่ควรได้ 10 แต่ได้ 9
ดูง่ายมั้ยครับ ถ้าเทสผ่านจะขึ้นคำว่า Ok และเขียวนะครับ
import unittest
from LearnTests import learnTest
class TestCase(unittest.TestCase):
def test_add(self):
result = learnTest.add(3, 6)
act = 9
self.assertEqual(result, act, 'เกิดข้อผิดพลาดค่าที่ควรได้ %d แต่ได้ %d' % (act, result)) def test_minus(self):
result = learnTest.minus(3, 6)
act = -3
self.assertEqual(result, act, 'เกิดข้อผิดพลาดค่าที่ควรได้ %d แต่ได้ %d' % (act, result)) def test_mul(self):
result = learnTest.multipy(3, 6)
act = 18
self.assertEqual(result, act, 'เกิดข้อผิดพลาดค่าที่ควรได้ %d แต่ได้ %d' % (act, result)) def test_div(self):
result = learnTest.divi(10, 2)
act = 5
self.assertEqual(result, act, 'เกิดข้อผิดพลาดค่าที่ควรได้ %d แต่ได้ %d' % (act, result))
if __name__ == '__main__':
unittest.main()
ไม่ใช่แค่มี assertEqual อย่างเดียวสามารถอ่านเพิ่มเติมได้ที่ DOC
สุดท้ายก็….. มาเขียนเทสกันนะครับ เพื่อความถูกต้อง นะครับ ขอบคุณครับ
แหล่งที่มา — document unittest