21. 11. 09 Unit test, Double stack

4938 단어 일일회고TILTIL

Unit Test

: 컴퓨터 프로그래밍에서 소스 코드의 특정 모듈이 의도된 대로 정확히 작동하는지 검증하는 절차. 모든 함수와 메서드에 대한 test case를 작성하는 절차를 말한다.

테스트를 한다는 것은 안정성을 보장하는 것!

  • 유닛 테스트의 장점
    • 해당 메서드에 대해 독립적으로 테스트를 하기 때문에 빠른 리팩토링 반영과 빠른 테스트를 진행할 수 있다.
    • 코드의 확장이나 리팩토링 시에서도 안정성을 확보한 채로 빠르게 대응할 수 있다.
  • FIRST 원칙
    • Fast - test는 빠르게 동작할 수 있어야 한다.
    • Independent / Isolated - 각각의 테스트는 서로 독립적이며 의존해서는 안된다.
    • Repeatable - 테스트는 언제 어디서나 같은 결과가 반복되어야 한다. 통제가 어려운 부분에 대해서는 테스트를 위한 객체를 만들어주는 방법도 있다.
    • Self-Validating - 테스트는 Bool을 이용하여 성공, 실패에 대해서 스스로 검증이 가능해야 한다.
    • Timely - 이상적인 테스트는 실제 코드를 구현하기 직전에 구현해야 한다.
  • XCTest → 유닛 테스트, 퍼포먼스 테스트, UI 테스트를 만들고 실행하는 프레임워크. 테스트에서 사용되는 코드들을 사용하기 위해서는 이 XCTest 프레임워크가 반드시 import 되어야 한다.

Double Stack

→ 두개의 스택으로 큐를 구현하는 아이디어! ( 스택은 배열로 구현 )

→ 더블 스택은 배열의 마지막 요소를 제거하는 연산 removeLast()은 재정렬이 필요하지 않으므로 시간복잡도가 O(1)임을 활용한 방법이다.

// 요런식으로 프로젝트에 적용해보았다
struct Queue<Element> {
    var enQueueElements: [Element] = []
    var deQueueElements: [Element] = []
    
    mutating func enQueueElement(_ element: Element) {
        enQueueElements.append(element)
    }
    
    mutating func deQueueFirstElement() throws -> Element? {
        if enQueueElements.isEmpty && deQueueElements.isEmpty {
            return nil
        }
        if deQueueElements.isEmpty {
            deQueueElements = enQueueElements.reversed()
            enQueueElements.removeAll()
        }
        return deQueueElements.removeLast()
    }
}

수정 (21. 11. 24)
아 그런데 나중에 알고보니 reversed()가 시간복잡도 O(n)이었다. 같은 이름의 메서드가 두개가 존재하는데, 무슨 차이가 있는지 공부해봐야겠다.

컴퓨터에는 trade off → 메모리를 많이쓰면 연산을 덜해도되는데, 연산을 많이 하면 메모리를 덜 쓸 수 있다.

좋은 웹페이지 즐겨찾기