CherryPy - การทดสอบ
การทดสอบเป็นกระบวนการที่แอปพลิเคชันดำเนินการจากมุมมองที่แตกต่างกันเพื่อ -
- ค้นหารายการปัญหา
- ค้นหาความแตกต่างระหว่างผลลัพธ์ที่คาดหวังและผลลัพธ์จริงสถานะ ฯลฯ
- ทำความเข้าใจขั้นตอนการใช้งาน
- ค้นหาแอปพลิเคชันที่มีประโยชน์สำหรับวัตถุประสงค์ที่เป็นจริง
เป้าหมายของการทดสอบไม่ใช่เพื่อทำให้นักพัฒนาเป็นฝ่ายผิด แต่เพื่อจัดหาเครื่องมือและปรับปรุงคุณภาพเพื่อประเมินความสมบูรณ์ของแอปพลิเคชันในช่วงเวลาที่กำหนด
ต้องมีการวางแผนการทดสอบล่วงหน้า สิ่งนี้เรียกร้องให้กำหนดวัตถุประสงค์ของการทดสอบทำความเข้าใจขอบเขตของกรณีทดสอบจัดทำรายการข้อกำหนดทางธุรกิจและตระหนักถึงความเสี่ยงที่เกี่ยวข้องในระยะต่างๆของโครงการ
การทดสอบถูกกำหนดให้เป็นด้านต่างๆที่ต้องตรวจสอบบนระบบหรือแอปพลิเคชัน ต่อไปนี้เป็นรายการของไฟล์common test approaches -
Unit testing- โดยปกติแล้วนักพัฒนาจะดำเนินการเอง สิ่งนี้มีจุดมุ่งหมายเพื่อตรวจสอบว่าหน่วยของรหัสทำงานตามที่คาดไว้หรือไม่
Usability testing- นักพัฒนามักลืมไปว่าพวกเขากำลังเขียนแอปพลิเคชันสำหรับผู้ใช้ปลายทางที่ไม่มีความรู้เกี่ยวกับระบบ การทดสอบการใช้งานจะตรวจสอบข้อดีข้อเสียของผลิตภัณฑ์
Functional/Acceptance testing - ในขณะที่การทดสอบการใช้งานจะตรวจสอบว่าแอปพลิเคชันหรือระบบสามารถใช้งานได้หรือไม่ แต่การทดสอบการใช้งานจะช่วยให้มั่นใจได้ว่ามีการใช้งานทุกฟังก์ชันที่ระบุ
Load and performance testing- ดำเนินการเพื่อทำความเข้าใจว่าระบบสามารถปรับให้เข้ากับโหลดและการทดสอบประสิทธิภาพที่จะดำเนินการได้หรือไม่ สิ่งนี้สามารถนำไปสู่การเปลี่ยนแปลงในฮาร์ดแวร์การเพิ่มประสิทธิภาพการสืบค้น SQL ฯลฯ
Regression testing - ตรวจสอบว่าการเปิดตัวผลิตภัณฑ์อย่างต่อเนื่องไม่ทำลายฟังก์ชันการทำงานก่อนหน้านี้
Reliability and resilience testing - การทดสอบความน่าเชื่อถือช่วยในการตรวจสอบความถูกต้องของแอปพลิเคชันระบบด้วยการแยกส่วนประกอบหนึ่งหรือหลายส่วน
การทดสอบหน่วย
แอปพลิเคชั่น Photoblog ใช้การทดสอบหน่วยอย่างต่อเนื่องเพื่อตรวจสอบสิ่งต่อไปนี้ -
- ฟังก์ชันใหม่ทำงานได้อย่างถูกต้องและเป็นไปตามที่คาดไว้
- ฟังก์ชันที่มีอยู่จะไม่ถูกทำลายโดยการเปิดตัวโค้ดใหม่
- ข้อบกพร่องได้รับการแก้ไขและยังคงได้รับการแก้ไข
Python มาพร้อมกับโมดูล unittest มาตรฐานที่นำเสนอแนวทางที่แตกต่างในการทดสอบหน่วย
Unittest
unittest มีรากฐานมาจาก JUnit ซึ่งเป็นแพ็คเกจทดสอบหน่วย Java ที่พัฒนาโดย Kent Beck และ Erich Gamma การทดสอบหน่วยจะส่งคืนข้อมูลที่กำหนดไว้ สามารถกำหนดวัตถุจำลองได้ วัตถุเหล่านี้ช่วยให้สามารถทดสอบกับอินเทอร์เฟซของการออกแบบของเราได้โดยไม่ต้องพึ่งพาแอปพลิเคชันโดยรวม นอกจากนี้ยังมีวิธีเรียกใช้การทดสอบในโหมดแยกพร้อมกับการทดสอบอื่น ๆ
มากำหนดคลาสดัมมี่ด้วยวิธีต่อไปนี้ -
import unittest
class DummyTest(unittest.TestCase):
def test_01_forward(self):
dummy = Dummy(right_boundary=3)
self.assertEqual(dummy.forward(), 1)
self.assertEqual(dummy.forward(), 2)
self.assertEqual(dummy.forward(), 3)
self.assertRaises(ValueError, dummy.forward)
def test_02_backward(self):
dummy = Dummy(left_boundary=-3, allow_negative=True)
self.assertEqual(dummy.backward(), -1)
self.assertEqual(dummy.backward(), -2)
self.assertEqual(dummy.backward(), -3)
self.assertRaises(ValueError, dummy.backward)
def test_03_boundaries(self):
dummy = Dummy(right_boundary=3, left_boundary=-3,allow_negative=True)
self.assertEqual(dummy.backward(), -1)
self.assertEqual(dummy.backward(), -2)
self.assertEqual(dummy.forward(), -1)
self.assertEqual(dummy.backward(), -2)
self.assertEqual(dummy.backward(), -3)
คำอธิบายสำหรับรหัสมีดังนี้ -
ควรนำเข้าโมดูลที่ไม่เหมาะสมที่สุดเพื่อจัดเตรียมความสามารถในการทดสอบหน่วยสำหรับคลาสที่กำหนด
ควรสร้างคลาสโดยการรวมคลาสย่อย
ทุกวิธีในโค้ดด้านบนเริ่มต้นด้วยการทดสอบคำ วิธีการทั้งหมดเหล่านี้เรียกโดยตัวจัดการที่ไม่เหมาะสมที่สุด
วิธีการยืนยัน / ล้มเหลวถูกเรียกโดยกรณีทดสอบเพื่อจัดการข้อยกเว้น
พิจารณาสิ่งนี้เป็นตัวอย่างในการเรียกใช้กรณีทดสอบ -
if __name__ == '__main__':
unittest.main()
ผลลัพธ์ (เอาต์พุต) สำหรับการรันกรณีทดสอบจะเป็นดังนี้ -
----------------------------------------------------------------------
Ran 3 tests in 0.000s
OK
การทดสอบการทำงาน
เมื่อฟังก์ชันการทำงานของแอปพลิเคชันเริ่มเป็นรูปเป็นร่างตามข้อกำหนดชุดการทดสอบการทำงานสามารถตรวจสอบความถูกต้องของแอปพลิเคชันเกี่ยวกับข้อกำหนดได้ อย่างไรก็ตามการทดสอบควรเป็นแบบอัตโนมัติเพื่อประสิทธิภาพที่ดีขึ้นซึ่งจะต้องใช้ผลิตภัณฑ์ของบุคคลที่สามเช่นซีลีเนียม
CherryPy มีคลาสตัวช่วยเช่นฟังก์ชันในตัวเพื่อความสะดวกในการเขียนการทดสอบการทำงาน
โหลดการทดสอบ
ขึ้นอยู่กับแอปพลิเคชันที่คุณกำลังเขียนและความคาดหวังของคุณในแง่ของปริมาณคุณอาจต้องเรียกใช้การทดสอบการโหลดและประสิทธิภาพเพื่อตรวจจับคอขวดที่อาจเกิดขึ้นในแอปพลิเคชันที่ป้องกันไม่ให้แอปพลิเคชันทำงานได้ถึงระดับหนึ่ง
ส่วนนี้จะไม่ให้รายละเอียดวิธีดำเนินการทดสอบประสิทธิภาพหรือโหลดเนื่องจากไม่อยู่ในแพ็คเกจ FunkLoad
ตัวอย่างพื้นฐานของ FunkLoad มีดังนี้ -
from funkload.FunkLoadTestCase
import FunkLoadTestCase
class LoadHomePage(FunkLoadTestCase):
def test_homepage(self):
server_url = self.conf_get('main', 'url')
nb_time = self.conf_getInt('test_homepage', 'nb_time')
home_page = "%s/" % server_url
for i in range(nb_time):
self.logd('Try %i' % i)
self.get(home_page, description='Get gome page')
if __name__ in ('main', '__main__'):
import unittest
unittest.main()
นี่คือคำอธิบายโดยละเอียดของโค้ดด้านบน -
กรณีทดสอบต้องสืบทอดจากคลาส FunkLoadTestCase เพื่อให้ FunkLoad ทำงานภายในเพื่อติดตามสิ่งที่เกิดขึ้นระหว่างการทดสอบ
ชื่อคลาสมีความสำคัญเนื่องจาก FunkLoad จะค้นหาไฟล์ตามชื่อคลาส
กรณีทดสอบที่ออกแบบมาสามารถเข้าถึงไฟล์คอนฟิกูเรชันได้โดยตรง เมธอด get () และ post () เรียกง่ายๆกับเซิร์ฟเวอร์เพื่อรับการตอบสนอง