Writing E2E Test with Playwright in .Net (Part II)
ในบทความนี้จะมา อธิบายการทำงานของ code ที่ผมเขียนไว้ในตอนที่แล้ว Part I ว่ามีการทำงานอย่างไร มาเริ่มจากพระเอกของเราเลย
Playwright
เริ่มจากตัว playwright เองว่ามีอะไรที่ทำให้มันทั้งเร็วและกินทรัพยาการน้อย ตามเอกสารในเว็บเขาบอกว่า
A single browser instance in Playwright can create multiple isolated browser contexts. Each browser context can run multi-page emulation scenarios
หรือก็คือเราสามารถใช้แค่ browser instance เดียวแต่สร้าง context เพื่อแยก session หรือก็คือแยก user ออกจากแต่ล่ะ test ได้นั้นเอง ซึ่งเราจะสร้าง Page instance ที่เป็นตัวแทนของ tab บน context นั้นๆ นับเป็นข้อได้เปรียบที่มีมากกว่า selenium เพราะ selenium ต้องสร้าง new browser instance ทุกครั้ง ดังนั้นผู้นำไปใช้นำ playwright ไปใช้ต้องรู้ว่าจะเขียน code อย่างไงด้วยนะครับ เพราะผมเคยเขียน 10 test class ใช้เวลา 1.20 นาที หลังจากใช้อย่างถูกวิธีจะใช้เวลาเพียงแค่ 20 วินาทีเลยเท่านั้น มันสุดจริงๆ ครับมาต่อที่ตัวต่อไป
xUnit
เป็น test framework ยอดนิยมของทาง .NET ซึ่งก็ง่าบและ feature ค่อนข้างเยอะ ในที่นี้ผมใช้ 2 feature
- Collection fixtures ที่ผมนำมาใช้คือ การ spawn in-proc web under test เพียง 1 ตัวสำหรับทุก tests class เลย โดยอาศัยการ setup แค่ครั้งเดียวสำหรับ collection หนึ่งๆ
- IAsyncLifetime จะทำการ run InitializeAsync เพียงครั้งเดียวในแต่ล่ะ Test Class ซึ่งต่างจากข้อที่หนึ่งนะครับ ซึ่งผมเอามาสร้าง Context สำหรับแต่ล่ะ Test Class
ขอพูดถึง Technique ว่าผมทำอย่างไรในการที่จะ run เจ้า kestrel ภายใต้ test execution ได้ผมก็ไม่ได้คิดได้เองแต่ได้เข้าไปดู code ที่ทาง Microsoft ใช้แต่ไม่มีการเปิดเผยหรือ document ไว้ แต่ด้วยที่ว่ามันเป็น opensource เราก็เลยสามารถเข้าไปดูว่าเขาทำอย่างไงที่ ServerFixtures
ลองดูที่ class WebHostServerFixture.cs ของ repo
โดยเราจะทำการสร้าง Playwright instance และ Browser instance ที่ WebHostServerFixture เลยและยังใช้เป็นตาม code ด้านล่าง
ทำให้เรามี Browser instance เดียวเท่านั้นตามที่ได้บอกไว้ด้านบน และ Context มันสร้างที่จังหวะไหนกัน ตามผมมาครับทุกคน Context มันจะอยู่ที่ abstract class ที่ชื่อ PlaywrightSharpBaseTest.cs ที่บรรทัดที่ 26 แลำสร้าง page ที่บรรทัด 28
หลังจากมีทุกอย่างตามด้านบนเราก็ไปที่ตัว Test class กันเลยตามด้านล่าง
จะเห็นได้ว่าบรรทัดที่ 8 เราจะสามารถหา endpoint ของ webserver เราได้จาก Server.RootUri.AbsoluteUri และเราก็จะมี Page instance ให้ใช้เปิด page ได้ทันที เห็นมั้ยครับ แค่นี้ชีวิตเราก็ง่ายขึ้นเยอะ
วันนี้ขอจบเพียงแค่นี้เดี๋ยวต่อไปผมจะแนะนำการทำ mock external service เวลาเรา run E2E กันครับด้วย Lib ที่ชื่อว่า Agoda.IoC ซึ่งที่ทำงานผมใช้จริงอยู่ด้วยครับ
หากเพื่อนๆท่านไหนมีคำถามก็ติดต่อสอบถามมาได้เลยนะครับ หรือจะไปติดตามได้ที facebook : .NET Thailand