Android Studio - 测试配置启动应用程序

时间:2014-06-30 01:33:51

标签: android gradle android-studio android-testing

我的项目的不同包中有几个AndroidTestCase子类: enter image description here

但是,每当我从Android Studio运行Android Tests配置时,我都会看到我的常规应用也在启动。我看到onCreate方法在我的Application类中被激活(这非常糟糕,因为我在那里加载了一些额外的资源)。enter image description here  
为什么Android Studio / gradle也在运行我的应用程序?
我可以以编程方式检测我是否在测试或常规配置中?
我可以在运行测试之前阻止常规应用程序启动吗?
此外,当我在调试模式下运行测试时,它不会停在应用程序的onCreate方法内的断点上。为什么会这样?

修改
测试类的主体并不重要,它可以是:

public class SimpleTest extends AndroidTestCase {
    public void testSample()
    {
        assertEquals(true, false);
    }
}

仅执行此简单测试会激活应用程序类中的onCreate方法。 Gradle控制台打印出来:

Executing tasks: [:app:assembleDebug, :app:assembleDebugTest]

我猜第一个任务是创建我的Application类的实例 - 是否是预期的行为?

2 个答案:

答案 0 :(得分:2)

  

为什么Android Studio / gradle也会运行我的应用程序?

     

我可以在运行测试之前停止我的常规应用程序启动吗?

AndroidTestCase是JUnit TestCase的扩展,它知道你的android应用程序。如果你不需要测试你的android应用程序并且只想测试普通的java,你应该使用JUnit框架。创建常规JUnit测试,不要在那里使用android类并运行JUnit测试配置,如下所示:

enter image description here

您应该将AndroidTestCase视为将构建Android应用并在其上运行测试的检测测试。这对于EspressoRobotium的组合非常有用。两者都在基础android测试类之上工作,两者都将在测试之前构建并运行您的应用程序。需要真实的设备或模拟器。

使用普通的JUnit测试或Robolectric来测试桌面JVM上的java。

  

我可以以编程方式检测我是否在测试或常规配置中?

您可以使用gradle功能通过自动生成的BuildConfig文件提供此类信息。

build.gradle

android {
    defaultConfig {
        testPackageName "com.foo.test"
    }
}

在你的代码中:

BuildConfig.PACKAGE_NAME.equals("com.foo.test")

答案 1 :(得分:1)

AndroidTestCase是一个不幸在设备上运行的单元测试(虚拟或真实)。

我认为您想拥有的是在JVM(本地机器上)中运行的UnitTestFramework。 TestFramework Robolectric可以做到这一点。

我已经启动了一个gitHub项目来展示如何设置gradle测试文件和项目结构,如果你想要单独使用UnitTests和InstrumentationTests。如果你想查看它的AndroidGradleTests