나의 기록, 현진록

iOS에서 TDD(Test-Driven-Development, 테스트 주도 개발) 본문

iOS

iOS에서 TDD(Test-Driven-Development, 테스트 주도 개발)

guswlsdk 2023. 3. 21. 22:38
반응형

🙋‍♂️ TDD(테스트 주도 개발)이란?

- 매우 짧은 개발 사이클을 반복하는 소프트웨어 개발 프로세스 중 하나이다.

- 1. 개발자는 먼저 요구사항을 검증하는 자동화된 테스트 케이스를 작성한다.

- 2. 테스트 케이스를 통과하기 위한 최소한의 코드를 생성한다.

- 3. 작성한 코드를 표준에 맞도록 리팩토링한다.

 

테스트가 주가 되어 개발을 이끌어간다.

테스트를 작성하면서 메서드를 완성시킨다.

 

 

- Red : 실패하는 테스트를 작성하는 구간

- Green : 실패한 테스트를 통과하기 위해 최소한의 변경을 하여 테스트에 성공하는 구간

- Refactor : 테스트의 성공을 유지하면서 코드를 더 나은 방향으로 개선해나가는 구간

 

 

🙋‍♂️ TDD(테스트 주도 개발)의 장점

- 테스트를 통과하는 코드를 작성하기 위해 재사용성과 의존성에 대해 고민하여 보다 의존성이 낮은 코드를 작성할 수 있다.

- 테스트를 통과하는 코드를 작성해나가면 안전한 코드를 작성할 수 있다.

- 유지 보수가 용이하다. 

 

 

🙋‍♂️ TDD(테스트 주도 개발)의 단점

- 개발 속도

 

 

 


🙋‍♂️ TDD 실습

struct StrangeCalculator {
    func addNumbers(of numbers: [Int]) -> Int {
        return numbers.reduce(0, +)
    }
    
    // for TDD
    func addOddNumbers(of numbers: [Int]) -> Int {
        return 0
    }
    
    func addEvenNumbers(of numbers: [Int]) -> Int {
        return 0
    }
}

위 코드로 실습을 해보자.

 

🙋‍♂️ addOddNumbers

- 배열 중에서 모든 홀수의 합을 반환하도록 동작하는 메서드이다.

- TDD에서는 메서드의 기능보다 테스트를 먼저 작성해야한다.

 

func test_빈배열을전달했을때_0이나오는지(){
        // given
        let numbers : [Int] = []
        
        // when
        let result = sut.addOddNumbers(of: numbers)
        
        // then
        XCTAssertEqual(result, 0)
    }

실제 메서드에서는 동작없이 0을 리턴하고 있으니 테스트가 통과한다.

 

 

🟥 Red

func test_3을전달했을때_3이나오는지(){
        // given
        let numbers = [3]
        
        // when
        let result = sut.addOddNumbers(of: numbers)
        
        // then
        XCTAssertEqual(result, 3)
    }

Red 상태이다. 이제 테스트를 Green으로 만들어주기 위해 코드를 수정해보자.

 

 

 

 

🟩 Green

func addOddNumbers(of numbers: [Int]) -> Int {
    if numbers.isEmpty { return 0 }
    return numbers.filter{$0 % 2 != 0}.reduce(0, +)
}

 

테스트에 정상적으로 통과한다.

 

 

 

추가적으로 테스트 코드를 작성해보자

 

 

 

테스트를 완료했으면 메서드를 리팩토링해야 하는데 처음부터 저렇게 코딩해서 리팩토링은 생략......

 

 

반응형