เรียกใช้ PostgreSQL ในหน่วยความจำเท่านั้น


107

ฉันต้องการเรียกใช้ฐานข้อมูล PostgreSQL ขนาดเล็กซึ่งทำงานในหน่วยความจำเท่านั้นสำหรับการทดสอบแต่ละหน่วยที่ฉันเขียน ตัวอย่างเช่น:

@Before
void setUp() {
    String port = runPostgresOnRandomPort();
    connectTo("postgres://localhost:"+port+"/in_memory_db");
    // ...
}

ตามหลักการแล้วฉันจะตรวจสอบไฟล์ปฏิบัติการ postgres เดียวในการควบคุมเวอร์ชันซึ่งการทดสอบหน่วยจะใช้

สิ่งที่เหมือนHSQLแต่สำหรับ postgres ฉันจะทำเช่นนั้นได้อย่างไร?

ฉันจะได้รับ Postgres เวอร์ชันดังกล่าวหรือไม่ ฉันจะสั่งไม่ให้ใช้ดิสก์ได้อย่างไร

คำตอบ:


49

สิ่งนี้ไม่สามารถทำได้กับ Postgres ไม่มีเครื่องมือในกระบวนการ / ในหน่วยความจำเช่น HSQLDB หรือ MySQL

หากคุณต้องการสร้างสภาพแวดล้อมที่มีอยู่ในตัวคุณสามารถใส่ไบนารีของ Postgres ลงใน SVN ได้ (แต่เป็นมากกว่าไฟล์ปฏิบัติการเดียว)

คุณจะต้องเรียกใช้initdbเพื่อตั้งค่าฐานข้อมูลทดสอบของคุณก่อนจึงจะสามารถทำอะไรได้ ซึ่งสามารถทำได้จากไฟล์แบตช์หรือโดยใช้ Runtime.exec () แต่โปรดทราบว่า initdb ไม่ใช่สิ่งที่รวดเร็ว แน่นอนคุณจะไม่ต้องการเรียกใช้สำหรับการทดสอบแต่ละครั้ง คุณอาจหนีไปก่อนที่จะเรียกใช้ชุดทดสอบของคุณ

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

คุณสามารถสร้างการทดสอบฐานข้อมูลโดยใช้ฐานข้อมูลแม่แบบซึ่งจะทำให้การสร้างมันค่อนข้างเร็ว (เป็นจำนวนมากทำงานได้เร็วกว่า initdb สำหรับการทดสอบการทำงานในแต่ละ)


9
ดูเหมือนว่าคำตอบที่สองของ Erwin ด้านล่างควรถูกทำเครื่องหมายว่าเป็นคำตอบที่ถูกต้อง
vfclists

3
@vfclists จริงๆแล้วช้อนโต๊ะบน ramdisk เป็นความคิดที่แย่มาก อย่าทำอย่างนั้น ดูpostgresql.org/docs/devel/static/manage-ag-tablespaces.html , stackoverflow.com/q/9407442/398670
Craig Ringer

1
@CraigRinger: เพื่อชี้แจงสำหรับคำถามนี้เป็นความคิดที่ดีที่จะผสมผสานกับข้อมูลที่มีค่า (และขอบคุณสำหรับคำเตือน) สำหรับการทดสอบหน่วยด้วยคลัสเตอร์ DB เฉพาะ ramdisk ก็ใช้ได้
Erwin Brandstetter

1
เนื่องจากการใช้งานนักเทียบท่าเป็นเรื่องธรรมดาบางคนจึงประสบความสำเร็จด้วยเครื่องมือเช่นtestcontainersนี้ซึ่งโดยพื้นฐานแล้วจะช่วยให้การทดสอบของคุณเริ่มต้นอินสแตนซ์แบบทิ้ง, เทียบท่า, โพสต์เกรส ดูgithub.com/testcontainers/testcontainers-java/blob/master/…
Hans Westerbeek

1
@ekcrisp. นั่นไม่ใช่ Postgres เวอร์ชันฝังตัวที่แท้จริง เป็นเพียงไลบรารีของ Wrapper เพื่อให้การเริ่มต้นอินสแตนซ์ Postgres (ในกระบวนการแยกต่างหาก) ง่ายขึ้น Postgres จะยังคงรัน "นอก" ของแอปพลิเคชัน Java และไม่ "ฝังตัว" ในกระบวนการเดียวกับที่เรียกใช้ JVM
a_horse_with_no_name

