🧪تست 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
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 دارید؟