문제

내 프로젝트를 엑스 코드 4.6.3 에서 엑스 코드 5.0.2 로 마이그레이션하는 과정에 있습니다.프로젝트의 단위 테스트는 센테스팅킷/오큐닛으로 개발되었습니다.이제 엑스 코드 5 에서 테스트를 실행할 때 오류가 발생합니다. RunUnitTests 스크립트 말해

루니테스트는 쓸모가 없어졌어요

아마도 관련 엑스 코드 5 릴리스 노트에서이 노트입니다:

센테스팅킷과 오큐닛은 더 이상 사용되지 않습니다.사용 하 여 마이그레이터를 이동 합니다.

불행히도,나는이 신비한"이주자"에 대해 더 많이 알 수 없었습니다.아마도 내 구글 푸가[다시]부족하기 때문에 내 주요 질문은:단위 테스트를 마이그레이션하려면 어떻게 해야 합니까?

마이그레이션이 복잡한 비즈니스 인 경우 보조 질문입니다:그것은 여전히 센테스팅킷/오큐닛을 기반으로 단위 테스트를 실행하는 엑스 코드 5 를 얻을 수 있습니까?이러한 모든 단지 사용되지 않습니다 후,그래서 그들은 여전히 주위에 기능해야한다.

도움이 되었습니까?

해결책

풀숲 개구리의 대답 덕분에 우리는 엑스 코드 릴리스 노트에 언급 된 신비한"마이그레이션"이"편집>리팩터링>엑스씨테스트로 변환"을 선택하여 시작된 마법사라는 것을 알고 있습니다.이 마법사에 대한 내 경험에 대해 두 부분으로 쓸 것입니다.첫 번째 부분은 1 차 질문에 대한 불완전한 답이고,두 번째 부분은 2 차 질문에 대한 답입니다.


1 부:어떻게 마이그레이션 할 수 있습니까?

당신이 깨달아야 할 첫 번째 일은 마법사가 작동하기 위해서는 단위 테스트 대상 선택.주 대상을 선택한 경우 마법사는 변환할 대상을 나열하지 않습니다.

일단 내가 이것에 대해 알게되면,나는 마법사를 통과 할 수 있었지만,내 경우에는 최종 결과는 여전히 화려한 실패였습니다!마법사는 소스 변경이 필요하지 않으며 빌드 설정만 업데이트해야 한다고 주장했습니다.결국,마법사는 심지어 제대로 할 관리하지 않았다:그것 그랬어 그러나 그것은 했다 아니 에 대한 참조를 넣어.

어쨌든 다음은 마법사가 나를 위해 만들지 못했기 때문에 수동으로 변경해야했던 변경 사항 목록입니다.마법사가 당신을 위해 더 잘 작동하는 경우,당신은이 모든 일을 할 필요가 없습니다 수 있습니다.

  1. 단위 테스트 대상에서"스크립트 실행"빌드 단계 제거
  2. 모든 테스트 케이스 클래스의 기본 클래스를 SenTestCaseXCTestCase
  3. 가져온 헤더 변경 <SenTestingKit/SenTestingKit.h><XCTest/XCTest.h>
  4. 테스트 대상의 빌드 설정에서 래퍼 확장을 octestxctest.
  5. 모든 어설션 매크로 이름 바꾸기 ST*XCT* (예: STAssertTrue 된다 XCTAssertTrue)
  6. 위의 예외: STAssertEquals 로 이름을 바꾸어야 합니다 XCTAssertEqual (마지막에 빠진"들"을 참고하십시오.)이 컴파일러 경고를 받으면 이것에 대해 잊어 버렸다는 것을 알게 될 것입니다: warning: implicit declaration of function 'XCTAssertEquals' is invalid in C99
  7. 매크로를 허용하지 않습니다 nil 실패 설명으로 전달될 것입니다.예를 들어, XCTAssertNotNil(anObject, nil) 불가능하며 다음으로 변경해야 합니다. XCTAssertNotNil(anObject).이 컴파일러 오류가 발생하면 이 문제가 있음을 알 수 있습니다: error: called object type 'NSString *' is not a function or function pointer.
  8. 만약 당신이 오류 설명을 전달해야 합니다. NSString 클래스 메소드 stringWithFormat: 그렇습니다.이 컴파일러 오류가 발생하면 이 문제가 있음을 알 수 있습니다: error: expected ')'.몇 가지 예:
NSString* formatSpecifier = @"%@";
NSString* failureDescription = @"foo";
// These are OK
XCTAssertNotNil(anObject, @"foo")
XCTAssertNotNil(anObject, @"%@", failureDescription)
// These are not OK
XCTAssertNotNil(anObject, failureDescription);
XCTAssertNotNil(anObject, formatSpecifier, failureDescription);

마지막으로,앞서 언급한 바와 같이,단위 테스트 대상에 대한 참조가 추가되어야 합니다.다음과 같은 링커 오류가 발생하면 이것을 잊어 버렸다는 것을 알 수 있습니다 Undefined symbols for architecture i386: "_OBJC_CLASS_$_XCTestCase", referenced from: foo.

엑스 코드 6 업데이트:(사실 엑스씨테스트는 더 이상 사용 가능한 프레임워크로 나열되지 않습니다.)대신 빌드 설정을 예로 설정하십시오.이 원인이됩니다 clang 이 링크를 볼 때 자동으로 링크 할 수 있습니다. #import <XCTest/XCTest.h> 진술.자세한 내용은 클랭 문서의"모듈"섹션.


2 부:엑스 코드 5 에서 오큐닛 테스트를 실행하는 방법

이 시점에서 나는 내 임무가 실패했다는 것을 깨닫게 만든 링커 오류가 발생했습니다.이유:그러나 나는 여전히 내 프로젝트를 빌드하고 있습니다.이 그래서 대답 이 문제를 해결하려면 어떻게 해야 합니까?

나는 마이그레이션을 계속 할 수 없습니다이기 때문에,순간에 대한 내 솔루션은 내 응용 프로그램을 업그레이드 할 수있는 시간을 찾을 때까지,센테스팅 키트/오큐닛을 기반으로 내 단위 테스트를 유지하는 것입니다 7.이것은 단위 테스트를 실행하기 위해해야 할 일입니다:

  1. 단위 테스트 대상에서"스크립트 실행"빌드 단계를 제거하십시오.이 엑스 코드는"테스트"작업을 통해 단위 테스트를 실행할 수 있도록하는 데 필요한 모든 것입니다( + U) 단위 테스트 대상이 선택된 동안.
  2. 하지만 단위 테스트를 실행하기 위해 대상을 전환하고 싶지 않기 때문에 이상적이지 않습니다.대신 단위 테스트를 실행하고 싶습니다 주요 대상이 선택되는 동안.따라서 두 번째 단계는"테스트"작업을 실행할 때 단위 테스트 대상의 테스트가 대신 실행되도록 주 대상의 엑스 코드 구성표를 수정하는 것입니다.

최종 솔루션은 엑스 코드 4 만큼 좋지 않다.기본 대상의"실행"또는"빌드"작업을 실행할 때마다 단위 테스트가 자동으로 실행됩니다.불행히도"스크립트 실행"빌드 단계 없이는 작동 할 수없는 것 같습니다.

다른 팁

편집 -> 리팩터 -> XCTEST로 변환

OcUnit 테스트는 여전히 작동하지만 마이그레이션 할 수도 있습니다.변경 사항이 최소화됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top