79

(การย้ายคำตอบของฉันจากการใช้ PostgreSQL ในหน่วยความจำและการสรุปคำตอบ):

คุณไม่สามารถเรียกใช้ Pg ในกระบวนการในหน่วยความจำ

ฉันไม่สามารถหาวิธีเรียกใช้ฐานข้อมูล Postgres ในหน่วยความจำเพื่อทำการทดสอบได้ เป็นไปได้ไหม?

ไม่เป็นไปไม่ได้ PostgreSQL ใช้งานใน C และคอมไพล์เป็นรหัสแพลตฟอร์ม ซึ่งแตกต่างจาก H2 หรือ Derby คุณไม่สามารถโหลดjarและเปิดมันเป็นฐานข้อมูลในหน่วยความจำที่เหลือทิ้งได้

ไม่เหมือนกับ SQLite ซึ่งเขียนด้วย C และคอมไพล์เป็นรหัสแพลตฟอร์ม PostgreSQL ไม่สามารถโหลดในกระบวนการได้เช่นกัน ต้องใช้หลายกระบวนการ (หนึ่งกระบวนการต่อการเชื่อมต่อ) เนื่องจากเป็นสถาปัตยกรรมแบบหลายกระบวนการไม่ใช่สถาปัตยกรรมแบบมัลติเธรด ข้อกำหนดการประมวลผลหลายขั้นตอนหมายถึงคุณขั้นตอนต้องเปิดตัว postmaster เป็นกระบวนการแบบสแตนด์อโลน

แทน: กำหนดค่าการเชื่อมต่อล่วงหน้า

ฉันขอแนะนำให้เขียนการทดสอบของคุณเพื่อคาดหวังว่าชื่อโฮสต์ / ชื่อผู้ใช้ / รหัสผ่านเฉพาะจะทำงานได้และมีการทดสอบใช้ประโยชน์CREATE DATABASEจากฐานข้อมูลที่เหลือจากนั้นDROP DATABASEเมื่อสิ้นสุดการทำงาน รับรายละเอียดการเชื่อมต่อฐานข้อมูลจากไฟล์คุณสมบัติสร้างคุณสมบัติเป้าหมายตัวแปรสภาพแวดล้อม ฯลฯ

ปลอดภัยที่จะใช้อินสแตนซ์ PostgreSQL ที่มีอยู่ซึ่งคุณมีฐานข้อมูลที่คุณสนใจอยู่แล้วตราบใดที่ผู้ใช้ที่คุณระบุในการทดสอบหน่วยของคุณไม่ใช่ผู้ใช้ขั้นสูง แต่เป็นผู้ใช้ที่มีCREATEDBสิทธิ์เท่านั้น อย่างเลวร้ายที่สุดคุณจะสร้างปัญหาด้านประสิทธิภาพในฐานข้อมูลอื่น ๆ ฉันชอบเรียกใช้การติดตั้ง PostgreSQL แบบแยกส่วนโดยสิ้นเชิงเพื่อทดสอบด้วยเหตุผลนั้น

แทน: เปิดใช้งานอินสแตนซ์ PostgreSQL สำหรับการทดสอบ

อีกวิธีหนึ่งคือถ้าคุณจริงๆกระตือรือร้นคุณสามารถมีเทียมทดสอบของคุณค้นหาinitdbและpostgresไบนารีเรียกใช้initdbในการสร้างฐานข้อมูลการปรับเปลี่ยนpg_hba.confการtrustเรียกใช้postgresที่จะเริ่มต้นในพอร์ตที่สุ่มสร้างผู้ใช้สร้างฐานข้อมูลและเรียกใช้การทดสอบ คุณสามารถรวมไบนารี PostgreSQL สำหรับสถาปัตยกรรมหลาย ๆ แบบไว้ใน jar และคลายไฟล์สำหรับสถาปัตยกรรมปัจจุบันลงในไดเร็กทอรีชั่วคราวก่อนที่จะรันการทดสอบ

