【问题标题】:Android: Espresso doesn't wait until fragment or activity is shown so every test failedAndroid:Espresso 不会等到显示片段或活动,所以每次测试都失败
【发布时间】:2016-02-17 10:45:03
【问题描述】:

我知道这方面有很多问题,但我找不到任何可以帮助我的东西:(

我尝试使用 Espresso 为 Android 应用程序生成 UI-Test。在解决了依赖问题之后(因为某些库在不同版本中被包含两次作为来自其他库的依赖)我仍然无法创建工作测试......

我知道 IdlingResource,但在阅读时,espresso 开箱即用,直到主线程和 AsyncTaskPool 在运行任何测试之前处于空闲状态。

为了与它取得联系,我创建了一个简单的应用程序,其中包含两个活动,一个闪屏和一个主活动。 启动画面包含类似这样的内容,用于在启动 mainActivity 之前等待三秒

 new Handler().postDelayed(new Runnable() {
   @Override
   public void run() {
     finish();
     Intent intent = new Intent(SplashScreenActivity.this, MainActivity.class);
     startActivity(intent);
   }
 }, 3000);

我也尝试为此使用 AsyncTask,但似乎没有任何工作正常,因为每个测试都失败了。

测试只检查包含定义文本的 TextView 是否显示在视图上:

onView(withText("DummyText")).check(matches(notNullValue()));

我认为创建一个简单的测试不会那么难......

因为我必须针对 api 进行测试>=16 我需要浓缩咖啡。就我而言,我使用 uiAutomator 进行了检查(我知道它适用于 api >=18),但是有一种智能逻辑可以等待显示某些内容……而且效果很好……

【问题讨论】:

    标签: android testing automated-tests android-espresso android-uiautomator


    【解决方案1】:

    你的活动规则是什么?因为如果是 SplashScreenActivity,测试将立即开始,如果视图不在启动屏幕上,onView 将失败。 尝试直接打开 MainActivity,以测试该视图。 我使用 Espresso 有一段时间了,我知道 @Test 方法会在定义为 ActivityTestRule 的活动完成加载时启动。

    希望这会有所帮助。

    祝你好运!

    【讨论】:

    • 感谢您的建议!在我将规则的第三个参数声明为“false”后,我让它工作了:@Rule public ActivityTestRule<MainActivity> mMainActivity = new ActivityTestRule<>(SplascreenActivity.class, true, false); 这样做,我可以定义类似的行为,例如doNothing().when(mDeviceService).getDevices(); 然后使用 mSplashscreenActivity.launchActivity(null); 手动启动活动。我还用 AsyncTask 更改了 Handler 并且知道测试工作按预期包含等待、检查等.....
    • 真的很棒!干得好!
    • @grumpyshoe 我也面临同样的问题,在我的应用程序中,我们有一个启动屏幕,它会自动将用户导航到登录屏幕,但我的测试不会等待导航到登录并开始搜索用户名输入编辑文本。你能帮帮我吗?
    • 对此有任何解决方案吗?我也遇到了同样的问题!
    • 也许它会对某人有所帮助:我的解决方案是使用CountingIdlingResource。我还将设计模式更改为 MVVM,这种组合效果很好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多