私の以前のプロジェクトでは、アクティビティを通じてほとんどの作業を行い、ドキュメントに従ってActivityInstrumentationTestCase2を使用しました。
http://developer.Android.com/tools/testing/activity_testing.html
アクティビティテストケースの使用方法を考えています。しかし、フラグメントに関しては、私はそれについて多くのアイデアを持っていないし、それに関連するドキュメントもあまり見つけませんでした。では、1つまたは2つのアクティビティを持つ複数のフラグメントがある場合に、テストケースを作成する方法を教えてください。サンプルコードまたはサンプルの方が役立ちます。
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
}
私の作業ソリューションは次のとおりです。
このためのインストルメンテーションユニットテストクラスをandroidTestディレクトリに作成します。
public class FragmentTest extends
ActivityInstrumentationTestCase2<MainActivity> {
private MainActivity testingActivity;
private TestFragment testFragment;
//...
}
この新しいクラス内でこのコンストラクタを呼び出します。
public FragmentTest() {
super(MainActivity.class);
}
最後に呼び出すsetUp()メソッドをオーバーライドします(アクティビティクラスに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();
}
たとえば次のようなテストメソッドを作成します。
public void testGameFragmentsTextViews() {
String empty = "";
TextView textView = (TextView)testFragment.getView().findViewById(R.id.myTextView);
assertTrue("Empty stuff",(textView.getText().equals(empty)));
}
テストを実行します。
メインアクティビティを、ActivityInstrumentationTestCase2に送信するテストアクティビティとして使用します。次に、フラグメントを起動するメインアクティビティのフラグメントマネージャを使用して、フラグメントを操作できます。これは、メインアクティビティで記述したロジックを使用してシナリオをテストし、より完全で完全なテストを提供するため、テストアクティビティを使用するよりも優れています。
例:
public class YourFragmentTest extends ActivityInstrumentationTestCase2<MainActivity> {
public YourFragmentTest(){
super(MainActivity.class);
}
}
現在、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'
( AndroidJUnit4とActivityTestRuleを単体テストクラスにインポートできないのはなぜですか? )を参照してください)