โดยส่วนตัวแล้วฉันคิดว่านั่นเป็นความเจ็บปวดที่สำคัญที่ควรหลีกเลี่ยง ง่ายกว่าเพียงแค่กำหนดค่าฐานข้อมูลทดสอบ อย่างไรก็ตามมันง่ายขึ้นเล็กน้อยเมื่อมีการinclude_dirสนับสนุนในpostgresql.conf; ตอนนี้คุณสามารถต่อท้ายหนึ่งบรรทัดจากนั้นเขียนไฟล์กำหนดค่าที่สร้างขึ้นสำหรับส่วนที่เหลือทั้งหมด

ทดสอบได้เร็วขึ้นด้วย PostgreSQL

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับวิธีการปรับปรุงประสิทธิภาพของ PostgreSQL อย่างปลอดภัยสำหรับวัตถุประสงค์ในการทดสอบโปรดดูคำตอบโดยละเอียดที่ฉันเขียนไว้ในหัวข้อนี้ก่อนหน้านี้: เพิ่มประสิทธิภาพ PostgreSQL เพื่อการทดสอบที่รวดเร็ว

ภาษา PostgreSQL ของ H2 ไม่ใช่สิ่งทดแทนที่แท้จริง

บางคนใช้ฐานข้อมูล H2 แทนในโหมดภาษา PostgreSQL เพื่อเรียกใช้การทดสอบ ฉันคิดว่าเกือบจะแย่พอ ๆ กับคน Rails ที่ใช้ SQLite สำหรับการทดสอบและ PostgreSQL สำหรับการปรับใช้งานจริง

H2 รองรับส่วนขยาย PostgreSQL และเลียนแบบภาษา PostgreSQL อย่างไรก็ตามมันก็แค่นั้น - การเลียนแบบ คุณจะพบพื้นที่ที่ H2 ยอมรับแบบสอบถาม PostgreSQL แต่ไม่ได้แตกต่างกันที่ลักษณะการทำงาน ฯลฯ นอกจากนี้คุณจะพบสถานที่มากมายที่ PostgreSQL รองรับการทำบางสิ่งที่ H2 ทำไม่ได้เช่นฟังก์ชันหน้าต่างในขณะที่เขียน

หากคุณเข้าใจข้อ จำกัด ของแนวทางนี้และการเข้าถึงฐานข้อมูลของคุณทำได้ง่าย H2 อาจจะใช้ได้ แต่ในกรณีนี้คุณอาจเป็นผู้สมัครที่ดีกว่าสำหรับ ORM ที่ทำให้ฐานข้อมูลเป็นนามธรรมเพราะคุณไม่ได้ใช้คุณสมบัติที่น่าสนใจอยู่แล้ว - และในกรณีนี้คุณไม่ต้องสนใจเกี่ยวกับความเข้ากันได้ของฐานข้อมูลอีกต่อไป

โต๊ะว่างไม่ใช่คำตอบ!

อย่าได้ใช้ตารางเพื่อสร้าง "ในความทรงจำ" ฐานข้อมูล ไม่เพียง แต่ไม่จำเป็นเนื่องจากจะไม่ช่วยเพิ่มประสิทธิภาพอย่างมีนัยสำคัญ แต่ยังเป็นวิธีที่ยอดเยี่ยมในการขัดขวางการเข้าถึงอื่น ๆ ที่คุณอาจสนใจในการติดตั้ง PostgreSQL เดียวกัน ขณะนี้เอกสาร 9.4 มีคำเตือนต่อไปนี้ :

คำเตือน

แม้ว่าจะอยู่นอกไดเร็กทอรีข้อมูล PostgreSQL หลัก แต่พื้นที่ตารางเป็นส่วนหนึ่งของคลัสเตอร์ฐานข้อมูลและไม่สามารถถือว่าเป็นการรวบรวมไฟล์ข้อมูลแบบอิสระ ขึ้นอยู่กับข้อมูลเมตาที่มีอยู่ในไดเร็กทอรีข้อมูลหลักดังนั้นจึงไม่สามารถแนบกับคลัสเตอร์ฐานข้อมูลอื่นหรือสำรองข้อมูลทีละรายการ ในทำนองเดียวกันถ้าคุณสูญเสียพื้นที่ตาราง (การลบไฟล์ความล้มเหลวของดิสก์ ฯลฯ ) คลัสเตอร์ฐานข้อมูลอาจไม่สามารถอ่านได้หรือไม่สามารถเริ่มทำงานได้ การวางพื้นที่ตารางบนระบบไฟล์ชั่วคราวเช่น ramdisk จะเสี่ยงต่อความน่าเชื่อถือของคลัสเตอร์ทั้งหมด

