Skip to main content

웹 페이지에 대한 엔드 투 엔드 테스트 만들기

Copilot Chat는 엔드 투 엔드 테스트를 생성하는 데 도움이 될 수 있습니다.

HTML이 동적으로 생성되므로 웹 페이지에 대한 엔드 투 엔드 테스트를 만드는 것은 시간이 오래 걸리고 복잡할 수 있습니다. Copilot Chat는 웹 페이지와 상호 작용하고 예상된 결과의 유효성을 검사하는 데 필요한 코드를 제안하여 웹 페이지에 대한 엔드 투 엔드 테스트를 만드는 데 도움이 될 수 있습니다.

예제 시나리오

웹 페이지에 제품 세부 정보를 표시하는 React 애플리케이션을 상상해 보세요. 제품 세부 정보가 올바르게 표시되는지 확인하기 위해 엔드 투 엔드 테스트를 만들어야 합니다. Copilot Chat에게 이러한 테스트를 생성하도록 요청할 수 있습니다.

import React, { useState, useEffect } from 'react';
import PropTypes from 'prop-types';

const ProductDetails = ({ productId = '1' }) => {
  const [product, setProduct] = useState(null);
  const [loading, setLoading] = useState(true);
  const [error, setError] = useState(null);

  useEffect(() => {
    const fetchProduct = async () => {
      try {
        const response = await fetch(`/api/product/${productId}`);
        if (!response.ok) {
          throw new Error('Product not found');
        }
        const data = await response.json();
        setProduct(data);
        setLoading(false);
      } catch (err) {
        setError(err.message);
        setLoading(false);
      }
    };

    fetchProduct();
    return;
  }, [productId]); // Add productId to dependency array

  if (loading) return <div>Loading...</div>;
  if (error) return <div>Error: {error}</div>;

  return (
    <div>
      {product && (
        <div>
          <h2>{product.name}</h2>
          <p>{product.description}</p>
          <p>Price: ${product.price}</p>
        </div>
      )}
    </div>
  );
};

ProductDetails.propTypes = {
  productId: PropTypes.string
};

export default ProductDetails;

예시 프롬프트

Note

이 예제에서는 엔드투엔드 테스트에 Playwright를 사용하지만 Selenium 또는 Cypress와 같은 다른 프레임워크를 사용할 수 있습니다.

Using Playwright, generate an e2e test to ensure the product displays correctly.

Copilot를 모델로 사용하려는 기존 테스트가 있는 경우 #file: path/to/test-file.js를 사용하여 파일 경로를 제공하고 프롬프트에 이 정보를 포함할 수 있습니다.

예제 응답

Note

다음 응답이 예제입니다. Copilot Chat 응답은 비결정적이므로 여기에 표시된 응답과 다른 응답을 얻을 수 있습니다.

Copilot는 애플리케이션에 사용할 수 있는 엔드 투 엔드 테스트로 응답합니다.

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

test.describe('ProductDetails Component', () => {
  test.beforeEach(async ({ page }) => {
    // Set up API mocking
    await page.route('/api/product/1', async (route) => {
      await route.fulfill({
        status: 200,
        contentType: 'application/json',
        body: JSON.stringify({
          name: 'Test Product',
          description: 'This is a test product',
          price: 99.99
        })
      });
    });

    // Mock error response for product ID 999
    await page.route('/api/product/999', async (route) => {
      await route.fulfill({
        status: 404,
        contentType: 'application/json',
        body: JSON.stringify({ error: 'Product not found' })
      });
    });
  });

  test('displays loading state initially', async ({ page }) => {
    await page.goto('/product/1');
    const loadingElement = page.locator('text=Loading...');
    await expect(loadingElement).toBeVisible();
  });

  test('displays product details correctly', async ({ page }) => {
    await page.goto('/product/1');

    // Wait for loading to disappear
    await expect(page.getByText('Loading...')).toBeHidden();

    // Check all product details
    await expect(page.locator('h2')).toHaveText('Test Product');
    await expect(page.locator('text=This is a test product')).toBeVisible();
    await expect(page.locator('text=Price: $99.99')).toBeVisible();
  });

  test('displays error message when product not found', async ({ page }) => {
    await page.goto('/product/999');

    // Wait for loading to disappear
    await expect(page.getByText('Loading...')).toBeHidden();

    // Check error message
    await expect(page.locator('text=Error: Product not found')).toBeVisible();
  });
});

추가 참고 자료