Android:为Fragments编写测试用例

时间:2015-06-18 07:23:14

标签: android unit-testing android-fragments android-testing

在我以前的项目中,我通过活动完成了大部分工作,并根据文档使用了ActivityInstrumentationTestCase2:
http://developer.android.com/tools/testing/activity_testing.html
我知道如何使用Activity Test案例;但是当谈到Fragment时,我没有太多的想法,也没有找到与此相关的文档。 那么当我有几个片段有一个或两个活动时,如何编写测试用例? 任何示例代码或示例都会更有帮助。

5 个答案:

答案 0 :(得分:25)

以下是使用ActivityInstrumentationTestCase2的粗略指南:

第1步。创建一个空白活动来保存您的片段

  private static class FragmentUtilActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      LinearLayout view = new LinearLayout(this);
      view.setId(1);

      setContentView(view);
    }
  }

第2步: 在测试中,实例化您的片段并将其添加到空白活动

public class MyFragmentTest extends ActivityInstrumentationTestCase2<FragmentUtilActivity> { 
    private MyFragment fragment;

    @Before
    public void setup() {
        fragment = new MyFragment();
        getActivity().getFragmentManager().beginTransaction().add(1, fragment, null).commit();
    }
}

第3步测试您的实例化片段

@Test
public void aTest() {
    fragment.getView().findViewById(...);
}

如果您正在使用robolectric,使用FragmentUtilTest类非常简单:

@Test
public void aTest() {
    // instantiate your fragment
    MyFragment fragment = new MyFragment();

    // Add it to a blank activity
    FragmentTestUtil.startVisibleFragment(fragment);

    // ... call getView().findViewById() on your fragment
}

答案 1 :(得分:3)

这是我的工作解决方案:

  1. 在androidTest目录中为此创建一个检测单元测试类,即:

    public class FragmentTest extends 
    ActivityInstrumentationTestCase2<MainActivity> {
         private MainActivity testingActivity;
         private TestFragment testFragment;
         //... 
    }
    
  2. 在这个新类中调用此构造函数:

    public FragmentTest() {
    
        super(MainActivity.class);
    }
    
  3. 覆盖setUp()方法(确保在Activity类中有R.id.fragmentContainer),最后将调用 waitForIdleSync()

    @Override
    protected void setUp() throws Exception {
        super.setUp();
    
        // Starts the activity under test using
        // the default Intent with:
        // action = {@link Intent#ACTION_MAIN}
        // flags = {@link Intent#FLAG_ACTIVITY_NEW_TASK}
        // All other fields are null or empty.
        testingActivity = getActivity();
    
        testFragment = new TestFragment();
        testingActivity.getFragmentManager().beginTransaction().add(R.id.fragmentContainer,testFragment,null).commit();
        /**
         * Synchronously wait for the application to be idle.  Can not be called
         * from the main application thread -- use {@link #start} to execute
         * instrumentation in its own thread.
         *
         * Without waitForIdleSync(); our test would have nulls in fragment references.
         */
        getInstrumentation().waitForIdleSync();
    }
    
  4. 编写测试方法,例如:

    public void testGameFragmentsTextViews() {
    
       String empty = "";
       TextView textView = (TextView)testFragment.getView().findViewById(R.id.myTextView);
       assertTrue("Empty stuff",(textView.getText().equals(empty)));   
    }
    
  5. 运行测试。

答案 2 :(得分:2)

将您的主要活动用作您发送到ActivityInstrumentationTestCase2的测试活动。然后,您可以通过启动片段的主活动的片段管理器处理片段。这比测试活动更好,因为它使用您在主活动中编写的逻辑来测试场景,从而提供更全面,更完整的测试。

示例:

public class YourFragmentTest extends ActivityInstrumentationTestCase2<MainActivity> {  
    public YourFragmentTest(){
            super(MainActivity.class);
        }

}

答案 3 :(得分:2)

AndroidX提供了一个FragmentScenario库,用于创建片段并更改其状态。

app / build.gradle

dependencies {
    def fragment_version = "1.0.0"
    // ...
    debugImplementation 'androidx.fragment:fragment-testing:$fragment_version'
}

示例

@RunWith(AndroidJUnit4::class)
class MyTestSuite {
    @Test fun testEventFragment() {
        // The "fragmentArgs" and "factory" arguments are optional.
        val fragmentArgs = Bundle().apply {
            putInt("selectedListItem", 0)
        }
        val factory = MyFragmentFactory()
        val scenario = launchFragmentInContainer<MyFragment>(
                fragmentArgs, factory)
        onView(withId(R.id.text)).check(matches(withText("Hello World!")))
    }
}

更多{@ {3}}。

答案 4 :(得分:0)

现在不推荐使用ActivityInstrumentationTestCase2。现在,您可以使用规则来使用测试中的活动:http://wiebe-elsinga.com/blog/whats-new-in-android-testing/

为了让那些人工作,你必须将依赖项添加到build.gradle:

testCompile 'com.android.support.test:rules:0.5'
testCompile 'com.android.support.test:runner:0.5'

(见Why cannot I import AndroidJUnit4 and ActivityTestRule into my unit test class?