java - 安卓 Espresso : How to create test-suite which may launch separate test classes with different activities?

标签 java android testing junit android-espresso

我刚开始研究 Espresso 测试,但我搜索了 StackOverFlow 主题,但找不到满足我需求的解决方案。


我的问题的史前史:

我有一个包含很多 Activity 的 Android 应用程序。通常为应用程序的不同流程创建单独的 UI 测试(每个流程需要单独的 Activity ,所以这就是为什么我在不同的类中实现测试)。 在我的案例中,背景和 UI usync 发生了,这就是为什么我无法从第一个 Activity 开始并继续进行下一个 Activity 的原因。 我找到并真正适用于当前应用程序的唯一解决方案是为应用程序 Activity 使用闲置资源。

问题: 所以现在我想了解如何将所有这些单独的类(每个类使用自己的规则和这些规则的 Activity )放入功能套件??


我的经验:

1) 正面 - 使用空闲资源,需要更改开发人员的源代码,但套件中仍然只有一个 Activity :

@RunWith(AndroidJUnit4.class)
public class forSeveralActs {
    @Rule
    public final ActivityTestRule<TargetedActivity> mTargetedActivityRule = new ActivityTestRule<>(TargetedActivity.class, true, true);`
        
    final String username = "test@mail.com";
    final String password = "12345678";
    private IdlingResource mIdlingRecourse;

    @Before
    public void setIdleResource() {
        mIdlingRecourse = mTargetedActivityRule.getActivity().getIdlingResource();
        Espresso.registerIdlingResources(mIdlingRecourse);
    }

    @Test
    public void PassPermission_and_goto_MainActivity() {
        // First activity - LoginActivity
        Espresso.onView(withId(R.id.activity_login_et_login))
                .perform(ViewActions.typeText(username));

        Espresso.onView(withId(R.id.activity_login_et_password))
                .perform(ViewActions.typeText(password))
                .perform(closeSoftKeyboard());

        Espresso.onView(withId(R.id.activity_login_btn_login))
                .check(matches(isDisplayed()))
                .check(matches(isClickable()))
                .perform(ViewActions.click());

      // Here is elements of second activity - MainActivity, without idling methods I can't reach this element
        Espresso.onView(withId(R.id.helpMeCard_title))
                .check(matches(withText("help_me")));
    }

    @After
    public void unregisteredIdlingResource() {
        if (mIdlingRecourse != null) {
            Espresso.unregisterIdlingResources(mIdlingRecourse);
        }
    }
}

所以在这个例子中我有几个测试,最后一个将在下一个 Activity 中执行。


2) 否定 - 我已经尝试通过 JUnit 测试套件启动我所有的测试(类),所以我只是将我所有的类(其中还包括测试和 Activity 的规则)放到Junit套件(这个场景根本行不通):

@RunWith(Suite.class)
@Suite.SuiteClasses(
    {
            ESP_test1.class,
            ESP_test2.class,
            ESP_test3.class
    })

public class ESP_start {}

这是我在上面发布的同一个问题: 我如何从使用不同 Activity 和规则的单独测试创建套件,它应该是什么样子?

最佳答案

以防万一,答案可能对其他人有用,这个套件是正确的,之前我在测试类中使用过参数。 在这种情况下,应用程序测试类应该是无效的,没有任何参数:

@RunWith(Suite.class)
@Suite.SuiteClasses(
    {
            ESP_test1.class,
            ESP_test2.class,
            ESP_test3.class
    })

public class ESP_start {} 

关于java - 安卓 Espresso : How to create test-suite which may launch separate test classes with different activities?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46878733/

相关文章:

Android 检查代码中的单选按钮使其在单选组中保持选中状态

android - Dagger 2 瞄准镜说明

node.js - 使用 Mocha 测试 Node 时未显示测试结果

java - 线程 “main” java.lang.ArrayIndexOutOfBoundsException : Coordinate out of bounds 中的异常

key-management - 是否有命令行工具可以在 Java keystore 中生成对称 key ?

android - 当不保持启用 Activity 时,矢量恢复为 ArrayList onRestoreInstanceState

testing - Jmeter如何使用CSV Config Set的共享方式运行线程?

python - 使用 OpenCV 在 Python 中模拟磁盘上没有剩余空间的异常的最佳实践

java - 运行 ObjectBox 查询时获得随机字符串作为结果而不是值

java - Java 和 C++ 中的动态方法调度