ไลบรารีทดสอบ Python ใหม่ที่ชื่อ py-pglite ได้จุดประกายการถกเถียงอย่างร้อนแรงในชุมชนนักพัฒนาเกี่ยวกับแนวทางการทดสอบฐานข้อมูล ไลบรารีนี้สัญญาว่าจะนำชุดฟีเจอร์ครบครันของ PostgreSQL มาสู่การทดสอบ Python ผ่าน PGlite ซึ่งเป็น PostgreSQL เวอร์ชันที่คอมไพล์ด้วย WebAssembly และทำงานใน Node.js อย่างไรก็ตาม ชุมชนกำลังตั้งคำถามว่าแนวทางนี้สามารถส่งมอบสิ่งที่สัญญาไว้เรื่องความเรียบง่ายและประสิทธิภาพได้จริงหรือไม่
การอ้างสมรรถนะถูกตั้งคำถาม
การตลาดของไลบรารีเน้นย้ำประสิทธิภาพที่รวดเร็วเหมือนฟ้าแลบผ่าน PostgreSQL ในหน่วยความจำ แต่นักพัฒนากำลังโต้แย้งการอ้างเหล่านี้ นักวิจารณ์ชี้ให้เห็นว่า WebAssembly ที่ทำงานภายใน Node.js ไม่น่าจะมีประสิทธิภาพเหนือกว่าโค้ด PostgreSQL ดั้งเดิมที่ได้รับการปรับแต่งมานานหลายทศวรรษ ชั้นของการแยกส่วนเพิ่มเติม - Python เรียก Node.js ที่ทำงาน WebAssembly - ทำให้เกิดคำถามว่าการตั้งค่านี้สามารถเร็วกว่าทางเลือกที่มีอยู่แล้วอย่าง TestContainers หรืออินสแตนซ์ PostgreSQL ดั้งเดิมได้จริงหรือไม่
สมาชิกชุมชนหลายคนได้แบ่งปันประสบการณ์ของพวกเขากับ TestContainers โดยรายงานเวลาการทำงานของการทดสอบที่ดูเหมือนจะแข่งขันได้กับสิ่งที่ py-pglite สัญญาไว้ นักพัฒนาคนหนึ่งสังเกตว่าการทดสอบที่ใช้ TestContainers กับ PostgreSQL ใช้เวลานานกว่าการทดสอบ SQLite เพียง 30 วินาที ซึ่งบ่งบอกว่าช่องว่างด้านประสิทธิภาพอาจไม่มีนัยสำคัญเท่าที่ py-pglite อ้าง
การเปรียบเทียบประสิทธิภาพ ( TestContainers เทียบกับ SQLite ):
- การทดสอบ SQLite ด้วย Python 3.9: 3 นาที 41 วินาที
- การทดสอบ PostgreSQL ด้วย TestContainers: 4 นาที 11 วินาที
- ความแตกต่าง: ช้ากว่าเพียง 30 วินาทีสำหรับความเข้ากันได้กับ PostgreSQL แบบเต็มรูปแบบ
ปัญหาการพึ่งพา Node.js
บางทีแง่มุมที่ถกเถียงกันมากที่สุดของ py-pglite คือการพึ่งพา Node.js และการจัดการแพ็กเกจ npm อัตโนมัติ ไลบรารีโฆษณาว่า ไม่ต้องติดตั้ง PostgreSQL เป็นจุดขาย แต่นักพัฒนาสังเกตเห็นความขัดแย้งอย่างรวดเร็ว: Node.js เองมีขนาด 63MB เมื่อเทียบกับ PostgreSQL ที่ 32MB สิ่งนี้ทำให้เกิดคำถามว่าการแลกเปลี่ยนการพึ่งพาสมเหตุสมผลหรือไม่
ฉันไม่สามารถจินตนาการได้ว่า wasm ที่ทำงานภายใน nodejs จะเร็วกว่าโค้ดดั้งเดิมที่ได้รับการปรับแต่งมาหลายทศวรรษ postgres มีขนาด 32MB, nodejs มีขนาด 63MB
สิ่งที่น่ากังวลมากกว่าสำหรับนักพัฒนาหลายคนคือการติดตั้งการพึ่งพา npm อัตโนมัติของไลบรารีในขณะทำงาน พฤติกรรมนี้ซึ่งเปิดใช้งานโดยค่าเริ่มต้น ได้ทำให้เกิดสัญญาณเตือนเกี่ยวกับความเข้ากันได้กับการตั้งค่า Node.js ที่มีอยู่และเครื่องมือสแกนความปลอดภัย แม้ว่าฟีเจอร์นี้สามารถปิดได้ แต่การขาดเอกสารที่ชัดเจนเกี่ยวกับการจัดการการพึ่งพา Node.js ด้วยตนเองทำให้ผู้ใช้ที่มีศักยภาพรู้สึกหงุดหงิด
การเปรียบเทียบขนาด:
- PostgreSQL: 32MB
- Node.js: 63MB
- py-pglite ต้องการ Node.js 18+ และ Python 3.10+
โซลูชันทางเลือกได้รับความสนใจ
การถกเถียงได้เน้นย้ำทางเลือกที่เป็นผู้ใหญ่หลายตัวที่นักพัฒนาใช้งานสำเร็จอยู่แล้ว TestContainers กลายเป็นตัวเลือกยอดนิยม โดยเสนออินสแตนซ์ PostgreSQL จริงในคอนเทนเนอร์ Docker ด้วยค่าใช้จ่ายการตั้งค่าขั้นต่ำ นักพัฒนาคนอื่นๆ กล่าวถึง pytest-docker-compose และโซลูชัน embedded-postgres ที่หลีกเลี่ยงการพึ่งพา Node.js ทั้งหมด
สมาชิกชุมชนบางคนกำลังสำรวจแนวทางที่ทะเยอทะยานมากขึ้น เช่น การคอมไพล์ PostgreSQL โดยตรงเป็นส่วนขยาย Python หรือการใช้ WASI runtimes เพื่อขจัดความต้องการ Node.js การถกเถียงเหล่านี้บ่งบอกว่าแม้ว่า py-pglite จะตอบสนองความต้องการที่แท้จริง แต่ชุมชนเห็นว่ามีพื้นที่สำหรับการปรับปรุงในแนวทางการดำเนินงาน
มองไปข้างหน้า
แม้จะมีการวิจารณ์ แต่ py-pglite ได้สร้างความสนใจอย่างแท้จริงสำหรับความพยายามในการทำให้การทดสอบ PostgreSQL ใน Python ง่ายขึ้น ผู้เขียนไลบรารีได้รับทราบข้อเสนอแนะและร่างแผนสำหรับเวอร์ชันในอนาคตที่สามารถแก้ไขข้อจำกัดปัจจุบันบางประการ รวมถึงการสนับสนุนไบนารีดั้งเดิมที่มีศักยภาพและการจัดการการพึ่งพาที่ดีขึ้น
การถกเถียงสะท้อนถึงความท้าทายที่กว้างขึ้นในระบบนิเวศ Python: การสร้างสมดุลระหว่างความสะดวกกับประสิทธิภาพและการจัดการการพึ่งพา แม้ว่า py-pglite อาจไม่ใช่โซลูชันที่สมบูรณ์แบบ แต่มันได้จุดประกายการถกเถียงที่มีคุณค่าเกี่ยวกับกลยุทธ์การทดสอบและเน้นย้ำความต้องการอย่างต่อเนื่องสำหรับเครื่องมือทดสอบฐานข้อมูลที่ดีขึ้นในการพัฒนา Python
อ้างอิง: py-pglite