Tia*_*ago 19 android android-testing android-espresso android-uiautomator
我一直在寻找一种方法来分别测试我的碎片的UI(即独立于其他碎片和活动),但我找不到办法.
特别是,假设我有片段A,片段B和片段C.进入片段C的唯一方法(应用方式)是首先通过片段A和片段B. 我正在寻找一种直接测试Fragment C的方法(可能通过模拟它的依赖关系,如果存在的话),而不必通过Fragment A和B.
到目前为止我调查的工具:
monkey:仅用于通过命令行生成伪随机事件.不是我想要的.
monkeyrunner:它可以运行Python程序将事件流发送到我的Android应用程序,但它不能直接使用这些脚本定位特定的Fragment.
Espresso:白盒测试工具.这接近我想要的,但它仍然需要在到达片段C之前通过片段A和B(即,您需要启动您的应用程序,然后测试将从那里运行).
UI Automator:黑盒测试工具.这也很接近,但同样,它需要在测试我想要的之前通过先前的片段(片段C).
有没有办法直接测试Fragmen的UI?
tha*_*sma 53
我正在使用自定义FragmentTestRule和Espresso来独立测试我的每一个Fragments.
我有一个专门的TestActivity,Fragments在我的应用程序中显示测试.在我的情况下,Activity唯一存在于debug变体中,因为我的检测测试运行debug.
TL; DR使用@ brais-gabin 的awesome FragmentTestRule库.
1.创建一个TestActivitysrc/debug/java/your/package/TestActivity.java带有内容视图的 in ,其中测试Fragment将被添加到:
@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);
}
}
Run Code Online (Sandbox Code Playgroud)
2.为debug变体创建一个AndroidManifest.xml并声明TestActivity.这是开始TestActivity测试时所必需的.将此清单添加到debug变体中src/debug/AndroidManifest.xml:
<?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>
Run Code Online (Sandbox Code Playgroud)
3.FragmentTestRule在以下位置创建androidTest变体src/androidTest/java/your/test/package/FragmentTestRule.java:
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;
}
}
Run Code Online (Sandbox Code Playgroud)
然后你可以单独测试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()));
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7124 次 |
| 最近记录: |