如何确定Android应用程序是否使用JUnit测试工具启动?

Ily*_*nko 20 junit android bootstrapping

我需要在运行时从代码中确定应用程序是否在TestInstrumentation下运行.

我可以用一些env/system变量初始化测试环境,但Eclipse ADK启动配置不允许我这样做.

默认的Android系统属性和环境不包含任何有关它的数据.此外,它们完全相同,无论应用程序是定期启动还是正在测试中.

这可能是一个解决方案:是否有可能找出Android应用程序是否作为检测测试的一部分运行,但由于我不测试活动,所有提出的方法都不起作用.所述ActivityManager.isRunningInTestHarness()方法使用该罩下:

SystemProperties.getBoolean("ro.test_harness") 
Run Code Online (Sandbox Code Playgroud)

在我的情况下总是返回false.(要使用隐藏的android.os.SystemProperties类,我使用反射).

如果它正在测试中,我还能做些什么来尝试从应用程序内部确定?

Ily*_*nko 27

我找到了一个hacky解决方案:在应用程序之外,可以尝试从测试包中加载一个类.应用程序类加载器令人惊讶地可以从测试项目中按名称加载类,如果它是在测试下运行的话.在其他情况下,找不到该课程.

private static boolean isTestMode() {
  boolean result;
  try {
    application.getClassLoader().loadClass("foo.bar.test.SomeTest");
    // alternatively (see the comment below):
    // Class.forName("foo.bar.test.SomeTest");
    result = true;
  } catch (final Exception e) {
result = false;
  }
  return result;
}
Run Code Online (Sandbox Code Playgroud)

我承认这不优雅,但它有效.将会感激正确的解决方案.

  • 我有一个想法,我想分享一下:为了不使“ isTestMode()”依赖于我的实际测试类之一(不太可能被重命名或删除),我添加了一个名为“ InstrumentationTestIndicator”的空类。在我的“ androidTest”目录中,然后“ isTestMode()”会尝试加载。非常感谢你做的这些!我刚刚将这种技巧纳入了我的项目! (2认同)

Dar*_*iak 13

在Android Studio 1.2.1.1上,isTestMode()解决方案对我不起作用.来自我们公司的全能Krzysztof使用以下方法调整了您的方法:

Class.forName("foo.bar.test.SomeTest");
Run Code Online (Sandbox Code Playgroud)

而不是getClassLoader().谢谢Krzysztof!

  • 是的,Krzysztofs往往是那样的 (7认同)