如何从终端 运行 检测 @SmallTests?
How to run instrumentation @SmallTests from terminal?
我无法从终端 运行 我的@SmallTests。我已经创建了我的设置示例,希望您指出我做错了什么。
我正在使用自己的默认 Runner class,它看起来像这样:
public class MyAppTestRunner extends AndroidJUnitRunner {
@Override
public Application newApplication(ClassLoader cl, String className, Context context)
throws InstantiationException, IllegalAccessException, ClassNotFoundException {
return super.newApplication(cl, MyAppTestApplication.class.getName(), context);
}
}
我已经在我的 gradle:
中设置了这个 运行ner
android {
defaultConfig {
testInstrumentationRunner "com.MyApp.instrumentation.config.MyAppTestRunner"
}
testBuildType 'integrationTest'
}
我也在使用这些依赖项:
androidTestCompile com.android.support.test:runner:0.5
androidTestCompile com.android.support.test:rules:0.5
然后我创建了一个简单的 class,其中包含一个用 @SmallTest 注释的测试用例:
import android.content.Intent;
import android.support.test.filters.SmallTest;
import android.support.test.rule.ActivityTestRule;
import android.support.test.runner.AndroidJUnit4;
import com.MyApp.a.ui.activity.WelcomeActivity;
import org.junit.Before;
import org.junit.Rule;
import org.junit.runner.RunWith;
@RunWith(AndroidJUnit4.class)
public class ExampleTestPackage {
@Rule
public ActivityTestRule<WelcomeActivity> activityRule = new ActivityTestRule<>(
WelcomeActivity.class, true, false
);
@Before
public void before() {
activityRule.launchActivity(new Intent());
}
@SmallTest
public void exampleTest() {
// some test code
}
}
这就是我的设置。根据我正在使用的 documentation of AndroidJUnitRunner,对于带有小注释的 运行 我的测试,我应该这样做:
Running a specific test size i.e. annotated with SmallTest or
MediumTest or LargeTest: adb shell am instrument -w -e size
[small|medium|large]
com.android.foo/android.support.test.runner.AndroidJUnitRunner
所以我在终端中做的是:
adb shell am instrument -w -e size small com.MyApp.debug1.test/com.MyApp.instrumentation.config.MyAppTestRunner
但是没有找到我的@SmallTest,输出是:
Time: 0.001
OK (0 tests)
此外,如果我从 Android Studio 开始我的测试 class,那么我会看到这个错误:
java.lang.Exception: No runnable methods
at org.junit.runners.BlockJUnit4ClassRunner.validateInstanceMethods(BlockJUnit4ClassRunner.java:191)
at org.junit.runners.BlockJUnit4ClassRunner.collectInitializationErrors(BlockJUnit4ClassRunner.java:128)
at org.junit.runners.ParentRunner.validate(ParentRunner.java:416)
at org.junit.runners.ParentRunner.<init>(ParentRunner.java:84)
at org.junit.runners.BlockJUnit4ClassRunner.<init>(BlockJUnit4ClassRunner.java:65)
at android.support.test.internal.runner.junit4.AndroidJUnit4ClassRunner.<init>(AndroidJUnit4ClassRunner.java:37)
at android.support.test.runner.AndroidJUnit4.<init>(AndroidJUnit4.java:36)
at java.lang.reflect.Constructor.newInstance(Native Method)
at android.support.test.internal.runner.junit4.AndroidAnnotatedBuilder.buildAndroidRunner(AndroidAnnotatedBuilder.java:83)
at android.support.test.internal.runner.junit4.AndroidAnnotatedBuilder.runnerForClass(AndroidAnnotatedBuilder.java:62)
at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59)
at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:26)
at org.junit.runner.Computer.getRunner(Computer.java:40)
at org.junit.runner.Computer.runnerForClass(Computer.java:31)
at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59)
at org.junit.runners.model.RunnerBuilder.runners(RunnerBuilder.java:101)
at org.junit.runners.model.RunnerBuilder.runners(RunnerBuilder.java:87)
at org.junit.runners.Suite.<init>(Suite.java:81)
at org.junit.runner.Computer.getSuite(Computer.java:28)
at android.support.test.internal.runner.TestRequestBuilder.classes(TestRequestBuilder.java:789)
at android.support.test.internal.runner.TestRequestBuilder.build(TestRequestBuilder.java:753)
at android.support.test.runner.AndroidJUnitRunner.buildRequest(AndroidJUnitRunner.java:354)
at android.support.test.runner.AndroidJUnitRunner.onStart(AndroidJUnitRunner.java:260)
at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1879)
如果我将 @SmallTest 更改为 @Test(导入 org.junit.Test;)当然可以解决这个问题
我是不是用错了class?
来自 android.support.test.filters
的注释 @SmallTest
、@MediumTest
等不会替换 @Test
注释。需要 @Test
注释来向 JUnit 发出相应方法是测试用例 (http://junit.org/junit4/javadoc/latest/org/junit/Test.html) 的信号。
在你的情况下,这会起作用:
@SmallTest
@Test
public void exampleTest() {
// some test code
}
我无法从终端 运行 我的@SmallTests。我已经创建了我的设置示例,希望您指出我做错了什么。
我正在使用自己的默认 Runner class,它看起来像这样:
public class MyAppTestRunner extends AndroidJUnitRunner { @Override public Application newApplication(ClassLoader cl, String className, Context context) throws InstantiationException, IllegalAccessException, ClassNotFoundException { return super.newApplication(cl, MyAppTestApplication.class.getName(), context); } }
我已经在我的 gradle:
中设置了这个 运行nerandroid { defaultConfig { testInstrumentationRunner "com.MyApp.instrumentation.config.MyAppTestRunner" } testBuildType 'integrationTest' }
我也在使用这些依赖项:
androidTestCompile com.android.support.test:runner:0.5 androidTestCompile com.android.support.test:rules:0.5
然后我创建了一个简单的 class,其中包含一个用 @SmallTest 注释的测试用例:
import android.content.Intent; import android.support.test.filters.SmallTest; import android.support.test.rule.ActivityTestRule; import android.support.test.runner.AndroidJUnit4; import com.MyApp.a.ui.activity.WelcomeActivity; import org.junit.Before; import org.junit.Rule; import org.junit.runner.RunWith; @RunWith(AndroidJUnit4.class) public class ExampleTestPackage { @Rule public ActivityTestRule<WelcomeActivity> activityRule = new ActivityTestRule<>( WelcomeActivity.class, true, false ); @Before public void before() { activityRule.launchActivity(new Intent()); } @SmallTest public void exampleTest() { // some test code } }
这就是我的设置。根据我正在使用的 documentation of AndroidJUnitRunner,对于带有小注释的 运行 我的测试,我应该这样做:
Running a specific test size i.e. annotated with SmallTest or MediumTest or LargeTest: adb shell am instrument -w -e size [small|medium|large] com.android.foo/android.support.test.runner.AndroidJUnitRunner
所以我在终端中做的是:
adb shell am instrument -w -e size small com.MyApp.debug1.test/com.MyApp.instrumentation.config.MyAppTestRunner
但是没有找到我的@SmallTest,输出是:
Time: 0.001
OK (0 tests)
此外,如果我从 Android Studio 开始我的测试 class,那么我会看到这个错误:
java.lang.Exception: No runnable methods
at org.junit.runners.BlockJUnit4ClassRunner.validateInstanceMethods(BlockJUnit4ClassRunner.java:191)
at org.junit.runners.BlockJUnit4ClassRunner.collectInitializationErrors(BlockJUnit4ClassRunner.java:128)
at org.junit.runners.ParentRunner.validate(ParentRunner.java:416)
at org.junit.runners.ParentRunner.<init>(ParentRunner.java:84)
at org.junit.runners.BlockJUnit4ClassRunner.<init>(BlockJUnit4ClassRunner.java:65)
at android.support.test.internal.runner.junit4.AndroidJUnit4ClassRunner.<init>(AndroidJUnit4ClassRunner.java:37)
at android.support.test.runner.AndroidJUnit4.<init>(AndroidJUnit4.java:36)
at java.lang.reflect.Constructor.newInstance(Native Method)
at android.support.test.internal.runner.junit4.AndroidAnnotatedBuilder.buildAndroidRunner(AndroidAnnotatedBuilder.java:83)
at android.support.test.internal.runner.junit4.AndroidAnnotatedBuilder.runnerForClass(AndroidAnnotatedBuilder.java:62)
at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59)
at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:26)
at org.junit.runner.Computer.getRunner(Computer.java:40)
at org.junit.runner.Computer.runnerForClass(Computer.java:31)
at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59)
at org.junit.runners.model.RunnerBuilder.runners(RunnerBuilder.java:101)
at org.junit.runners.model.RunnerBuilder.runners(RunnerBuilder.java:87)
at org.junit.runners.Suite.<init>(Suite.java:81)
at org.junit.runner.Computer.getSuite(Computer.java:28)
at android.support.test.internal.runner.TestRequestBuilder.classes(TestRequestBuilder.java:789)
at android.support.test.internal.runner.TestRequestBuilder.build(TestRequestBuilder.java:753)
at android.support.test.runner.AndroidJUnitRunner.buildRequest(AndroidJUnitRunner.java:354)
at android.support.test.runner.AndroidJUnitRunner.onStart(AndroidJUnitRunner.java:260)
at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1879)
如果我将 @SmallTest 更改为 @Test(导入 org.junit.Test;)当然可以解决这个问题
我是不是用错了class?
来自 android.support.test.filters
的注释 @SmallTest
、@MediumTest
等不会替换 @Test
注释。需要 @Test
注释来向 JUnit 发出相应方法是测试用例 (http://junit.org/junit4/javadoc/latest/org/junit/Test.html) 的信号。
在你的情况下,这会起作用:
@SmallTest
@Test
public void exampleTest() {
// some test code
}