Xctest waitforexpectationswithtimeout
XCTest의 사용자 정의 도우미.
테스트 스위트가 커짐에 따라 코드를 오래 보관하는 것이 중요합니다. 또는 직접 반복하지 마십시오. 프로덕션 코드에서 동일한 방법을 세 번 구현하지 않으므로 테스트에서 왜 사용합니까?
테스트 스위트에서 품질을 유지하는 쉬운 방법은 테스트간에 어설 션을 공유하는 것입니다. 이는 공통 어설 션을 실행하는 도우미 메서드를 추출하여 수행 할 수 있습니다.
예를 들어, UI 테스트에서 요소가 나타날 때까지 기다리는 것은 매우 장황합니다. 내가 그것을 피할 수 있으면 이것을 한 번 이상 쓰고 싶지 않습니다.
요소가 나타날 때까지 기다리는 방법을 알아 봅니다.
큰! 이제 waitForElementToAppear (app. cells [& quot; Joe & quot;])를 호출 할 수 있으며 우리의 도우미가 나머지를 처리합니다. 테스트가 실패하면 어떻게됩니까?
오, 잠깐, 좋지 않다. 실패 메시지를 가능한 한 쓴 코드 줄에 가깝게 배치하고 싶습니다.
마치 프레임 워크를 작성하는 것처럼 생각하십시오. 오류 메시지를보기 위해 사용자가 내부 프레임 워크 코드를 파고 들도록 강요하고 싶습니까? 아니, 물론 아니야. 해당 메시지를 실제 테스트에 더 가깝게 옮기십시오.
이 게시물은 Swift 2.2 용으로 업데이트되었습니다. Swift 2.1 지원의 경우, #file을 __FILE__으로, #line을 __LINE__로 대체하십시오.
여기서는 recordFailureWithDescription ()을 사용하여 수동 오류 재정의를 이용합니다. 이것은 실패 메시지, 파일 참조, 행 번호 및 부울을 취합니다.
message : 테스트가 실패했을 때 사용자가 볼 수있는 복사본 file : 실패가 원래 기록 된 파일에 대한 참조 line : 실패가 원래 기록 된 라인 번호에 대한 참조 expected : 테스트 실패의 경우 true, catch되지 않은 경우 false 예외.
핸들러는 항상 호출되며 어설 션이 실패했는지 여부에 의존하지 않습니다. 검사에 실패하면 오류 매개 변수가 채워 지므로 검사를 통과하지 못하게해야합니다.
파일과 라인 매개 변수는 마법이 일어나는 곳입니다. 선택적으로 지정하면 호출자는 아무것도 전달할 의무가 없습니다. 기본값을 #file 및 #line 매크로로 지정하면 소스에서 해당 속성을 캡처 할 수 있습니다. 우리의 방법은 어디에서 호출되고 있습니까? 스위프트 블로그는 애플이 스위프트에서 어떻게 단언했는지를 보여주는 훌륭한 글을 가지고있다.
아, 훨씬 나아. 이제 우리는 심장의 내용에 도우미 메서드를 추가 할 수 있습니다! 우리는 이러한 매개 변수를 계속 체인에 전달하고 XCTest를 기반으로 고도로 추상화 된 테스트 프레임 워크를 만들 수 있습니다.
Xctest 대기 시간과 시간 초과
App Store를 통해 가져 오기 우리의 응용 프로그램 에서이 게시물을 읽으십시오!
XCTestCase waitForExpectationsWithTimeout : handler : 기대가 충족되지 않을 때 EXC_BAD_ACCESS를 throw합니다.
XCTestExpectation을 사용하여 비동기 호출을 테스트하고 있습니다.
completionHandler가 주어진 1 초의 타임 아웃 전에 실행될 때 다음 코드는 작동한다 (테스트는 성공한다).
그러나 completionHandler가 호출되지 않아 기대가 충족되지 않으면 waitForExpectationsWithTimeout을 호출 할 때 테스트 실패가 발생하는 대신 EXC_BAD_ACCESS가 표시됩니다. 이는 전체 테스트 스위트 결과를 볼 수 없기 때문에 매우 편리하지 않습니다.
어떻게 이것을 피하고 정상적인 테스트 실패를 얻을 수 있습니까?
EXC_BAD_ACCESS의 원인은 기대를 생성 할 때 nil 설명을 전달하는 것입니다.
이 호출에 문자열을 전달하면 예상이 충족되지 않을 때 예상되는 테스트 실패가 발생합니다.
Xctest 대기 시간과 시간 초과
App Store를 통해 가져 오기 우리의 응용 프로그램 에서이 게시물을 읽으십시오!
XCTestExpectation : 대기 컨텍스트가 끝난 후 fulfill 메서드를 호출하지 않는 방법?
Xcode 6의 새로운 비동기 테스트 기능을 사용하고 있습니다. 시간 초과되기 전에 비동기 작업이 끝나면 모든 것이 잘 작동합니다. 그러나 작업이 시간 초과보다 오래 걸리면 상황이 더욱 복잡해집니다.
다음은 내가 테스트를 수행하는 방법입니다.
불행하게도, timeout이 만료 된 후 fulfill 메소드를 호출하면 테스트 스위트가 다음 오류로 인해 충돌합니다.
API 위반 - 대기 컨텍스트가 종료 된 후 - [XCTestExpectation fulfill].
물론 다음과 같은 fulfill 메서드를 호출하기 전에 테스트가 끝났는지 확인할 수 있습니다.
그러나 이것은 지나치게 복잡해 보이고 시험을 읽기가 더 어렵게 만듭니다. 내가 놓친 게 있니? 이 문제를 해결할 더 간단한 방법이 있습니까?
예, 이 API 위반 문제를 피하는 훨씬 간단한 방법이 있습니다. 예상 변수를 __weak로 선언하십시오. 명확하게 문서화되지는 않았지만 제한 시간이 만료되면 기대치가 해제됩니다. 따라서 태스크가 시간 초과보다 오래 걸리는 경우 태스크 완료 핸들러가 호출 될 때 expect 변수는 nil이됩니다. 따라서 성취 방법은 아무 일도없이 무조건 호출 될 것입니다.
나는 같은 문제를 겪었지만 나의 경우에는 위의 대답의 신속한 버전이 필요했다.
OSX 용 OpenStack Swift Drive에서 일하고 있습니다. Finder를 사용하여 폴더를 로컬에서 삭제하면 삭제가 결국 서버로 전달되므로 서버를 업데이트 할 때까지 기다리는 테스트가 필요했습니다.
API 위반 충돌을 피하기 위해 필자는 기대치를 '약한 변수'로 변경하고 'zeroFoldersExpectation?.fillfill ()'을 호출하도록 변경했습니다. 기대가 현재 선택 사항이며 충족 호출이 무시되는 경우에는 nil이 될 수 있기 때문입니다. 이렇게하면 충돌이 해결되었습니다.
(이 답변에서 제안 된 것처럼) 약한 변수로 기대를 작성하는 대신 블록 변수로 설정하고 waitForExpectationsWithTimeout의 완료 핸들러에 nil을 설정할 수도 있다고 생각합니다.
이 방법을 사용하면 ARC가 기대를 너무 빨리 낮추지 않을 것이라고 확신 할 수 있습니다.
XCTest에서 대기 중입니다.
대기는 어렵고 Xcode에서 대기하는 것도 예외는 아닙니다. Xcode와 XCTest가 제공하는 수많은 옵션 중에서 선택하는 것조차 어려울 수 있습니다. Xcode 8.3에서 소개 된 새로운 클래스를 사용하여 기대를 기다리는 쉽고 간단한 방법을 배우십시오.
Xcode 8.3 이전 버전
Xcode 7은 비동기 코드, 즉 waitForExpectations (timeout : handler :)를 테스트하는 데 유용한 새로운 방법을 도입했습니다. 이 방법은 기대를 기다리는 데 사용할 수 있습니다.
XCTestExpectation은 XCTest 클래스로 표현식이 충족되거나 제한 시간에 도달 할 때까지 지속적으로 평가합니다. 이것들은 KVO를 통해 애니메이션이 끝나거나, 나타나는 요소 또는 키 값이 변경 될 때까지 기다리는 데 사용할 수 있습니다.
내 UI 테스팅 치트 시트 게시물의 간단한 예는 다음과 같습니다.
이 코드는 UI 테스트에서 특정 요소가 화면에 표시되기를 기다리는 데 사용됩니다. XCUIElement를 전달하면 도우미는 5 초 동안 요소를 찾으려고 시도합니다.
waitForExpectations 도우미는 훌륭하지만 한 가지주의 사항이 있습니다. 예외를 발생시키고 제한 시간에 도달하면 테스트에 실패합니다. 이것은 우리의 기대가 충족 될 것이라는 것을 절대적으로 알고있는 경우에 그 기능을 제한합니다.
기대 완료 핸들러.
코드 샘플의 handler : 매개 변수에 nil이 전달되었습니다.
handler : 모든 기대가 충족되거나 대기 시간 제한이 트리거 될 때 호출 할 선택적 XCWaitCompletionHandler 블록입니다. (Timeout은 항상 테스트 실패로 처리됩니다.)
그리고 그 핸들러는 선택적인 에러를 한 블럭에 감쌀 수있는 단순한 별명입니다.
waitForExpectations (timeout : handler :)에 대한 호출이 기대치를 모두 충족하거나 시간 초과 될 때 호출 될 블록.
유형 XCWaitCompletionHandler = (오류?) - & gt; 빈.
언뜻보기에는이 정의가 흥미 롭습니다. 오류가 모든 종류의 유용한 정보를 포함한다는 것은 쉽게 추론 할 수 있습니다. 그러나 실제로는 그렇지 않습니다. 아주 드물게 (현지화 된) 설명이없는 일반 오류 이상은 아닙니다. рџ~ћ.
Xcode 8.3은 실패 이유를 좀 더 쉽게 이해할 수 있도록 몇 가지 새로운 클래스와 도우미를 추가했습니다.
이 글의 나머지 부분에서는 Xcode 8.3 Beta에 소개 된 새로운 기능에 대해 설명합니다.
XCTestWaiter를 입력하십시오.
대기열을 관리합니다. 현재 실행 컨텍스트를 일시 중지합니다. 배열의 경우 XCTestExpectations입니다. 웨이터는 대리인의 유무에 관계없이 완료, 제한 시간 또는 무효 기대 충족과 같은 이벤트에 응답하는 데 사용할 수 있습니다. XCTestCase는 위임 프로토콜을 따르며 제한 시간 및 기타 예상치 못한 이벤트를 테스트 실패로 자동보고합니다.
웨이터는 델리게이트 또는 테스트 사례 인스턴스와의 연관없이 사용할 수 있습니다. 이를 통해 테스트 지원 라이브러리는 해당 API를 통해 테스트 사례를 전달하지 않고도 대기 할 수있는 편리한 메소드를 제공 할 수 있습니다.
언뜻보기에 XCTestWaiter는 XCTestExpectation이 충족되기를 기다리는 새로운 방식입니다. 그러나 표면 아래에 몇 개의 보석이 숨겨져 있습니다.
먼저 & quot; 이전 & quot; 새로운 클래스를 사용하기위한 샘플.
wait (for : timeout :)는 테스트 결과를 나타내는 열거 형인 XCTestWaiterResult를 반환합니다. 가능한 값은 completed, timedOut, incorrectOrder 또는 invertedFulfillment 중 하나 일 수 있습니다. 첫 번째 만 완료되면 요소가 할당 된 시간 초과 내에 성공적으로 발견되었음을 나타냅니다.
이 접근법의 큰 장점은 테스트 스위트가 동기식 플로우로 읽는 것입니다. 콜백 블록이나 완료 핸들러가 없습니다. 도우미 메서드는 단순히 요소가 나타나는지 여부를 나타내는 부울을 반환합니다.
완수되지 않은 기대가 자동적으로 실패하지 않습니다 ...
제 생각에 이것은 프레임 워크에 대한 가장 큰 개선입니다. 기대를 충족시키지 못하면 테스트를 실패 할시기와 방법을 완전히 제어 할 수 있습니다. 이렇게하면 로그인 화면이나 위치 서비스 권한 부여 대화 상자와 같은 선택적 요소를 기다릴 수 있습니다.
또한 각 유형의 XCTestWaiterResult를 분리하여 개별 오류 메시지로 실패 할 수 있습니다. 예를 들어,.timedOut은 dueOrder가 fulfilledExpectations를 사용하여 성공한 항목과 아직 대기중인 항목을 기록 할 수있는 동안 시간 제한이 얼마나 오래되었는지 언급 할 수 있습니다.
여러 기대.
두 가지 시나리오에서 사용할 수있는 웨이터에 하나 이상의 XCTestExpectation을 전달할 수 있습니다.
어떤 기대치라도 충족시켜야합니다. - 한 사람이 만나는 순간, 기다리는 사람은 기다리지 않습니다. 모든 기대치가 충족되어야합니다. 웨이터는 모든 것이 성취 될 때까지 기다립니다.
모든 기대치가 중요 함을 나타 내기 위해 단순히 wait (for : timeout : enforceOrder :)를 호출하십시오. 마지막 매개 변수는 이행 순서가 중요한지 프레임 워크에 나타냅니다.
새로운 XCTestExpectation 서브 클래스.
새로운 웨이터 클래스와 함께 XCTestExpectations는 특정 기대치를 좀 더 쉽게 작성하도록 서브 클래 싱되었습니다. 가능할 때마다 이들을 사용하는 것이 좋습니다. 가독성은 유지 보수 가능한 테스트 스위트를 작성하는 데 많은 도움이됩니다.
XCTPredicateExpectation.
XCTKVO 예기.
XCTNSNotificationExpectation.
이 제품을 작동시키는 것처럼 보이지는 않습니다. 이 서브 클래스에서 성공한 사람이 있으면 의견에 알려주십시오.
도와 줘서 고마워, Brian!
Xcode 8.4 및 그 이후.
애플이 테스트 프레임 워크에 재투자하는 것을보기가 쉽다. Xcode 7에서 개편 된 이후로 XCTest에 많은 도움이되지 않았습니다. 다음 릴리스에서 제공되는 새로운 기능을 시험해보기를 고대합니다!
App Store를 통해 가져 오기 우리의 응용 프로그램 에서이 게시물을 읽으십시오!
XCTestExpectation : 대기 컨텍스트가 끝난 후 fulfill 메서드를 호출하지 않는 방법?
Xcode 6의 새로운 비동기 테스트 기능을 사용하고 있습니다. 시간 초과되기 전에 비동기 작업이 끝나면 모든 것이 잘 작동합니다. 그러나 작업이 시간 초과보다 오래 걸리면 상황이 더욱 복잡해집니다.
다음은 내가 테스트를 수행하는 방법입니다.
불행하게도, timeout이 만료 된 후 fulfill 메소드를 호출하면 테스트 스위트가 다음 오류로 인해 충돌합니다.
API 위반 - 대기 컨텍스트가 종료 된 후 - [XCTestExpectation fulfill].
물론 다음과 같은 fulfill 메서드를 호출하기 전에 테스트가 끝났는지 확인할 수 있습니다.
그러나 이것은 지나치게 복잡해 보이고 시험을 읽기가 더 어렵게 만듭니다. 내가 놓친 게 있니? 이 문제를 해결할 더 간단한 방법이 있습니까?
예, 이 API 위반 문제를 피하는 훨씬 간단한 방법이 있습니다. 예상 변수를 __weak로 선언하십시오. 명확하게 문서화되지는 않았지만 제한 시간이 만료되면 기대치가 해제됩니다. 따라서 태스크가 시간 초과보다 오래 걸리는 경우 태스크 완료 핸들러가 호출 될 때 expect 변수는 nil이됩니다. 따라서 성취 방법은 아무 일도없이 무조건 호출 될 것입니다.
나는 같은 문제를 겪었지만 나의 경우에는 위의 대답의 신속한 버전이 필요했다.
OSX 용 OpenStack Swift Drive에서 일하고 있습니다. Finder를 사용하여 폴더를 로컬에서 삭제하면 삭제가 결국 서버로 전달되므로 서버를 업데이트 할 때까지 기다리는 테스트가 필요했습니다.
API 위반 충돌을 피하기 위해 필자는 기대치를 '약한 변수'로 변경하고 'zeroFoldersExpectation?.fillfill ()'을 호출하도록 변경했습니다. 기대가 현재 선택 사항이며 충족 호출이 무시되는 경우에는 nil이 될 수 있기 때문입니다. 이렇게하면 충돌이 해결되었습니다.
(이 답변에서 제안 된 것처럼) 약한 변수로 기대를 작성하는 대신 블록 변수로 설정하고 waitForExpectationsWithTimeout의 완료 핸들러에 nil을 설정할 수도 있다고 생각합니다.
이 방법을 사용하면 ARC가 기대를 너무 빨리 낮추지 않을 것이라고 확신 할 수 있습니다.
XCTest에서 대기 중입니다.
대기는 어렵고 Xcode에서 대기하는 것도 예외는 아닙니다. Xcode와 XCTest가 제공하는 수많은 옵션 중에서 선택하는 것조차 어려울 수 있습니다. Xcode 8.3에서 소개 된 새로운 클래스를 사용하여 기대를 기다리는 쉽고 간단한 방법을 배우십시오.
Xcode 8.3 이전 버전
Xcode 7은 비동기 코드, 즉 waitForExpectations (timeout : handler :)를 테스트하는 데 유용한 새로운 방법을 도입했습니다. 이 방법은 기대를 기다리는 데 사용할 수 있습니다.
XCTestExpectation은 XCTest 클래스로 표현식이 충족되거나 제한 시간에 도달 할 때까지 지속적으로 평가합니다. 이것들은 KVO를 통해 애니메이션이 끝나거나, 나타나는 요소 또는 키 값이 변경 될 때까지 기다리는 데 사용할 수 있습니다.
내 UI 테스팅 치트 시트 게시물의 간단한 예는 다음과 같습니다.
이 코드는 UI 테스트에서 특정 요소가 화면에 표시되기를 기다리는 데 사용됩니다. XCUIElement를 전달하면 도우미는 5 초 동안 요소를 찾으려고 시도합니다.
waitForExpectations 도우미는 훌륭하지만 한 가지주의 사항이 있습니다. 예외를 발생시키고 제한 시간에 도달하면 테스트에 실패합니다. 이것은 우리의 기대가 충족 될 것이라는 것을 절대적으로 알고있는 경우에 그 기능을 제한합니다.
기대 완료 핸들러.
코드 샘플의 handler : 매개 변수에 nil이 전달되었습니다.
handler : 모든 기대가 충족되거나 대기 시간 제한이 트리거 될 때 호출 할 선택적 XCWaitCompletionHandler 블록입니다. (Timeout은 항상 테스트 실패로 처리됩니다.)
그리고 그 핸들러는 선택적인 에러를 한 블럭에 감쌀 수있는 단순한 별명입니다.
waitForExpectations (timeout : handler :)에 대한 호출이 기대치를 모두 충족하거나 시간 초과 될 때 호출 될 블록.
유형 XCWaitCompletionHandler = (오류?) - & gt; 빈.
언뜻보기에는이 정의가 흥미 롭습니다. 오류가 모든 종류의 유용한 정보를 포함한다는 것은 쉽게 추론 할 수 있습니다. 그러나 실제로는 그렇지 않습니다. 아주 드물게 (현지화 된) 설명이없는 일반 오류 이상은 아닙니다. рџ~ћ.
Xcode 8.3은 실패 이유를 좀 더 쉽게 이해할 수 있도록 몇 가지 새로운 클래스와 도우미를 추가했습니다.
이 글의 나머지 부분에서는 Xcode 8.3 Beta에 소개 된 새로운 기능에 대해 설명합니다.
XCTestWaiter를 입력하십시오.
대기열을 관리합니다. 현재 실행 컨텍스트를 일시 중지합니다. 배열의 경우 XCTestExpectations입니다. 웨이터는 대리인의 유무에 관계없이 완료, 제한 시간 또는 무효 기대 충족과 같은 이벤트에 응답하는 데 사용할 수 있습니다. XCTestCase는 위임 프로토콜을 따르며 제한 시간 및 기타 예상치 못한 이벤트를 테스트 실패로 자동보고합니다.
웨이터는 델리게이트 또는 테스트 사례 인스턴스와의 연관없이 사용할 수 있습니다. 이를 통해 테스트 지원 라이브러리는 해당 API를 통해 테스트 사례를 전달하지 않고도 대기 할 수있는 편리한 메소드를 제공 할 수 있습니다.
언뜻보기에 XCTestWaiter는 XCTestExpectation이 충족되기를 기다리는 새로운 방식입니다. 그러나 표면 아래에 몇 개의 보석이 숨겨져 있습니다.
먼저 & quot; 이전 & quot; 새로운 클래스를 사용하기위한 샘플.
wait (for : timeout :)는 테스트 결과를 나타내는 열거 형인 XCTestWaiterResult를 반환합니다. 가능한 값은 completed, timedOut, incorrectOrder 또는 invertedFulfillment 중 하나 일 수 있습니다. 첫 번째 만 완료되면 요소가 할당 된 시간 초과 내에 성공적으로 발견되었음을 나타냅니다.
이 접근법의 큰 장점은 테스트 스위트가 동기식 플로우로 읽는 것입니다. 콜백 블록이나 완료 핸들러가 없습니다. 도우미 메서드는 단순히 요소가 나타나는지 여부를 나타내는 부울을 반환합니다.
완수되지 않은 기대가 자동적으로 실패하지 않습니다 ...
제 생각에 이것은 프레임 워크에 대한 가장 큰 개선입니다. 기대를 충족시키지 못하면 테스트를 실패 할시기와 방법을 완전히 제어 할 수 있습니다. 이렇게하면 로그인 화면이나 위치 서비스 권한 부여 대화 상자와 같은 선택적 요소를 기다릴 수 있습니다.
또한 각 유형의 XCTestWaiterResult를 분리하여 개별 오류 메시지로 실패 할 수 있습니다. 예를 들어,.timedOut은 dueOrder가 fulfilledExpectations를 사용하여 성공한 항목과 아직 대기중인 항목을 기록 할 수있는 동안 시간 제한이 얼마나 오래되었는지 언급 할 수 있습니다.
여러 기대.
두 가지 시나리오에서 사용할 수있는 웨이터에 하나 이상의 XCTestExpectation을 전달할 수 있습니다.
어떤 기대치라도 충족시켜야합니다. - 한 사람이 만나는 순간, 기다리는 사람은 기다리지 않습니다. 모든 기대치가 충족되어야합니다. 웨이터는 모든 것이 성취 될 때까지 기다립니다.
모든 기대치가 중요 함을 나타 내기 위해 단순히 wait (for : timeout : enforceOrder :)를 호출하십시오. 마지막 매개 변수는 이행 순서가 중요한지 프레임 워크에 나타냅니다.
새로운 XCTestExpectation 서브 클래스.
새로운 웨이터 클래스와 함께 XCTestExpectations는 특정 기대치를 좀 더 쉽게 작성하도록 서브 클래 싱되었습니다. 가능할 때마다 이들을 사용하는 것이 좋습니다. 가독성은 유지 보수 가능한 테스트 스위트를 작성하는 데 많은 도움이됩니다.
XCTPredicateExpectation.
XCTKVO 예기.
XCTNSNotificationExpectation.
이 제품을 작동시키는 것처럼 보이지는 않습니다. 이 서브 클래스에서 성공한 사람이 있으면 의견에 알려주십시오.
도와 줘서 고마워, Brian!
Xcode 8.4 및 그 이후.
애플이 테스트 프레임 워크에 재투자하는 것을보기가 쉽다. Xcode 7에서 개편 된 이후로 XCTest에 많은 도움이되지 않았습니다. 다음 릴리스에서 제공되는 새로운 기능을 시험해보기를 고대합니다!
Comments
Post a Comment