เพราะฉันสังเกตเห็นว่ามีคนจำนวนมากเกินไปและประสบปัญหา

(หากคุณทำสิ่งนี้เสร็จแล้วคุณสามารถmkdirใช้ไดเรกทอรีพื้นที่ตารางที่หายไปเพื่อให้ PostgreSQL เริ่มต้นใหม่อีกครั้งจากนั้นDROPฐานข้อมูลที่หายไปตาราง ฯลฯ จะดีกว่าที่จะไม่ทำมัน)


1
ฉันไม่ชัดเจนเกี่ยวกับคำเตือนที่ให้ไว้ที่นี่ หากฉันพยายามเรียกใช้การทดสอบหน่วยอย่างรวดเร็วเหตุใดจึงมีคลัสเตอร์ที่เกี่ยวข้อง ทั้งหมดนี้ไม่ควรเป็นเพียงอินสแตนซ์ PG ในพื้นที่ของฉันใช่หรือไม่ หากคลัสเตอร์ (จากหนึ่ง) เสียหายเหตุใดจึงมีความสำคัญฉันวางแผนที่จะลบออกอย่างไรก็ตาม
Gates VP

1
@GatesVP PostgreSQL ใช้คำว่า "คลัสเตอร์" ในลักษณะที่ค่อนข้างแปลกเพื่ออ้างถึงอินสแตนซ์ PostgreSQL (ไดเร็กทอรีข้อมูลการรวบรวมฐานข้อมูลผู้ส่งไปรษณีย์ ฯลฯ ) ดังนั้นจึงไม่ใช่ "คลัสเตอร์" ในความหมายของ "คลัสเตอร์คำนวณ" ใช่มันน่ารำคาญและฉันอยากเห็นการเปลี่ยนแปลงคำศัพท์นั้น และถ้ามันใบปลิวแล้วแน่นอนมันไม่ได้เรื่อง แต่คนอย่างสม่ำเสมอพยายามที่จะมีใบปลิวในหน่วยความจำตารางบน PostgreSQL ติดตั้งที่มีข้อมูลที่พวกเขาเป็นอย่างอื่นเกี่ยวกับการดูแล นั่นเป็นปัญหา
Craig Ringer

ตกลงนั่นเป็นทั้ง"สิ่งที่ฉันคิด"และ"น่ากลัวมาก"ซึ่งเห็นได้ชัดว่าโซลูชัน RAMDrive อยู่บนฐานข้อมูลในเครื่องที่ไม่มีข้อมูลที่เป็นประโยชน์ แต่ทำไมใคร ๆ ก็อยากเรียกใช้การทดสอบหน่วยกับเครื่องที่ไม่ใช่เครื่องของตัวเอง? จากคำตอบของคุณ Tablespaces + RamDisk ฟังดูถูกต้องตามกฎหมายอย่างสมบูรณ์แบบสำหรับอินสแตนซ์ Unit Test ของ PGSQL ที่ทำงานบนเครื่องของคุณเท่านั้น
Gates VP

1
@GatesVP บางคนเก็บสิ่งที่พวกเขาสนใจไว้ในเครื่องของตนซึ่งเป็นเรื่องปกติ แต่มันก็โง่นิดหน่อยที่จะเรียกใช้การทดสอบหน่วยกับการติดตั้ง DB เดียวกัน คนโง่แม้ว่า บางคนก็ไม่ได้สำรองข้อมูลที่เหมาะสม คร่ำครวญ
Craig Ringer

ไม่ว่าในกรณีใดหากคุณจะไปที่ตัวเลือก ramdisk คุณก็ต้องการ WAL บน ramdisk ด้วยเช่นกันดังนั้นคุณอาจinitdbติดตั้ง Pg ใหม่ทั้งหมดที่นั่น แต่จริงๆแล้วมีความแตกต่างเล็กน้อยระหว่าง Pg ที่ปรับแต่งเพื่อการทดสอบอย่างรวดเร็วบนพื้นที่เก็บข้อมูลปกติ (fsync = off และคุณสมบัติความทนทาน / ความปลอดภัยของข้อมูลอื่น ๆ ที่ปิดอยู่) มากกว่าการทำงานบน ramdisk อย่างน้อยก็บน Linux
Craig Ringer

