: 컴퓨터 프로그래밍에서 소스 코드의 특정 모듈이 의도된 대로 정확히 작동하는지 검증하는 절차. 모든 함수와 메서드에 대한 test case를 작성하는 절차를 말한다.
테스트를 한다는 것은 안정성을 보장하는 것!
Fast
- test는 빠르게 동작할 수 있어야 한다.Independent / Isolated
- 각각의 테스트는 서로 독립적이며 의존해서는 안된다.Repeatable
- 테스트는 언제 어디서나 같은 결과가 반복되어야 한다. 통제가 어려운 부분에 대해서는 테스트를 위한 객체를 만들어주는 방법도 있다.Self-Validating
- 테스트는 Bool을 이용하여 성공, 실패에 대해서 스스로 검증이 가능해야 한다.Timely
- 이상적인 테스트는 실제 코드를 구현하기 직전에 구현해야 한다.→ 두개의 스택으로 큐를 구현하는 아이디어! ( 스택은 배열로 구현 )
→ 더블 스택은 배열의 마지막 요소를 제거하는 연산 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 → 메모리를 많이쓰면 연산을 덜해도되는데, 연산을 많이 하면 메모리를 덜 쓸 수 있다.