我的项目的不同包中有几个AndroidTestCase
子类:
但是,每当我从Android Studio运行Android Tests
配置时,我都会看到我的常规应用也在启动。我看到onCreate
方法在我的Application类中被激活(这非常糟糕,因为我在那里加载了一些额外的资源)。
为什么Android Studio / gradle也在运行我的应用程序?
我可以以编程方式检测我是否在测试或常规配置中?
我可以在运行测试之前阻止常规应用程序启动吗?
此外,当我在调试模式下运行测试时,它不会停在应用程序的onCreate
方法内的断点上。为什么会这样?
修改
测试类的主体并不重要,它可以是:
public class SimpleTest extends AndroidTestCase {
public void testSample()
{
assertEquals(true, false);
}
}
仅执行此简单测试会激活应用程序类中的onCreate
方法。
Gradle控制台打印出来:
Executing tasks: [:app:assembleDebug, :app:assembleDebugTest]
我猜第一个任务是创建我的Application
类的实例 - 是否是预期的行为?
答案 0 :(得分:2)
为什么Android Studio / gradle也会运行我的应用程序?
我可以在运行测试之前停止我的常规应用程序启动吗?
AndroidTestCase
是JUnit TestCase
的扩展,它知道你的android应用程序。如果你不需要测试你的android应用程序并且只想测试普通的java,你应该使用JUnit框架。创建常规JUnit测试,不要在那里使用android类并运行JUnit测试配置,如下所示:
您应该将AndroidTestCase
视为将构建Android应用并在其上运行测试的检测测试。这对于Espresso和Robotium的组合非常有用。两者都在基础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