66

หรือคุณสามารถสร้างTABLESPACEใน ramfs / tempfs และสร้างวัตถุทั้งหมดของคุณที่นั่น
ฉันเพิ่งได้รับการชี้ไปยังบทความเกี่ยวกับการทำตรงนั้นบน Linux

คำเตือน

นี้สามารถเป็นอันตรายต่อความสมบูรณ์ของคุณคลัสเตอร์ฐานข้อมูลทั้งหมด
อ่านคำเตือนเพิ่มเติมในคู่มือ
ดังนั้นนี่เป็นเพียงตัวเลือกสำหรับข้อมูลที่ใช้จ่ายได้

สำหรับการทดสอบหน่วยควรใช้งานได้ดี หากคุณกำลังเรียกใช้ฐานข้อมูลอื่นบนเครื่องเดียวกันต้องแน่ใจว่าใช้คลัสเตอร์ฐานข้อมูลแยกต่างหาก (ซึ่งมีพอร์ตของตัวเอง) เพื่อความปลอดภัย


4
ฉันคิดว่านี่เป็นคำแนะนำที่ไม่ดีจริงๆ อย่าทำอย่างนี้. แทนที่จะinitdbเป็นอินสแตนซ์ postgres ใหม่ใน tempfs หรือ ramdisk อย่าได้ใช้ตารางใน tempfs ฯลฯ ก็เปราะบางและไม่มีจุดหมาย คุณจะดีกว่าการใช้พื้นที่ตารางปกติและสร้างUNLOGGEDตาราง - มันจะทำงานในลักษณะเดียวกัน และจะไม่กล่าวถึงประสิทธิภาพของ WAL และปัจจัย fsync เว้นแต่คุณจะดำเนินการที่เสี่ยงต่อความสมบูรณ์ของฐานข้อมูลทั้งหมด (ดูstackoverflow.com/q/9407442/398670 ) อย่าทำ
Craig Ringer

30

ตอนนี้มันเป็นไปได้ที่จะเรียกใช้อินสแตนซ์ในหน่วยความจำของ PostgreSQL ในการทดสอบ JUnit ของคุณผ่านทางแบบฝังตัว PostgreSQL ตัวแทนจาก OpenTable: https://github.com/opentable/otj-pg-embedded

