

단위 테스트는 소프트웨어의 가장 작은 단위(클래스, 메서드, 함수 등)를 개별적으로 테스트하는 것입니다. 각 모듈이 독립적으로 기대한 대로 작동하는지 확인하는 것이 목적입니다.
테스트 범위: 하나의 메서드, 클래스 또는 함수
목적: 코드의 특정 기능이 올바르게 동작하는지 확인
실행 속도: 매우 빠름
사용 기술
장점: 빠르게 실행되고, 버그를 일찍 발견할 수 있습니다.
단점: 전체 시스템의 동작을 확인하지는 않으며, 외부 의존성(Mock)을 사용해야 하는 경우가 많습니다.
예시) Calculator 클래스의 add 메서드가 제대로 작동하는지 검증하는 단위 테스트
@Test public void testAddition() { Calculator calculator = new Calculator(); assertEquals(5, calculator.add(2, 3)); // 2와 3을 더하면 5가 나와야 함 }
통합 테스트는 개별적으로 테스트된 모듈들이 결합되었을 때, 이들이 서로 잘 작동하는지 검증하는 테스트입니다. 각 모듈이 올바르게 통합되어 데이터가 흐르고, 시스템이 의도한 대로 상호작용하는지 확인하는 것이 목적입니다.
테스트 범위: 여러 모듈 또는 컴포넌트 간의 상호작용
목적: 모듈 간의 데이터 흐름과 상호작용 검증
실행 속도: 단위 테스트보다 느림
사용 기술:
장점: 시스템의 여러 부분이 결합되었을 때 발생하는 문제를 조기에 발견할 수 있습니다.
단점: 설정이 복잡할 수 있으며, 테스트 속도가 느려집니다.
예시) 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); } }
End-to-End 테스트는 시스템의 시작부터 끝까지 전체적인 흐름을 테스트하는 것입니다. 이는 사용자 시나리오 기반으로, 실제 환경에서 애플리케이션이 올바르게 작동하는지 확인하는 데 중점을 둡니다. 예를 들어, 사용자 로그인부터 데이터베이스에서 데이터를 가져오는 과정까지를 테스트합니다.
테스트 범위: 시스템 전체, 프론트엔드부터 백엔드까지
목적: 시스템의 모든 요소가 통합된 상태에서 실제 사용자 관점에서 동작하는지 확인
실행 속도: 가장 느림
사용 기술:
장점: 전체 시스템의 흐름을 검증할 수 있으며, 실제 사용자 환경을 재현합니다.
단점: 설정 및 실행 시간이 길고, 유지보수가 어려울 수 있습니다.
예시) 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'); }); });
UI 테스트는 사용자 인터페이스가 사용자의 기대대로 동작하는지 확인하는 테스트입니다. 이는 주로 프론트엔드의 버튼 클릭, 폼 제출, 화면 렌더링 등을 테스트하여 화면에서 제공하는 기능이 정상적으로 동작하는지를 확인합니다.
테스트 범위: 사용자 인터페이스(UI)
목적: 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(); // 결과 확인 });