Unit Test, Integration Test, End-to-End Test, UI Test

박세현·2024년 10월 13일
0

추가공부

목록 보기
11/12
post-thumbnail

소프트웨어 테스트(Software Testing)

1. Unit Test (단위 테스트)

단위 테스트는 소프트웨어의 가장 작은 단위(클래스, 메서드, 함수 등)를 개별적으로 테스트하는 것입니다. 각 모듈이 독립적으로 기대한 대로 작동하는지 확인하는 것이 목적입니다.

  • 테스트 범위: 하나의 메서드, 클래스 또는 함수

  • 목적: 코드의 특정 기능이 올바르게 동작하는지 확인

  • 실행 속도: 매우 빠름

  • 사용 기술

    • Java: JUnit, TestNG
    • JavaScript/React: Jest, Mocha
    • Python: pytest, unittest
  • 장점: 빠르게 실행되고, 버그를 일찍 발견할 수 있습니다.

  • 단점: 전체 시스템의 동작을 확인하지는 않으며, 외부 의존성(Mock)을 사용해야 하는 경우가 많습니다.

예시) Calculator 클래스의 add 메서드가 제대로 작동하는지 검증하는 단위 테스트

@Test
public void testAddition() {
    Calculator calculator = new Calculator();
    assertEquals(5, calculator.add(2, 3));  // 2와 3을 더하면 5가 나와야 함
}

2. Integration Test (통합 테스트)

통합 테스트는 개별적으로 테스트된 모듈들이 결합되었을 때, 이들이 서로 잘 작동하는지 검증하는 테스트입니다. 각 모듈이 올바르게 통합되어 데이터가 흐르고, 시스템이 의도한 대로 상호작용하는지 확인하는 것이 목적입니다.

  • 테스트 범위: 여러 모듈 또는 컴포넌트 간의 상호작용

  • 목적: 모듈 간의 데이터 흐름과 상호작용 검증

  • 실행 속도: 단위 테스트보다 느림

  • 사용 기술:

    • Spring Boot: @SpringBootTest
    • Node.js: Supertest
    • Python: pytest + requests
  • 장점: 시스템의 여러 부분이 결합되었을 때 발생하는 문제를 조기에 발견할 수 있습니다.

  • 단점: 설정이 복잡할 수 있으며, 테스트 속도가 느려집니다.

예시) UserService가 데이터베이스와 통합되어 동작하는지 확인하는 통합 테스트

@SpringBootTest
public class UserServiceIntegrationTest {
    @Autowired
    private UserService userService;
    @Test
    public void testCreateUser() {
        User user = new User("testUser", "password");
        User savedUser = userService.createUser(user);  // 서비스 계층과 데이터베이스의 통합 테스트
        assertNotNull(savedUser);
    }
}

3. End-to-End Test (E2E 테스트)

End-to-End 테스트는 시스템의 시작부터 끝까지 전체적인 흐름을 테스트하는 것입니다. 이는 사용자 시나리오 기반으로, 실제 환경에서 애플리케이션이 올바르게 작동하는지 확인하는 데 중점을 둡니다. 예를 들어, 사용자 로그인부터 데이터베이스에서 데이터를 가져오는 과정까지를 테스트합니다.

  • 테스트 범위: 시스템 전체, 프론트엔드부터 백엔드까지

  • 목적: 시스템의 모든 요소가 통합된 상태에서 실제 사용자 관점에서 동작하는지 확인

  • 실행 속도: 가장 느림

  • 사용 기술:

    • Cypress (JavaScript): 웹 애플리케이션의 E2E 테스트에 사용
    • Selenium: 브라우저 자동화를 통해 다양한 시나리오 테스트
  • 장점: 전체 시스템의 흐름을 검증할 수 있으며, 실제 사용자 환경을 재현합니다.

  • 단점: 설정 및 실행 시간이 길고, 유지보수가 어려울 수 있습니다.

예시) Cypress : 이 테스트는 사용자가 로그인 페이지에 접속하고, 로그인 정보를 입력해 대시보드 페이지로 이동하는 과정을 실제 사용자 시나리오로 확인하는 E2E 테스트

describe('Login Test', () => {
    it('Should login successfully', () => {
        cy.visit('/login');
        cy.get('input[name="username"]').type('user');
        cy.get('input[name="password"]').type('password');
        cy.get('button[type="submit"]').click();
        cy.url().should('include', '/dashboard');
    });
});

4. UI Test (사용자 인터페이스 테스트)

UI 테스트는 사용자 인터페이스가 사용자의 기대대로 동작하는지 확인하는 테스트입니다. 이는 주로 프론트엔드의 버튼 클릭, 폼 제출, 화면 렌더링 등을 테스트하여 화면에서 제공하는 기능이 정상적으로 동작하는지를 확인합니다.

  • 테스트 범위: 사용자 인터페이스(UI)

  • 목적: UI 요소들이 제대로 동작하는지, 시각적으로도 이상이 없는지 검증

  • 실행 속도: 단위 테스트보다 느림

  • 사용 기술:

    • Selenium: UI 자동화 테스트 도구
    • Cypress: UI 테스트와 E2E 테스트 모두 가능
    • React Testing Library: React 컴포넌트의 UI 테스트
  • 장점: 사용자 인터페이스가 시각적으로 그리고 기능적으로 올바르게 동작하는지 확인할 수 있습니다.

  • 단점: 테스트가 브라우저 환경에서 실행되므로 느릴 수 있으며, UI 변경 시 테스트도 수정이 필요합니다.

예시) React Testing Library: UI에서 버튼이 렌더링되고, 클릭했을 때 기대한 메시지가 나타나는지를 확인하는 UI 테스트

import { render, screen, fireEvent } from '@testing-library/react';
import App from './App';
test('renders a button and checks click event', () => {
    render(<App />);
    const button = screen.getByText('Submit');
    fireEvent.click(button);  // 버튼 클릭 이벤트
    expect(screen.getByText('Submitted!')).toBeInTheDocument();  // 결과 확인
});

요약

  • Unit Test: 개별 모듈이나 함수가 올바르게 동작하는지 확인하는 가장 작은 단위의 테스트.
  • Integration Test: 여러 모듈이 결합되어 상호작용하는 부분을 검증하는 테스트.
  • End-to-End Test: 시스템 전체를 실제 사용자 관점에서 테스트하는 가장 큰 범위의 테스트.
  • UI Test: 사용자 인터페이스 요소들이 정상적으로 동작하는지를 검증하는 테스트.
profile
귤귤

0개의 댓글