🧪تست end-to-end با Playwright

🧪تست end-to-end با Playwright


❓تست End-to-End (E2E) چیه؟

تست End-to-End یا E2E یه نوع تست نرم‌افزاریه که فرآیندهای واقعی کاربر رو از شروع تا پایان شبیه‌سازی می‌کنه تا مطمئن شیم تمام بخش‌های نرم‌افزار (شامل رابط کاربری، پایگاه داده، API‌ها و غیره) به درستی و بدون مشکل با هم کار می‌کنن.

هدف اصلی E2E اینه که رفتار سیستم رو از نگاه کاربر واقعی بررسی کنه و مطمئن بشیم که مسیرهای اصلی و بحرانی کسب‌وکار به درستی عمل می‌کنن.


حالا Microsoft Playwright چیه؟

مایکروسافت سال ۲۰۲۰ فریم‌ورک Playwright رو معرفی کرد که طی این سال‌ها خیلی با اقبال خوبی روبرو شده و به نظر من از Selenium و Cypress خیلی بهتر و سریع‌تره. Playwright این امکان رو می‌ده که اپلیکیشن‌های وب رو توی مرورگرهای مختلف (Chrome، Firefox، Safari و Edge) تست کنیم. از زبون‌های برنامه‌نویسی محبوب مثل JavaScript، TypeScript، Python، Java و NET. هم پشتیبانی می‌کنه.


به راحتی می‌شه براش تست نوشت که عین کاربر صفحات وب رو مرور کنه، نتایج رو بررسی کنه. APIها رو هم همینطور. و به راحتی توی پایپ‌لاین CI/CD تون قرار بدید.


یک مثال خیلی ساده (توی یک صفحه وب جستجو کنه و ببینه نتایج میاد یا نه)


test('search works', async ({ page }) => {

await page.goto('https://example.com');

await page.fill('#search', 'محصول');

await page.click('#submit');

await expect(page.locator('.results')).toBeVisible();

});


یه مثال دیگه ولی REST API به جای صفحه وب (از سرویس reqres که یه API مُفته برای تست، چک می‌کنه API کد ۲۰۰ بده و داده صحیح و کد ۴۰۴ برای آدرس غلط)

*

const { test, expect } = require("@playwright/test");


test.describe("API Testing with Playwright", () => {

const baseurl = "https://reqres.in/api";


test("GET API Request with - Valid 200 Response", async ({ request }) => {

const response = await request.get(`${baseurl}/users/10`);

expect(response.status()).toBe(200);

});


test("GET API Request with - Invalid 404 Response", async ({ request }) => {

const response = await request.get(`${baseurl}/usres/invalid-data`);

expect(response.status()).toBe(404);

});


test("GET Request - Verify User Details", async ({ request }) => {

const response = await request.get(`${baseurl}/users/10`);

const responseBody = JSON.parse(await response.text());

expect(response.status()).toBe(200);

expect(responseBody.data.id).toBe(10);

expect(responseBody.data.first_name).toBe("Byron");

expect(responseBody.data.last_name).toBe("Fields");

expect(responseBody.data.email).toBeTruthy();

});

});


معادل کد 📱:

using Microsoft.Playwright;

using System.Text.Json;


public class PlaywrightApiTests

{

private const string BaseUrl = "https://reqres.in/api";


[Fact]

public async Task GetApiRequest_Valid200Response()

{

using var playwright = await Playwright.CreateAsync();

var request = await playwright.APIRequest.NewContextAsync();


var response = await request.GetAsync($"{BaseUrl}/users/10");

Assert.Equal(200, response.Status);

}


[Fact]

public async Task GetApiRequest_Invalid404Response()

{

using var playwright = await Playwright.CreateAsync();

var request = await playwright.APIRequest.NewContextAsync();


var response = await request.GetAsync($"{BaseUrl}/usres/invalid-data");

Assert.Equal(404, response.Status);

}


[Fact]

public async Task GetRequest_VerifyUserDetails()

{

using var playwright = await Playwright.CreateAsync();

var request = await playwright.APIRequest.NewContextAsync();


var response = await request.GetAsync($"{BaseUrl}/users/10");

Assert.Equal(200, response.Status);


var responseBody = JsonSerializer.Deserialize(await response.TextAsync());

var userData = responseBody?.RootElement.GetProperty("data");


Assert.Equal(10, userData.Value.GetProperty("id").GetInt32());

Assert.Equal("Byron", userData.Value.GetProperty("first_name").GetString());

Assert.Equal("Fields", userData.Value.GetProperty("last_name").GetString());

Assert.False(string.IsNullOrEmpty(userData.Value.GetProperty("email").GetString()));

}

}



💬 نظر، سوال؟ E2E دارید؟