0

タブ付きのインターフェースを備えたAndroidアプリケーションを作成しています。私はタブFragmentActivity付きのを使用しておりActionBar.Tab、各タブには。が表示されていますListFragment

私のテストケースでは、Robotium 3.6UIインタラクションを実行するために使用しています。これは、の特定の側面をテストするために必要ですfragment's。それぞれfragmentに個別のテストメソッドがあり、データの元と同じインデックス(0)でListViewforfragmentが同じコンテンツを持っていることをテストしArrayList<String>ます。

問題は、最初の2つfragmentsはそれぞれのテストに合格しますが、最後の2つは合格fragmentせず、失敗のトレースは次のとおりです。

junit.framework.AssertionFailedError: AbsListView with index 2 is not available!
at com.jayway.android.robotium.solo.Waiter.waitForAndGetView(Waiter.java:362)
at com.jayway.android.robotium.solo.Clicker.clickInList(Clicker.java:405)
at com.jayway.android.robotium.solo.Solo.clickInList(Solo.java:1004)
at com.******.*******.test.ActivityNavigatorTest.testFragmentSongsList(ActivityNavigatorTest.java:62)
at java.lang.reflect.Method.invokeNative(Native Method)
at android.test.InstrumentationTestCase.runMethod(InstrumentationTestCase.java:214)
at android.test.InstrumentationTestCase.runTest(InstrumentationTestCase.java:199)
at android.test.ActivityInstrumentationTestCase2.runTest(ActivityInstrumentationTestCase2.java:186)
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:169)
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:154)
at android.test.InstrumentationTestRunner.onStart(InstrumentationTestRunner.java:537)
at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1551)

テスト対象のアクティビティに関連するコードは次のとおりです。

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_navigator);

    PREFERENCES = PreferenceManager.getDefaultSharedPreferences(getBaseContext());

    adapterPager = new AdapterPager(getSupportFragmentManager());

    viewPager = (ViewPager) findViewById(R.id.pager);
    viewPager.setAdapter(adapterPager);
    viewPager.setOnPageChangeListener(new SimpleOnPageChangeListener() {
        @Override
        public void onPageSelected(int position) {
            super.onPageSelected(position);
            getActionBar().setSelectedNavigationItem(position);
        }
    });

    final ActionBar actionBar = getActionBar();
    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

    actionBar.addTab(actionBar.newTab().setText(R.string.title_fragment_artists).setTag("artists").setTabListener(this));
    actionBar.addTab(actionBar.newTab().setText(R.string.title_fragment_albums).setTag("albums").setTabListener(this));
    actionBar.addTab(actionBar.newTab().setText(R.string.title_fragment_songs).setTag("songs").setTabListener(this));
}

それぞれのコードは、ListFragmentを定義しArrayList<String>、ダミーコンテンツを入力し、そのコンテンツを。で表示するだけArrayAdapter<String>です。テストケースのコードは次のとおりです。

package com.******.*******.test;

import android.test.ActivityInstrumentationTestCase2;

import com.******.******.ActivityNavigator;
import com.*******.******.FragmentAlbums;
import com.*******.********.FragmentArtists;
import com.*******.******.FragmentSongs;
import com.jayway.android.robotium.solo.Solo;

public class ActivityNavigatorTest extends ActivityInstrumentationTestCase2<ActivityNavigator> {

    private Solo solo;

        public ActivityNavigatorTest() {
        super(ActivityNavigator.class);
    }

    protected void setUp() throws Exception {
        solo = new Solo(getInstrumentation(), getActivity());
    }

    protected void tearDown() throws Exception {
        solo.finishOpenedActivities();
    }

    public void testFragmentArtistsList() {     
        solo.assertCurrentActivity("Checking loaded activity is the navigator", ActivityNavigator.class);
        solo.clickOnText("Artists");

        String contentExpected = FragmentArtists.getArtistList().get(0);
        String contentActual = solo.clickInList(0, 0).get(0).getText().toString();

        assertEquals("Testing index 0 has same content in ArrayList and ListView", contentExpected, contentActual);

        int sizeExpected = FragmentArtists.getArtistList().size();
        int sizeActual = solo.getCurrentListViews().get(0).getCount();

        assertEquals("Testing same quantity of data in ArrayList and ListView", sizeExpected, sizeActual);
    }

    public void testFragmentAlbumsList() {
        solo.assertCurrentActivity("Checking loaded activity is the navigator", ActivityNavigator.class);
        solo.clickOnText("Albums");

        String contentExpected = FragmentAlbums.getAlbumList().get(0);
        String contentActual = solo.clickInList(0, 1).get(0).getText().toString();

        assertEquals("Testing index 0 has same content in ArrayList and ListView", contentExpected, contentActual);

        int sizeExpected = FragmentAlbums.getAlbumList().size();
        int sizeActual = solo.getCurrentListViews().get(1).getCount();

        assertEquals("Testing same quantity of data in ArrayList and ListView", sizeExpected, sizeActual);
    }

    public void testFragmentSongsList() {
        solo.assertCurrentActivity("Checking loaded activity is the navigator", ActivityNavigator.class);
        solo.clickOnText("Songs");

        String contentExpected = FragmentSongs.getSongList().get(0);
        String contentActual = solo.clickInList(0, 2).get(0).getText().toString();

        assertEquals("Testing index 0 has same content in ArrayList and ListView", contentExpected, contentActual);

        int sizeExpected = FragmentSongs.getSongList().size();
        int sizeActual = solo.getCurrentListViews().get(2).getCount();

        assertEquals("Testing same quantity of data in ArrayList and ListView", sizeExpected, sizeActual);
    }
}
4

1 に答える 1

0

私には理論がありますが、それが正しいかどうかはわかりません。あなたのアプリケーションでは、各フラグメントがビューページャーに一度に1つずつ表示されていると思いますか?

さて、私は、最初の2つのテストケースが何よりも偶然に機能する可能性があると信じています。一度に1つのリストビューのみを表示する必要があり、何らかの理由で追加のリストビュー(以前に表示されたものの可能性があります)がrobotiumによって保持されているため、カウントは常に2であると思います。これを確認するには、hierarchyviewerツールを調べて、アプリケーションに表示されているリストビューを確認します。

私があなたのために持っている別の方法は、さまざまなリストビューに適切なID(またはタグ/コンテンツの説明)を設定し、この種の問題が発生しやすいrobotiums getCurrentListViews()メソッドではなくこれらを使用することです。

于 2012-12-03T15:41:08.040 に答える