본문 바로가기
💡 Today I Learned/스터디 자료정리

[스터디6일차] 테스트 코드👩🏻‍🔧

by 솔비님 2024. 10. 30.

 

 

💡 테스트 코드는 개발한 코드의 동작이 의도한 대로 수행되는지 검증한다 
테스트 코드 작성 시 오류를 빠르게 발견해 유지보수가 쉬워지며 코드의 품질을 높혀 소프트웨어의 안정성을 높일 수 있다

크게 단위 테스트(Unit Test)와 통합 테스트(Integration Test), UI 테스트로 나뉜다

 

 

 

1.  테스트 코드의 분류

 

1-1.  단위 테스트(Unit Test)

소프트웨어의 가장 작은 단위를 테스트한다 (일반적으로 함수나 메서드 단위)

단위 테스트의 주요 목적은 코드의 각 부분이 정확하게 작동하는지 확인하는 것이며, 주로 의존성 없는 코드(로직이나 계산)에 대해 독립적으로 검증하는데 사용된다

 

1-2.  통합 테스트(Integration Test)

여러 컴포넌트나 시스템이 함께 작동할 때 발생할 수 있는 문제를 찾는다

주로 시스템의 인터페이스, 데이터의 흐름, 전체적인 동작을 검증하는데 중점을 둔다

 

1-3.  UI 테스트

사용자 인터페이스를 테스트해서 앱이 사용자 입력에 대해 올바르게 반응하는지 확인한다

 

 


2.  테스트 코드 작성 예시

Swift에서는 XCTest라는 프레임워크를 사용해 테스트 코드를 작성한다

XCTest란 각 테스트 케이스를 정의하고 실행하며, 테스트의 성공과 실패를 자동으로 검증해 준다

 

 

2-1.  Xcode에서 XCTest 사용하기

최초 프로젝트 생성 시에는 Include Tests 체크☑️

 

 

추후 프로젝트에 추가 시에는 네비게이션 바 - 6번째 탭 - 좌측 하단의 "+" - New Unit Test Target

 

 

하면 아래처럼 테스트 파일들과 클래스가 생긴 것을 확인할 수 있다

 

 

새로 생긴 테스트파일에 @testable import (프로젝트명) 해준다

*프로젝트 전체에 접근 권한이 생긴다

 

 

import 안될 땐 Enable Testing Search Paths를 No에서 Yes로 변경해준다

 

 

 

2-2.  테스트 코드 작성

 

[ 템플릿 구조에 대한 설명 ]

  • setUpWithError(),tearDownWithError() : 각 테스트가 실행되기 전과 후에 호출된다. 테스트 환경을 초기화하거나 해제하는 코드가 들어갈 수 있다
  • testExample() : 기본 테스트 함수 예제
  • testPerformanceExample() : 성능 테스트 예제 함수

 

 

먼저 검사할 예시 코드를 뷰컨트롤러에 만들어 주고 

 

 

테스트 파일로 이동하여 목적에 맞게 테스트 코드를 작성해 준다

 

 

테스트 시작: Product - Test or 단축키(cmd+U)

Testing Build 진행 후 시뮬레이터가 켜졌다가 테스트 완료 알림이 뜬다

 

 

 

상단에 Test Completed 확인

테스트 성공 시 초록색 다이아몬드, 실패 시 빨간색 X와 실패 원인이 출력된다

 

 

 

테스트 성공 예시

 

 

 

테스트 실패 예시

를 보고싶어서 일부러 add() 함수를 틀리게 수정해보았다(테스트 코드는 수정할 필요 없음!!)

 

 

faild 와 함께 실행된 결과 (-2) 와 오류 시 출력되도록 설정해둔 문구가 뜬다 "3 + 5는 8이어야 합니다."

해당 문구 확인 후 add() 함수를 수정해 주면 된다

 

 

 


3.  XCTest에서 제공하는 주요 Assertion 함수

1)  XCTAssertEqual : result 값과 넣어준 결과 값이 같은지 확인

func testAddition() {
    let result = 2 + 3
    XCTAssertEqual(result, 5, "2 + 3은 5이어야 합니다.")
}

 

2)  XCTAssertNotEqual : result 값과 넣어준 결과 값이 같지 않은지 확인(값이 같으면 테스트 실패)

func testSubtraction() {
    let result = 10 - 5
    XCTAssertNotEqual(result, 3, "10 - 5는 3이 아니어야 합니다.")
}

 

3)  XCTAssertTrue : 조건이 true 인지 확인(조건이 false이면 테스트 실패)

func testIsPositiveNumber() {
    let number = 10
    XCTAssertTrue(number > 0, "number는 양수이어야 합니다.")
}

 

4)  XCTAssertFalse : 조건이 false 인지 확인(조건이 true이면 테스트 실패)

func testIsNegativeNumber() {
    let number = -5
    XCTAssertFalse(number > 0, "number는 음수이어야 합니다.")
}

 

5)  XCTAssertNil : 값이 nil 인지 확인(값이 있으면 실패)

func testValueIsNil() {
    let optionalValue: String? = nil
    XCTAssertNil(optionalValue, "optionalValue는 nil이어야 합니다.")
}

 

6)  XCTAssertNotNil : 값이 nil 이 아닌지 확인(값이 nil이면 실패)

func testValueIsNil() {
    let optionalValue: String? = nil
    XCTAssertNil(optionalValue, "optionalValue는 nil이어야 합니다.")
}

  

7)  XCTFail : 조건 없이 테스트를 강제로 실패하게 함

func testUnimplementedFeature() {
    XCTFail("이 기능은 아직 구현되지 않았습니다.")
}

 

8)  XCTAssertGreaterThan : 첫 번째 값이 두 번째 값보다 큰지 확인(첫 번째 값이 더 작거나 같으면 실패)

9)  XCTAssertLessThan : 첫 번째 값이 두 번째 값보다 작은지 확인(첫 번째 값이 더 크거나 같으면 실패)

 

 


🔗  참고자료

https://f-lab.kr/insight/test-code-writing-guide

 

테스트 코드 작성 가이드: 단위 테스트부터 통합 테스트까지

테스트 코드의 중요성과 단위 테스트, 통합 테스트의 차이점을 이해하고, 실제 테스트 코드 작성 방법에 대해 알아보는 가이드입니다.

f-lab.kr