2013-10-15 8 views
6

내 단위 테스트 도구에는 최신 iOS 버전에만 적용 할 수있는 몇 가지 테스트 케이스가 포함되어 있습니다. 예상대로, 이전 iOS 버전에서 제품군을 실행할 때 이러한 테스트가 실패합니다.iOS 버전을 기반으로하는 조건부 단위 테스트

이러한 테스트 사례가 특정 iOS 버전에서만 실행되어야 함을 나타내는 표준 방법이 있습니까?

또는
- (void) testSomethingThatOnlyWorksOniOS7 
{ 
    const BOOL iOS7OrHigher = floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1; 
    if (!iOS7OrHigher) return; 

    // Actual test goes here 
} 

, 나는 동적으로 특정 테스트를 건너 SenTestCase 말할 수 :

하나의 옵션은 내가 생각?

답변

4

귀하의 접근 방식은 나에게 좋은 것 같다.

일반적으로 iOS 버전을 기반으로 한 단위 테스트를 선택적으로 실행하는 "표준 방법"과 같은 것이 있다고 생각하지 않습니다.

한편으로는 iOS 버전에 따라 선택적으로 하나의 기능을 구현하거나 다른 방식으로 구현할 수있는 방식이 동일합니다. 아마도 CocoaWithLove에 대한이 토론에 대해 이미 알고있을 것입니다 : Tips and Tricks from conditional.... 그것은 꽤 오래되었지만, 여기에 기술 된 접근법은 여전히 ​​견디고 있습니다.

단위 테스트를 실행하는 방법은 지정하지 않지만 IMO를 처리하는 가장 효과적인 방법은 구현 외부에서 실행할 테스트를 지정할 수 있도록하는 것입니다. iOS7 전용이며 테스트 구현을 오염시키지 않습니다.

이것은, 예를 들어 각 테스트와 관련된 버전 번호를 통해 행해질 수있다; 단위 테스트 구현을 호출하기 전에 함수 호출에서 버전 번호를 확인하십시오 (예 : testSomethingThatOnlyWorksOniOS7).

편집 :

는 사실 상황이 내가 처음에 생각했던 것을 쉽게 될 수 있습니다. 이제 조금 해킹 할 것입니다 ...

실제 테스트 메소드 호출이 완료된 곳에서 OCUnit의 위치를 ​​수정할 수 있습니다 (이 점에 대해서는 전혀 모르겠지만, 알아 내기가 어렵지 않을 것 같습니다.). ..)를 사용하여 선택기 이름을 확인합니다. 선택기 이름을 문자열 (NSStringFromSelector)로 변환하고 일부 정규 표현식과 일치하는 경우 특정 분기를 취합니다 (이 경우 해당 테스트를 무시하면됩니다).

OCUnit을 수정하여 걱정할 필요가있는 경우, 위의 설명은 메서드 선택을 통해 수행 할 수 있습니다. 선택기 이름이 표현식과 일치하지 않는 경우에만 원래 구현을 호출하고, 그렇지 않으면 아무것도 수행하지 않습니다.

+0

"라고 말하면 iOS7 용으로 만 제공되며 테스트 구현을 오염시키지 않습니다." 네, 저에게 이것을 가능하게 해주는 모호한 OCUnit 기능을 찾기를 희망했습니다. :) – hpique

+0

나는 어떤 것도 알지 못합니다 ...하지만 방금 내 대답에 몇 가지 아이디어를 추가했습니다 ... 그렇게하기가 어렵지 않습니다 ... – sergio

+0

아마도 'defaultTestSuite'가 무시 될 수 있습니다. 체크 아웃 할만한 가치가있다. – hpique

3

가장 좋은 방법은 iOS 7에서만 사용 가능한 것으로 알고있는 방법으로 respondsToSelector:을 실행하는 것입니다. 예 :

[view respondsToSelector:@selector(snapshotViewAfterScreenUpdates:)] 

또는

[UIView instancesRespondToSelector:@selector(snapshotViewAfterScreenUpdates:)] 
+1

respondsToSelector를 사용하는 것이 가장 좋은 해결책이며, 미래의 증거가 될 수 있습니다. Apple은 언제든지 메소드를 제거 할 수 있으며이 경우 버전 번호 확인이 실패합니다. –

+0

이 경우는 아닙니다. 테스트가 iOS 7에서 실행되지 않아야한다는 점을 명시 적으로 표시하고 싶습니다. 앱 코드가 아닙니다. 이것은 테스트 코드입니다. – hpique

+0

테스트에서 해당 코드를 실행하고 테스트 메소드 시작시 리턴 할 수 있습니다. –

1

이 작업을 수행하는 표준 방법은 없으며 일반적으로 테스트는 iOS 커뮤니티에서 너무 많이 이야기하지 않습니다. 내가 접근 할 방법은 자체적으로 테스트 대상에 특정 iOS7 테스트를 적용한 다음 기본적으로 해당 제품군을 실행하도록 결정하는 것입니다.

+2

"라고 말하며 일반적으로 테스트는 iOS 커뮤니티가 너무 많이 이야기하지 않는 것입니다."그래서 이러한 질문을하는 것이 좋습니다. ;) – hpique

+0

죄송합니다. 나는 불평 할 뜻이 없었습니다. "업계 표준"이 없다는 사실을 강조하거나 적어도 내가 알고있는 것을 강조하는 것이 었습니다. – cescofry

+0

미안하다고 말할 필요가 없습니다. 나는 당신을 누가 차버 렸는지 모르지만, 나는 보상하기 위해 upvoted. :) 또한 목표 접근법은 조금 성 가시 겠지만 실행 가능한 솔루션이라고 생각합니다. – hpique

0

@sergio가 제안한대로 OCUnit을 가지고 놀아 보았지만 멀리 갈 수 없었습니다. 떨어져.지금까지 버전 별 테스트에 매크로를 사용하여 주석을 달았습니다.

#define SKIP_IF_VERSION(v) if (floor(NSFoundationVersionNumber) <= v) return; 

- (void)testSomethingThatOnlyWorksOniOS7 
{ SKIP_IF_VERSION(NSFoundationVersionNumber_iOS_6_1) 
// Test goes here 
} 

이 접근법에 대해 내가 싫어하는 것은 테스트가 어쨌든 실행되며 아무 것도하지 않는다는 것입니다. 테스트를 완전히 건너 뛰는 것이 좋을 것 같습니다.