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

3
我在我的项目中有一些AndroidTestCase的子类,分别在不同的包中: enter image description here

然而,每当我从Android Studio运行Android测试配置时,我发现我的常规应用程序也在启动。 我看到我的Application类中的onCreate方法被激活了(这真的很糟糕,因为我在那里加载了一些额外的资源)。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类的实例 - 这是预期行为吗?

能否提供一下您所说的测试内容,这样我才能更好地了解问题所在。根据您提供的信息,我只能猜测可能出现的问题。当您说“我的常规应用程序也在启动”时,您到底是什么意思呢?如需调试测试,您需要以调试模式运行测试,就像您想要调试应用程序一样。 - Xaver Kapeller
@XaverKapeller- 我添加了一些额外的信息。我很困惑,在执行测试时,我的onCreate方法中的资源仍在加载,因此我在这个方法中放置了断点并尝试运行调试模式。令人惊讶的是,它没有停在那里。只有通过添加一些日志,我才能确信。 - Piotr
2个回答

2
为什么Android Studio/gradle会运行我的应用程序?我能在运行测试之前停止正常的应用程序吗? AndroidTestCase 是 JUnit TestCase 的扩展,它知道你的 Android 应用程序。如果您不需要测试 Android 应用程序,只想测试普通的 Java,则应使用 JUnit 框架。创建常规的 JUnit 测试,在那里不要使用 Android 类,并像这样运行 JUnit 测试配置:
您应该将 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")

你能详细说明一下“仪器测试将构建Android应用程序并在其上运行这些测试”吗?为什么在构建后必须运行该应用程序?而且,使用BuildConfig.PACKAGE_NAME无法在Application的onCreate方法中检测到测试配置,对吧? - Piotr
1
仪器测试旨在测试用户界面。因此,InstrumentationRunner启动应用程序,单击文本,检查视图是否可见等。您可以将其描述为使用应用程序的机器人,以检查某些功能是否适用于您的用户。因此,应用程序需要运行。对于类的直接测试,请改用Unittests。我认为您应该阅读一些关于unittests与仪器测试的内容。 - Dornathal
我认为Robotium和Espresso需要getActivity()方法,因此它们依赖于AndroidInstrumentationTestCase2类? - Dornathal
你不能简单地创建Activity实例并对其进行测试。因为onCreateonResume和其他方法不是Java类构造函数的一部分,而是由Android生命周期系统管理。换句话说,要创建Activity实例,您需要在其中运行应用程序并触发Application onCreate,因为它作为Android生命周期的一部分会在任何Activity方法之前被调用。如果您不想处理应用程序运行,则应将逻辑从基本的Android类(例如应用程序、活动、片段等)中移出,并通过JUnit进行测试。 - Sergii Pechenizkyi
@SergiiPechenizkyi,实际上我并没有测试Activities,我的业务逻辑是独立于它们的。我只需要一个Context实例来测试一些东西,比如数据库或者某些类必须从XML文件中加载资源。所以如果不在应用程序运行之前测试这些类(使用Context),是不可能的吗? - Piotr
什么是“Context”?它基本上是您的应用程序,其中包含访问您的主题、资产、资源、字符串、布局等。Android如何在不构建应用程序的情况下访问它们?如果您想测试数据库,则需要首先构建它,但在构建应用程序之前应该在哪里构建它?这有意义吗?这就是为什么“AndroidTestCase”是仪器测试,当您需要构建和测试应用程序时。 您可以使用Mochito和Robolectric等模拟框架模拟“Context”和模拟数据库,然后不使用“AndroidTestCase”设施。 - Sergii Pechenizkyi

1
AndroidTestCase 是一种单元测试,不幸的是它只能在设备上(无论是虚拟设备还是真实设备)运行。
我认为你想要的是在 JVM(本地机器上)运行的 UnitTestFramework。 Robolectric 可以做到这一点。
我已经开始了一个 gitHub 项目,展示了如何设置 gradle 测试文件和项目结构,如果你想要同时进行单元测试和仪表盘测试。如果你想看看它,可以查看 AndroidGradleTests

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接