Swift - TDD 테스트의 종류(3/3) - 엔드 투 엔드 테스트

Marble·2025년 1월 12일

이번 글에서는 Swift에서 사용되는 테스트 중 엔드 투 엔드 테스트에 대해 알아보겠습니다.

엔드 투 엔드 테스트(End-to-End Test, E2E Testing)

엔드 투 엔드 테스트(End-to-End Testing, E2E Testing)는 소프트웨어 애플리케이션의 전체 시스템을 대상으로 수행되는 테스트 방식으로, 사용자 관점에서 애플리케이션의 모든 구성 요소가 함께 올바르게 작동하는지를 검증합니다. 이 테스트는 실제 사용자 시나리오를 기반으로 하여, 시스템의 모든 단계가 예상대로 작동하는지를 확인하는 데 중점을 둡니다.

특징

  1. 전체 시스템 검증
    엔드 투 엔드 테스트는 애플리케이션의 모든 구성 요소(프론트엔드, 백엔드, 데이터베이스 등)가 통합되어 올바르게 작동하는지를 검증합니다.

  2. 사용자 시나리오 기반
    실제 사용자가 애플리케이션을 사용하는 방식에 따라 테스트를 작성합니다. 이는 비즈니스 요구 사항을 충족하는지 확인하는 데 도움이 됩니다.

  3. 자동화 가능
    엔드 투 엔드 테스트는 자동화하여 반복적으로 수행할 수 있으며, 이를 통해 지속적인 통합 및 배포(CI/CD) 환경에서 유용하게 활용됩니다.

  4. 복잡한 환경
    다양한 시스템 구성 요소와 외부 서비스가 상호작용하는 복잡한 환경에서 진행되므로, 테스트 환경을 설정하고 관리하는 데 어려움이 있을 수 있습니다.

장점

  1. 종합적 검증
    애플리케이션의 모든 구성 요소가 함께 작동하는지를 확인함으로써, 시스템의 신뢰성을 높일 수 있습니다.

  2. 사용자 경험 확인
    실제 사용자 시나리오를 기반으로 하여, 최종 사용자의 경험을 검증할 수 있습니다. 이는 기능이 비즈니스 요구 사항을 충족하는지를 확인하는 데 중요합니다.

  3. 조기 결함 발견
    시스템의 여러 구성 요소 간의 상호작용에서 발생할 수 있는 결함을 조기에 발견할 수 있습니다.

단점

  1. 시간 소모
    전체 시스템을 테스트하는 데 시간이 많이 소요될 수 있으며, 복잡한 테스트 시나리오의 경우 더욱 그렇습니다.

  2. 유지보수 비용
    시스템 변경 시 테스트 스크립트도 함께 수정해야 하므로, 유지보수 비용이 증가할 수 있습니다.

  3. 환경 설정의 복잡성
    테스트 환경을 설정하는 것이 복잡할 수 있으며, 다양한 구성 요소와 외부 시스템 간의 통합이 필요합니다.

예제 코드는 다음과 같습니다.

// UserService.swift
class UserService {
    private var loggedInUser: String?

    func login(username: String, password: String) -> Bool {
        // 실제 애플리케이션에서는 서버와의 인증 과정이 필요함
        if username == "testUser" && password == "password123" {
            loggedInUser = username
            return true
        }
        return false
    }

    func fetchData() -> String? {
        guard loggedInUser != nil else { return nil }
        return "User data for \(loggedInUser!)"
    }
}

위 코드는 로그인 및 데이터 조회 기능을 가진 클래스입니다.

// EndToEndTests.swift
import XCTest

class EndToEndTests: XCTestCase {
    var userService: UserService!

    override func setUp() {
        super.setUp()
        userService = UserService()
    }

    override func tearDown() {
        userService = nil
        super.tearDown()
    }

    func testUserLoginWithValidCredential() {
        // 1. 사용자 로그인 시도
        let loginSuccess = userService.login(username: "testUser", password: "password123")
        XCTAssertTrue(loginSuccess, "User should be able to log in with valid credentials.")
        
        // 2. 로그인 후 데이터 조회
        let userData = userService.fetchData()
        XCTAssertEqual(userData, "User data for testUser", "User data should be fetched correctly after login.")
    }

    func testUserLoginWithInvalidCredentials() {
        // 1. 잘못된 사용자 로그인 시도
        let loginSuccess = userService.login(username: "invalidUser", password: "wrongPassword")
        XCTAssertFalse(loginSuccess, "User should not be able to log in with invalid credentials.")
        
        // 2. 로그인 실패 후 데이터 조회 시도
        let userData = userService.fetchData()
        XCTAssertNil(userData, "User data should not be fetched when user is not logged in.")
    }
}

사용자가 로그인하고 데이터를 조회하는 시나리오가 올바르게 작동하는지 검사합니다.

profile
개발자가 되고 싶은 공돌이

0개의 댓글