ในการรันเทส End-to-end จะมีขั้นตอนพื้นฐานที่ต้องทำเสมอคือ การ Login เพราะการใช้งานฟีเจอร์หลักต่างๆมักต้องทำการ Login ก่อนนั่นเอง แล้วถ้าขั้นตอนนี้กินเวลาการเทสล่ะ เช่น หน้า Login โหลดช้า กว่าที่จะ login เสร็จ แต่ละครั้งใช้เวลาไป 5 – 6 วินาที ลองนึกภาพว่าเรามีเทสซักร้อยข้อ เท่ากับเราเสียเวลาแค่ Login อย่างเดียวๆรวมเกือบ 10 นาทีเลย

จัดเก็บค่าการ Login ด้วย Storage State

โดยผมจะแสดงตัวอย่างการที่เราเอาขั้นตอนการ Login ไปไว้ที่ Global Setup และให้ทำการบันทึก State เก็บไว้ หลังจากนั้นในเทสเคสก็จะสั่งให้ไปใช้งาน Storage ทำให้ไม่จำเป็นต้อง Login ซ้ำๆในแต่ละเคสนั่นเอง

global-setup.ts เพิ่มขั้นตอนในการ login เข้าไป และหลัง login ผ่านแล้วให้ทำการบันทึก State โดยใช้คำสั่ง storageState โดย save เป็น json file

// global-setup.ts

import { chromium, FullConfig } from '@playwright/test';

async function globalSetup(config: FullConfig) {
  const browser = await chromium.launch();
  const page = await browser.newPage();
  await page.goto('https://demoqa.com/login');
  await page.fill('id=userName', 'demoqahive01');
  await page.fill('id=password', 'T@stpw120');
  await Promise.all([
    page.waitForNavigation(),
    page.click('id=login')
  ]);
  await page.context().storageState({ path: 'storageState.json' });
  await browser.close();
}

export default globalSetup;

playwright.config.ts ให้เพิ่มการเรียกใช้ Global setup step ลงไป

const config: PlaywrightTestConfig = {
  globalSetup: './global-setup', 
  ...
}

ใน test spec เพิ่มการเรียกใช้ State ที่เราทำการ save ไว้ โดยการสั่ง use storageState ที่เราบันทึกไว้นั่นเอง

import { expect, test } from '@playwright/test';

test.use({ storageState: 'storageState.json' });
test.only('Reuse Authentication state', async ({ page }) => {
  await page.goto('https://demoqa.com/profile');
  await expect(page.locator('id=userName-value')).toContainText('demoqahive01');
});

ประโยชน์

  • ลดเวลาการเทสลงอย่างเห็นได้ชัด ไม่ต้องมา login ซ้ำๆ
  • ลดการพึ่งพาระบบอื่นๆ ถ้า Authen มาจาก 3rd Party
  • นำไปใช้กับเทสเคสอื่นๆได้ด้วยนะ เพื่อข้ามบางขึ้นตอนที่ระบบยังไม่เสถียร

ดาวน์โหลดตัวอย่าง Source code ได้ที่ Githhub

Playwright Web Automated Test

เรียนรู้การทดสอบ Web Application ด้วย

Playwright และ TypeScript

Previous articleVisual Comparison Testing ด้วย Playwright
Next articleถ้าเทสรันช้า ก็รันเทสพร้อมๆกันด้วย Playwright Parallelism

1 COMMENT

  1. […] การเทส E2E หรือ API เมื่อเรามีเทสมากขึ้นเรื่อยๆ จะมีปัญหาตามมาคือ ระยะเวลาที่ใช้ในการรันเทสเพิ่มขึ้นเรื่อยๆจนทำให้การเทสเป็นคอขวดของการพัฒนา Software อีกครั้ง โดยการแก้ไขก็มีหลากหลายวิธีเช่น ลดจำนวน E2E เทส และไปเพิ่มเทสในส่วน API หรือ Unit Test แทน หรือจะเป็นการลดขั้นตอนการ login ซ้ำๆลงด้วย Authentication State […]