2013-07-15 3 views
6

특정 Android SDK 버전에 대한 junit 테스트를 무시할 수있는 특수 효과 또는 다른 편리한 방법이 있습니까? Lint 주석 TargetApi (x)와 비슷한 것이 있습니까? 또는 Build.VERSION을 사용하여 테스트를 수동으로 실행할지 여부를 수동으로 확인해야합니까?SDK 수준에 따라 Android 단위 테스트를 무시합니다.

답변

9

나는 뭔가 준비가되어 있다고 생각하지 않지만 이것을위한 맞춤 주석을 만드는 것은 꽤 쉽습니다.

당신의 시험 테스트 러너 Ovverride 사용자 정의 주석

@Target(ElementType.METHOD) 
@Retention(RetentionPolicy.RUNTIME) 
public @interface TargetApi { 
    int value(); 
} 

(즉, 테스트 값을 확인하고 결국 무시/발광합니다)

public class ConditionalTestRunner extends BlockJUnit4ClassRunner { 
    public ConditionalTestRunner(Class klass) throws InitializationError { 
     super(klass); 
    } 

    @Override 
    public void runChild(FrameworkMethod method, RunNotifier notifier) { 
     TargetApi condition = method.getAnnotation(TargetApi.class); 
     if(condition.value() > 10) { 
      notifier.fireTestIgnored(describeChild(method)); 
     } else { 
      super.runChild(method, notifier); 
     } 
    } 
} 

생성 및 표시

@RunWith(ConditionalTestRunner.class) 
public class TestClass { 

    @Test 
    @TargetApi(6) 
    public void testMethodThatRunsConditionally() { 
     System.out.print("Test me!"); 
    } 
} 

그냥 테스트, 그것은 나를 위해 작동합니다. :)

크레딧에 : Conditionally ignoring JUnit tests

+0

멋진 솔루션처럼 보이지만 JUnit 4를 Android와 함께 사용하려면 어떻게해야합니까? –

+0

Junit 버전이 없으면 문제가 없다고 생각합니다. 궁극적으로 테스트 러너를 변경했을 것입니다. 어떤 버전을 사용하고 있습니까? – Enrichman

+0

JUnit 3.8이라고 생각합니다. Android 테스트 도구는 JUnit 4를 지원하지 않습니다. http://developer.android.com/tools/testing/testing_android.html –

2

나는이 질문에 대한 답을 찾고 있었고, 버전을 확인하는 것보다 더 좋은 방법을 발견하지 않았습니다. 나는 다음과 같은 안드로이드 TestCase 메쏘드에 체크를 넣어 조건부로 테스트 논리의 실행을 억제 할 수 있었다. 그러나 이것이 실제로 개별 테스트가 실행되는 것을 방해하지는 않습니다. 이와 같이 runTest() 메소드를 재정의하면 작동하지 않을 API 수준에서 테스트가 "통과"됩니다. 테스트 논리에 따라 tearDown()도 무시할 수 있습니다. 어쩌면 누군가가 더 나은 해결책을 제시 할 것입니다.

@Override 
protected void setUp() throws Exception { 
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.GINGERBREAD) { 
     if (Log.isLoggable(TAG, Log.INFO)) { 
      Log.i(TAG, "This feature is only supported on Android 2.3 and above"); 
     } 
    } else { 
     super.setUp(); 
    } 
} 

@Override 
protected void runTest() throws Throwable { 
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.GINGERBREAD) { 
     assertTrue(true); 
    } else { 
     super.runTest(); 
    } 
} 
관련 문제