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 () เรียกง่ายๆกับเซิร์ฟเวอร์เพื่อรับการตอบสนอง