

코드를 기능단위로 잘 분리를 해야만 테스트를 잘할 수 있음.
→ 작은 실패를 반복해서 원하는 골로 향한다.
리팩터란? 흐름 안에 있는 코드의 모양새를 바꾸는 것

더하기 연산 함수를 실행했을 때 1+1을 더해서 2가 나오는지?
테스트 하면서 확인하는게 테스트 코드!
하나의 메서드 안에 모든 기능 다 때려넣음
그러면 어떤 코드가 문제가 되는지 파악하기 힘듦!

스텍을 가지고 테스트 코드 작성한다.
Pop 메서드를 테스트하고 싶음
스텍은 애초에 비어있기 때문에
push를 한 다음에 pop을 하는 테스트 했음
만약에 push를 못하면 pop도 못함
push라는 메소드에 의존하고 있는 pop 테스트하는 거임
순수하게 pop만 테스트할 수 있는 코드를 작성해야 함

import Foundation
class Queue {
    var arr: Array<String> = []
    func enqueue(_ item: String) -> Array<String> {
        arr.append(item)
        return arr
    }
    func enqueMultipleItems(_ items: Array<String>) -> Array<String> {
        for item in items {
            arr.append(item)
        }
        return arr
    }
    func dequeue() -> Array<String> {
        arr.removeFirst()
        return arr
    }
    func dequeueMultipleItems(num: Int) -> Array<String> {
        for _ in 1...num {
            arr.removeFirst()
        }
        return arr
    }
    func removeAllItem() -> Array<String> {
        arr = [] //  모든 아이템을 지워주려면 그냥 빈 배열로 만들어버리면 된다.
        return arr
    }
}
import XCTest
@testable import queue
class testQueue: XCTestCase {
    var queue: Queue? // queue 프로퍼티는 Queue클래스를 상속받음?
    override func setUpWithError() throws {
        queue = Queue()
        try super.setUpWithError()
    }
    
    override func tearDownWithError() throws {
        try super.tearDownWithError()
    }
    
    func test_enqueue() {
        XCTAssertEqual(queue.enqueue("yun"), ["yun"])
				// Queue 클래스의 enqueue 메소드를 실행해서 yun을 입력했을떄 결과 값이 yun이 제대로 나오는지 테스트
    }
}
출처:
"TDD 실천법과 도구" 책 전체를 PDF 공개합니다. https://repo.yona.io/doortts/blog/issue/1
TDD (Test Driven Development) 란? https://velog.io/@sbyeol3/TDD-Test-Driven-Development-란
import UIKit
public struct Stack<T> {
    private var elements = [T]()
    public init() {}
    public mutating func push(_ element: T) {
        self.elements.append(element)
    }
    public mutating func pop() -> T? {
        return self.elements.popLast()
    }
    public func peek() -> T? {
        return self.elements.last
    }
    
    public func isEmpty() -> Bool {
        return self.elements.isEmpty
    }
    
    public var count: Int {
        return self.elements.count
    }
}
var myStack = Stack<Int>()
myStack.isEmpty()
myStack.push(1)
print(myStack)
myStack.isEmpty()
myStack.push(2)
print(myStack)
myStack.count
myStack.peek()
myStack.pop()
print(myStack)