0

したがって、TextView、EditText、Buttonの3つの要素を持つこのテストアクティビティがあります。ユーザーがボタンをクリックすると、ActivityはテキストをEditTextからTextViewのテキストに変換します。

質問は:そのような活動のユニットテストをどのように書くのですか?

私の問題:あるスレッドのボタンを「クリック」(.performClick)する必要がありますが、別のスレッドでは非同期で待機しますが、「test」プレフィックスで始まるすべてのテストを実行し、testを「」とマークするため、単体テストのロジックが壊れます。失敗したアサーションがなかった場合は「OK」。

ユニットテストのコード:

public class ProjectToTestActivityTest extends ActivityInstrumentationTestCase2<ProjectToTestActivity> {

    private TextView resultView;
    private EditText editInput;
    private Button   sortButton;

    public ProjectToTestActivityTest(String pkg, Class activityClass) {
        super("com.projet.to.test", ProjectToTestActivity.class);
    }

public void onTextChanged(String str)
{
    Assert.assertTrue(str.equalsIgnoreCase("1234567890"));
}


       @Override  
       protected void setUp() throws Exception {  
           super.setUp();  

           Activity activity = getActivity();  
           resultView = (TextView) activity.findViewById(R.id.result);
           editInput = (EditText) activity.findViewById(R.id.editInput);
           sortButton = (Button) activity.findViewById(R.id.sortButton);

       resultView.addTextChangedListener(new TextWatcher() {

        public void afterTextChanged(Editable arg0) {
            onTextChanged(arg0.toString());
        }
           }
       }  

       protected void testSequenceInputAndSorting()
       {
           editInput.setText("1234567890");
           sortButton.performClick();   
       }
}
4

1 に答える 1

1

アプリケーションプロジェクトのアクティビティにビジネスロジックが適切に実装されていると仮定します。つまり、ボタンがクリックされたときに、テキストをEditTextからTextViewにコピーします。

そのようなアクティビティの単体テストを作成するにはどうすればよいですか?

public void testButtonClick() {

  // TextView is supposed to be empty initially.
  assertEquals("text should be empty", "", resultView.getText());

  // simulate a button click, which copy text from EditText to TextView.
  activity.runOnUiThread(new Runnable() {
    public void run() {
      sortButton.performClick();
    }
  });

  // wait some seconds so that you can see the change on emulator/device.
  try {
    Thread.sleep(3000);
  } catch (InterruptedException e) {
    e.printStackTrace();
  }

  // TextView is supposed to be "foo" rather than empty now.
  assertEquals("text should be foo", "foo", resultView.getText());
}

アップデート:

メインアプリケーションコードでスレッドを使用しない場合、メインアプリケーションにはUIスレッドのみがあり、すべてのUIイベント(ボタンのクリック、textViewの更新など)はUIスレッドで継続的に処理され、この継続的なUIはほとんどありません。イベントは数秒以上スタック/遅延します。それでもよくわからない場合は、waitForIdleSync()を使用して、メインアプリケーションのUIスレッドで処理するUIイベントがなくなるまでテストアプリケーションを待機させます。

getInstrumentation().waitForIdleSync();
assertEquals("text should be foo", "foo", resultView.getText());

ただし、getInstrumentation().waitForIdleSync();メインアプリケーションコードで生成されたスレッドを待機しません。たとえば、ボタンをクリックすると、AsyncTaskプロセスの時間のかかるジョブが開始され、終了後(たとえば、3秒)にTextViewが更新されます。この場合は、Thread.sleep();アプリケーションを停止して待機させるために使用する必要があります。コード例については、このリンクの回答を確認してください。

于 2012-07-25T04:59:40.497 に答える