问题 带有片段的Android应用程序的JUnit测试


我的Android应用程序是基于Single Activity,基于多个片段的模型构建的。 我需要为应用程序进行单元测试。我可以为app编写单元测试用例,其中包含使用ActivityInstrumentationTestCase2 JUnit的所有活动,但不包含包含片段的app。 请建议为片段编写JUnit测试用例的方法。

谢谢


3725
2018-01-16 08:12


起源



答案:


看到 Android:测试片段

使用针对getFragmentManager()和getSupportFragmentManager()以及android:exported =“false”的编辑复制您的阅读乐趣:

如果要单独测试片段,则需要创建Test FragmentActivity,以便测试可以使用它。测试活动看起来像这样。记得在应用程序的清单中声明它:

 public class TestFragmentActivity extends FragmentActivity {
   @Override
   protected void onCreate(Bundle arg0) {
     super.onCreate(arg0);
     setContentView(R.layout.activity_fortests);
   }
 }

布局:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    >
   <LinearLayout
        android:id="@+id/activity_test_fragment_linearlayout"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        />
 </RelativeLayout>

AndroidManifest:

 ...
 <activity
  android:name="your.package.name.TestFragmentActivity"
  android:exported="false" />
 ...

然后在您的测试项目中,您可以使用这样的类来启动片段:

  public class FrameworkObjectsGeneratorFragmentTest 
      extends ActivityInstrumentationTestCase2<TestFragmentActivity> {
    private TestFragmentActivity mActivity;

    public FrameworkObjectsGeneratorFragmentTest() {
      super(TestFragmentActivity.class);
    }

    @Override
    protected void setUp() throws Exception {
      super.setUp();
      mActivity = getActivity();
    }

    private Fragment startFragment(Fragment fragment) {
      FragmentTransaction transaction = mActivity.getFragmentManager().beginTransaction();
      transaction.add(R.id.activity_test_fragment_linearlayout, fragment, "tag");
      transaction.commit();
      getInstrumentation().waitForIdleSync();
      Fragment frag = mActivity.getFragmentManager().findFragmentByTag("tag");
      return frag;
    }

   public void testFragment() {
      FrameworkObjectsGeneratorFragment fragment = new FrameworkObjectsGeneratorFragment() {
         //Override methods and add assertations here.
      };

      Fragment frag = startFragment(fragment);
    }
  }

startFragment()方法将您指定的片段添加到TestActivity中的ViewGroup。

与活动相反,测试片段的好处是可以扩展Fragment以覆盖受保护的字段和方法,您可以在其中添加断言。

注意:如果您使用支持库,请调用getSupportFragmentManager()。


13
2018-04-10 20:17



上面的例子是功能测试(Instrumentation)而不是单元测试(JUnit)。 - Muhammad Babar


答案:


看到 Android:测试片段

使用针对getFragmentManager()和getSupportFragmentManager()以及android:exported =“false”的编辑复制您的阅读乐趣:

如果要单独测试片段,则需要创建Test FragmentActivity,以便测试可以使用它。测试活动看起来像这样。记得在应用程序的清单中声明它:

 public class TestFragmentActivity extends FragmentActivity {
   @Override
   protected void onCreate(Bundle arg0) {
     super.onCreate(arg0);
     setContentView(R.layout.activity_fortests);
   }
 }

布局:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    >
   <LinearLayout
        android:id="@+id/activity_test_fragment_linearlayout"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        />
 </RelativeLayout>

AndroidManifest:

 ...
 <activity
  android:name="your.package.name.TestFragmentActivity"
  android:exported="false" />
 ...

然后在您的测试项目中,您可以使用这样的类来启动片段:

  public class FrameworkObjectsGeneratorFragmentTest 
      extends ActivityInstrumentationTestCase2<TestFragmentActivity> {
    private TestFragmentActivity mActivity;

    public FrameworkObjectsGeneratorFragmentTest() {
      super(TestFragmentActivity.class);
    }

    @Override
    protected void setUp() throws Exception {
      super.setUp();
      mActivity = getActivity();
    }

    private Fragment startFragment(Fragment fragment) {
      FragmentTransaction transaction = mActivity.getFragmentManager().beginTransaction();
      transaction.add(R.id.activity_test_fragment_linearlayout, fragment, "tag");
      transaction.commit();
      getInstrumentation().waitForIdleSync();
      Fragment frag = mActivity.getFragmentManager().findFragmentByTag("tag");
      return frag;
    }

   public void testFragment() {
      FrameworkObjectsGeneratorFragment fragment = new FrameworkObjectsGeneratorFragment() {
         //Override methods and add assertations here.
      };

      Fragment frag = startFragment(fragment);
    }
  }

startFragment()方法将您指定的片段添加到TestActivity中的ViewGroup。

与活动相反,测试片段的好处是可以扩展Fragment以覆盖受保护的字段和方法,您可以在其中添加断言。

注意:如果您使用支持库,请调用getSupportFragmentManager()。


13
2018-04-10 20:17



上面的例子是功能测试(Instrumentation)而不是单元测试(JUnit)。 - Muhammad Babar