21. 11. 09 Unit test, Double stack
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 → 메모리를 많이쓰면 연산을 덜해도되는데, 연산을 많이 하면 메모리를 덜 쓸 수 있다.
Author And Source
이 문제에 관하여(21. 11. 09 Unit test, Double stack), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@allie/21.-11.-09-Unit-test-Double-stack저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)