อยู่ OO และทดสอบได้ในขณะที่ทำงานกับฐานข้อมูล


16

อะไรคือกลยุทธ์ของ OOP สำหรับการทำงานกับฐานข้อมูล แต่ทำให้สิ่งต่าง ๆ ที่หน่วยทดสอบได้? ว่าฉันมีคลาสผู้ใช้และสภาพแวดล้อมการผลิตของฉันทำงานกับ MySQL ฉันเห็นแนวทางที่เป็นไปได้สองสามข้อแสดงที่นี่โดยใช้ PHP:

  1. ส่งผ่าน $ data_source พร้อมอินเทอร์เฟซสำหรับload()และsave()เป็นนามธรรมแหล่งข้อมูลเบื้องหลัง เมื่อทำการทดสอบให้ส่งผ่านแหล่งข้อมูลอื่น

    $ user = ผู้ใช้ใหม่ ($ mysql_data_source);
    $ user-> load ('bob');
    $ user-> setNickname ('Robby');
    $ ที่ผู้ใช้> บันทึก ();
    
  2. ใช้โรงงานที่เข้าถึงฐานข้อมูลและส่งผ่านแถวผลลัพธ์ไปยังตัวสร้างของผู้ใช้ เมื่อทำการทดสอบให้สร้างพารามิเตอร์ $ row หรือจำลองวัตถุใน UserFactory :: $ data_source ด้วยตนเอง (ฉันจะบันทึกการเปลี่ยนแปลงในระเบียนได้อย่างไร)

    class UserFactory {
        static $data_source;
    
        public static function fetch( $username ) {
            $row = self::$data_source->get( [params] );
    
            $user = new User( $row );
            return $user;
        }
    }
    

ฉันมีรูปแบบการออกแบบและรหัสสะอาดที่นี่ถัดจากฉัน แต่ฉันดิ้นรนเพื่อค้นหาแนวคิดที่เกี่ยวข้อง


คำตอบ:


11

ดังนั้นสิ่งที่คุณต้องการรับคือรูปแบบของ Martin Fowlers ' Enterprise Application Architecture (เขายังมีแคตตาล็อกในเว็บไซต์ของเขาที่นี่ )

ในนั้นเขาอธิบายหลายรูปแบบสำหรับการเข้าถึงข้อมูลที่เป็นนามธรรม วิธีแรกที่คุณอธิบายเป็นActive Record แนวทางที่สองของคุณคล้ายกับตารางข้อมูลเกตเวย์

แนวทางที่ดียิ่งขึ้นคือการใช้ O / RM เพื่อลบความจำเป็นในการเขียนรหัสการเข้าถึงข้อมูลด้วยมือ ฉันไม่ได้ใช้ PHP ตั้งแต่ที่เรากำลังกังวลเกี่ยวกับปัญหา Y2K แต่วิกิพีเดียมีรายการของตัวเลือกสำหรับคุณ ฉันไม่รู้ว่ามันดีหรือไม่ ฉันสามารถบอกคุณบางอย่างเพื่อค้นหาใน O / RM อย่างไรก็ตาม:

  • Persistence Ignorance : O / RM ไม่ควรบังคับให้ออบเจ็กต์ทางธุรกิจของคุณได้รับมาจากอินเทอร์เฟซ / คลาสเฉพาะเพื่อเข้าร่วมในกลยุทธ์การเข้าถึงข้อมูล
  • การทำแผนที่ความสัมพันธ์ : คุณควรจะสามารถจับคู่ความสัมพันธ์ระหว่างวัตถุของคุณ (ลูกค้ามีคำสั่งซื้อคำสั่งซื้อมีรายการโฆษณารายการโฆษณามีผลิตภัณฑ์ ฯลฯ )
  • การแมปแบบลำดับชั้น: คุณควรสามารถแมปลำดับชั้นของชั้นเรียนกับฐานข้อมูล
  • การสนับสนุนไวยากรณ์ / เกณฑ์การสืบค้น : คุณควรสามารถสร้างแบบสอบถามในเวลาทำงานในแง่ของวัตถุของคุณไม่ได้อยู่ในฐานข้อมูลและ O / RM ควรแปลและเรียกใช้แบบสอบถามบนฐานข้อมูล คะแนนพิเศษถ้าแบบสอบถามเป็นเชนที่พิมพ์อย่างมากแทนที่จะเป็นสตริง

มีปัจจัยอื่น ๆ ที่ต้องพิจารณา แต่สิ่งเหล่านี้เป็นปัจจัยที่สำคัญที่สุด หวังว่านี่จะช่วยได้


6

IMHO มันขึ้นอยู่กับสิ่งที่คุณต้องการทดสอบถ้าคุณต้องการทดสอบตรรกะทางธุรกิจของคุณคุณควรเริ่มต้น / จำลอง ( Martin Fowler ) คุณเข้าถึงข้อมูลเพื่อให้คำแนะนำแรกของคุณคือการเริ่มต้นที่ดี คำถาม stackoverflow นี้ให้ตัวอย่าง C # ที่ดี (ฉันพยายามค้นหาตัวอย่าง PHP แต่ไม่สามารถหาได้)

หากคุณต้องการทดสอบการเข้าถึงข้อมูลในตัวมันไม่ได้เรียกว่าการทดสอบหน่วยใด ๆ เพิ่มเติม แต่การทดสอบการรวม อ่านที่นี่สำหรับคำแนะนำทั่วไปคำถามกองซ้อนนี้นี้ยังมีลิงก์ที่น่าสนใจ

ถ้าคุณต้องการทดสอบตรรกะของโพรซีเดอร์ที่เก็บไว้ในฐานข้อมูลของคุณให้ดูที่xUnit TestPattern

หวังว่านี่จะช่วยได้


2

นี่ไม่ใช่คำตอบที่เป็นประโยชน์ทันที แต่ถ้าคุณกังวลเกี่ยวกับความสามารถในการทดสอบฐานข้อมูลได้จริงคุณควรตรวจสอบวิธีการใช้ Ruby on Rails เท่าที่ฉันรู้ไม่มีใครได้ครอบคลุมหัวข้อที่ดีขึ้นหรืออย่างสังหรณ์ใจ


2
Ruby on Rails ใช้รูปแบบ Active Record เป็นค่าเริ่มต้น อาจมีลิงก์: en.wikipedia.org/wiki/Active_record_pattern
Spoike

0

ฉันแนะนำให้คุณตรวจสอบโซลูชัน Symfony Framework กับปัญหาประเภทนี้ Symfony เป็นกรอบ PHP OO ด้วยการทดสอบการทำงาน

นี่คือลิงค์พวกเขาใช้สิ่งที่คุณคิด

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.