앱의 주요 부분은 사용자가 움직이면서 단계를 기록할 때 변화에 대응하는 데 의존한다. 이러한 동작은 프로그램의 제어 범위를 벗어난 이벤트를 생성합니다. XCTestExpectation 직접 흐름 외부에서 발생하는 상황을 테스트하기 위한 도구입니다.
?? 그래서 무엇을 한다고??! 잘 모르겠슴다
•
일반 테스트 기대
•
알림 테스트 기대
기대는 나중에 성취할 수 있는 대상이다. XCTestCase의 wait 메소드는 기대치가 충족되거나 지정된 시간이 경과할 때까지 기다리도록 테스트 실행을 지시한다.
비동기 이벤트에 대응하려면 코드에서 변경을 수신할 수 있는 방법이 필요합니다. 이 작업은 일반적으로 폐쇄, 위임 방법 또는 통지를 준수하여 수행됩니다.
폐쇄, 위임, 통지 ⇒ 클로저, 델리게이트, 노티피케이션
참고: 디버거에서 실행을 중지해도 작업이 일시 중지되지 않습니다. wait 타임 아웃. 방금 코드를 여러 개 추가했는데, 실수가 있으면 돌아가서 문제를 디버그할 수도 있습니다. 이것은 쓰기 시험일 때, 특히 그들이 예상대로 행동하지 않을 때 흔히 나타난다. 중단점에서 디버거가 일시 중지되고 논리 오류를 탐색할 때 시간 초과로 인해 테스트가 실패할 수 있습니다. 중단점을 비활성화하거나 제거한 후 문제가 해결되면 다시 실행하기만 하면 됩니다.
import XCTest
class ButtonObserver: NSObject {
var expectation: XCTestExpectation?
weak var button: UIButton?
func observe(_ button: UIButton,
expectation: XCTestExpectation) {
self.expectation = expectation
self.button = button
button.addObserver(self, forKeyPath: "titleLabel.text",
options: [.new], context: nil)
}
override func observeValue(
forKeyPath keyPath: String?,
of object: Any?,
change: [NSKeyValueChangeKey : Any]?,
context: UnsafeMutableRawPointer?) {
expectation?.fulfill()
}
deinit {
button?.removeObserver(self, forKeyPath: "titleLabel.text")
}
}
Swift
복사
wait 시험적으로 명시적으로 주장하는 통화를 사용하는 것이 좋습니다. wait 기대치가 충족되었는지 테스트할 뿐 앱의 논리에 대한 어떠한 주장도 하지 않습니다.
좋은 테스트는 계획에 따라 상황이 발생했을 때 테스트할 뿐만 아니라 특정한 부작용이 발생하지 않는지 확인한다. 앱이 하지 말아야 할 것 중 하나는 경고가 있는 사용자에게 스팸을 보내는 것입니다. 따라서 특정 알림이 두 번 게시되는 경우 하나의 알림만 생성해야 합니다.
wait(for: expectations, timeout: 1, enforceOrder: true)
이미지 필터링이나 OAuth 또는 SAML과 같은 여러 API 호출이 필요한 네트워크 로그인과 같은 다중 단계 프로세스에 대한 테스트를 작성할 때 이 옵션을 사용할 수 있습니다. 이러한 테스트는 프로덕션 코드의 모든 단계가 필요한 순서대로 수행되도록 보장할 뿐만 아니라 테스트 코드가 예상과 다른 흐름을 거치지 않는지 확인합니다.