ด้วยการเพิ่มการพึ่งพาให้กับไลบรารีที่ฝังตัวของ otj-pg ( https://mvnrepository.com/artifact/com.opentable.components/otj-pg-embedded ) คุณสามารถเริ่มและหยุดอินสแตนซ์ PostgreSQL ของคุณเองใน @Before และ @ อ้างอิงตะขอ:

EmbeddedPostgres pg = EmbeddedPostgres.start();

พวกเขายังเสนอกฎ JUnit เพื่อให้ JUnit เริ่มต้นและหยุดเซิร์ฟเวอร์ฐานข้อมูล PostgreSQL ให้คุณโดยอัตโนมัติ:

@Rule
public SingleInstancePostgresRule pg = EmbeddedPostgresRules.singleInstance();

1
ประสบการณ์ของคุณกับแพ็คเกจนี้ในหกเดือนต่อมาเป็นอย่างไร? ทำงานได้ดีหรือเต็มไปด้วยข้อบกพร่อง?
oligofren

@Rubms คุณย้ายไปที่ JUnit5 หรือไม่? คุณใช้การแทนที่@Ruleด้วย@ExtendWithอย่างไร? เพียงแค่ใช้.start()ใน@BeforeAll?
Frankie Drake

ฉันไม่ได้ย้ายไปที่ JUnit5 ดังนั้นฉันจึงยังไม่สามารถตอบคำถามของคุณได้ ขออภัย.
Rubms

สิ่งนี้ได้ผลดี ขอบคุณ. ใช้สิ่งต่อไปนี้เพื่อสร้างแหล่งข้อมูลในการกำหนดค่าสปริงของคุณหากคุณต้องการ:DataSource embeddedPostgresDS = EmbeddedPostgres.builder().start().getPostgresDatabase();
Sacky San

12

คุณสามารถใช้TestContainersเพื่อหมุนคอนเทนเนอร์ Docker PosgreSQL สำหรับการทดสอบ: http://testcontainers.viewdocs.io/testcontainers-java/usage/database_containers/

TestContainers จัดเตรียมJUnit @ Rule / @ ClassRule : โหมดนี้จะเริ่มต้นฐานข้อมูลภายในคอนเทนเนอร์ก่อนการทดสอบของคุณและฉีกทิ้งในภายหลัง

ตัวอย่าง:

public class SimplePostgreSQLTest {

    @Rule
    public PostgreSQLContainer postgres = new PostgreSQLContainer();

    @Test
    public void testSimple() throws SQLException {
        HikariConfig hikariConfig = new HikariConfig();
        hikariConfig.setJdbcUrl(postgres.getJdbcUrl());
        hikariConfig.setUsername(postgres.getUsername());
        hikariConfig.setPassword(postgres.getPassword());

        HikariDataSource ds = new HikariDataSource(hikariConfig);
        Statement statement = ds.getConnection().createStatement();
        statement.execute("SELECT 1");
        ResultSet resultSet = statement.getResultSet();

        resultSet.next();
        int resultSetInt = resultSet.getInt(1);
        assertEquals("A basic SELECT query succeeds", 1, resultSetInt);
    }
}

8

ขณะนี้มี PostgreSQL เวอร์ชันในหน่วยความจำจาก บริษัท Search ของรัสเซียชื่อ Yandex: https://github.com/yandex-qatools/postgresql-embedded

มันขึ้นอยู่กับกระบวนการฝังของ Flapdoodle OSS

ตัวอย่างการใช้งาน (จากหน้า github):

// starting Postgres
final EmbeddedPostgres postgres = new EmbeddedPostgres(V9_6);
// predefined data directory
// final EmbeddedPostgres postgres = new EmbeddedPostgres(V9_6, "/path/to/predefined/data/directory");
final String url = postgres.start("localhost", 5432, "dbName", "userName", "password");

// connecting to a running Postgres and feeding up the database
final Connection conn = DriverManager.getConnection(url);
conn.createStatement().execute("CREATE TABLE films (code char(5));");

ฉันกำลังใช้มันอยู่บ้าง มันทำงานได้ดี

อัปเดต : โครงการนี้ไม่ได้รับการดูแลอีกต่อไป

Please be adviced that the main maintainer of this project has successfuly 
migrated to the use of Test Containers project. This is the best possible 
alternative nowadays.

1
สิ่งนี้จะต้องระเบิดในรูปแบบใหม่และน่าตื่นเต้นทุกประเภทหากคุณใช้หลายเธรดฝัง JVM หรือ Mono runtime ส้อม () กระบวนการย่อยของคุณเองหรืออะไรทำนองนั้น แก้ไข : มันไม่ได้ฝังจริงๆเป็นแค่กระดาษห่อหุ้ม
Craig Ringer

3

คุณยังสามารถใช้การตั้งค่าการกำหนดค่า PostgreSQL (เช่นรายละเอียดในคำถามและคำตอบที่ยอมรับที่นี่ ) เพื่อให้ได้ประสิทธิภาพโดยไม่จำเป็นต้องอาศัยฐานข้อมูลในหน่วยความจำ


ปัญหาหลักของ OP คือการปั่นอินสแตนซ์ Postgres ในหน่วยความจำไม่ใช่เพื่อประสิทธิภาพ แต่เพื่อความเรียบง่ายในการทดสอบหน่วย bootstrapping ในสภาพแวดล้อม dev และ CI
triple.vee

0

หากคุณใช้ NodeJS คุณสามารถใช้pg-mem (ข้อจำกัดความรับผิดชอบ: ฉันเป็นผู้เขียน) เพื่อเลียนแบบคุณลักษณะที่พบบ่อยที่สุดของ db postgres

คุณจะมีฐานข้อมูลแบบเต็มในหน่วยความจำที่แยกออกจากกันและไม่เชื่อเรื่องพระเจ้าบนแพลตฟอร์มที่จำลองพฤติกรรม PG (แม้จะทำงานในเบราว์เซอร์ )

ผมเขียนบทความเพื่อแสดงวิธีการที่จะใช้สำหรับการทดสอบหน่วยของคุณที่นี่

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