如何检测Android应用程序是否正在用Espresso进行UI测试

我正在为Android编写一些Espresso测试。 我正在运行在以下问题:

为了使某个测试用例正常运行,我需要禁用应用程序中的某些功能。 因此,在我的应用程序中,我需要检测是否正在运行Espresso测试,以便禁用它。 但是,我不想使用BuildConfig.DEBUG ,因为我不希望这些功能在调试版本中被禁用。 另外,我想避免创建一个新的buildConfig来避免创建太多的构建变体(我们已经定义了很多的变体)。

我正在寻找一种方法来定义buildConfigField进行测试,但是我在Google上找不到任何参考。

结合CommonsWare的答案。 这是我的解决方案:

我定义了一个AtomicBoolean变量和一个函数来检查它是否正在运行测试:

 private AtomicBoolean isRunningTest; public synchronized boolean isRunningTest () { if (null == isRunningTest) { boolean istest; try { Class.forName ("myApp.package.name.test.class.name"); istest = true; } catch (ClassNotFoundException e) { istest = false; } isRunningTest = new AtomicBoolean (istest); } return isRunningTest.get (); } 

这样可以避免每次需要检查值时执行try-catch检查,并且只在您第一次调用此函数时才执行检查。

结合Commonsware评论+ Comtaler的解决方案,这是一个使用Espresso框架进行测试的方法。

 public static synchronized boolean isRunningTest () { if (null == isRunningTest) { boolean istest; try { Class.forName ("android.support.test.espresso.Espresso"); istest = true; } catch (ClassNotFoundException e) { istest = false; } isRunningTest = new AtomicBoolean (istest); } return isRunningTest.get(); } 

建立在以上Kotlin代码上面的答案是等价的:

 val isRunningTest : Boolean by lazy { try { Class.forName("android.support.test.espresso.Espresso") true } catch (e: ClassNotFoundException) { false } } 

然后你可以检查财产的价值:

 if (isRunningTest) { // Espresso only code } 

你可以为此使用SharedPreferences。

设置调试模式:

 boolean isDebug = true; SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE); SharedPreferences.Editor editor = sharedPref.edit(); editor.putInt("DEBUG_MODE", isDebug); editor.commit(); 

检查调试模式:

 SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE); boolean isDebug = sharedPref.getBoolean("DEBUG_MODE", false); if(isDebug){ //Activate debug features }else{ //Disable debug features }