Android - 独立的 Fragment UI 测试工具

标签 android android-testing android-espresso android-uiautomator

我一直在寻找一种方法来单独测试我的 Fragments 的 UI(即,独立于其他 Fragment 和 Activity),但我找不到方法。

特别是,假设我有 Fragment A、Fragment B 和 Fragment C。进入 Fragment C 的唯一方法(应用程序)是首先通过 Fragment A 和 Fragment B。我正在寻找一种直接测试 Fragment C 的方法(可能通过模拟它的依赖项,如果存在的话),而不必通过 Fragment A 和 B。

到目前为止我研究过的工具:

  • monkey:仅用于通过命令行生成伪随机事件。不是我想要的。

  • monkeyrunner:它可以运行 Python 程序将事件流发送到我的 Android 应用程序,但它不能使用这些脚本直接针对特定的 Fragment。

  • Espresso:白盒测试工具。这接近我想要的,但它仍然需要在到达 Fragment C 之前通过 Fragment A 和 B(即,您需要启动您的应用,然后测试将从那里运行)。

  • UI Automator:黑盒测试工具。这也很接近,但同样,它需要在测试我想要的 fragment ( fragment C)之前通过之前的 fragment 。

有没有办法直接测试 Fragmen 的 UIt?

最佳答案

我正在使用自定义 FragmentTestRule 和 Espresso 来单独测试我的每个 Fragment

我有一个专用的 TestActivity,它在我的应用程序中显示测试的 Fragments。在我的情况下,Activity 仅存在于 debug 变体中,因为我的仪器测试针对 debug 运行。

TL;DR 使用很棒的 FragmentTestRule 图书馆 @brais-gabin .

1.在 src/debug/java/your/package/TestActivity.java 中创建一个 TestActivity,其中包含测试 Fragment 的内容 View 将被添加到:

@VisibleForTesting
public class TestActivity extends AppCompatActivity {
    @Override
    protected void onCreate(@Nullable final Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        FrameLayout frameLayout = new FrameLayout(this);
        frameLayout.setId(R.id.container);
        setContentView(frameLayout);
    }
}

<强>2。为 debug 变体创建一个 AndroidManifest.xml 并声明 TestActivity。这是在测试时启动 TestActivity 所必需的。将此 Manifest 添加到 src/debug/AndroidManifest.xml 中的 debug 变体中:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
    <application>           
        <activity android:name="your.package.TestActivity"/>
    </application>
</manifest>

3.在 src/androidTest/java/your/test/package/FragmentTestRule.javaandroidTest 变体中创建 FragmentTestRule:

public class FragmentTestRule<F extends Fragment> extends ActivityTestRule<TestActivity> {

    private final Class<F> mFragmentClass;
    private F mFragment;

    public FragmentTestRule(final Class<F> fragmentClass) {
        super(TestActivity.class, true, false);
        mFragmentClass = fragmentClass;
    }

    @Override
    protected void afterActivityLaunched() {
        super.afterActivityLaunched();

        getActivity().runOnUiThread(() -> {
            try {
                //Instantiate and insert the fragment into the container layout
                FragmentManager manager = getActivity().getSupportFragmentManager();
                FragmentTransaction transaction = manager.beginTransaction();
                mFragment = mFragmentClass.newInstance();
                transaction.replace(R.id.container, mFragment);
                transaction.commit();
            } catch (InstantiationException | IllegalAccessException e) {
                Assert.fail(String.format("%s: Could not insert %s into TestActivity: %s",
                        getClass().getSimpleName(),
                        mFragmentClass.getSimpleName(),
                        e.getMessage()));
            }
        });
    }
    public F getFragment(){
        return mFragment;
    }
}

4.然后就可以单独测试Fragments了:

public class MyFragmentTest {

    @Rule
    public FragmentTestRule<MyFragment> mFragmentTestRule = new FragmentTestRule<>(MyFragment.class);

    @Test
    public void fragment_can_be_instantiated() {

        // Launch the activity to make the fragment visible 
        mFragmentTestRule.launchActivity(null);

        // Then use Espresso to test the Fragment
        onView(withId(R.id.an_id_in_the_fragment)).check(matches(isDisplayed()));
    }
}

关于Android - 独立的 Fragment UI 测试工具,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33647135/

相关文章:

java - Android:启动抽屉布局时出现内存不足错误

android - Espresso 如何点击放置在 listview 的第一项的 ImageView?

selenium-webdriver - 无法使用 Appium 1.6 从 Spinner 中选择一个选项

android - Detox 至少 75% 的 View 区域显示给用户

java - 过滤和加载数据,比较firebase android中的值

java - wp :featuredmedia of type org. json.JSONArray 无法转换为 JSONObject

android - 如何在 Firebase 测试实验室中执行指定的测试套件类

android-fragments - 当我尝试从 Android 测试中的 fragmentManager 获取片段时,为什么会出现 NullPointerException?

android - 可变状态是否在 compose 中堆叠

android - 发行版本变体因 “androidx.fragment:fragment-testing”库的debugImplementation失败