AndroidのUI自動化テスト(Espresso初認識)

5924 ワード

総ディレクトリ:Espresso開始から...
最近、仕事で自動化テストという見慣れない分野に接触し始めたので、自動化テストの使用を理解するために、自動化テストに関するブログを調べ始めました.この過程で、原則に合っているので、だんだん興味を持ってきました.
手を出さないことができる人は決して手を出さないで、“怠け者”は終わりました.
Android自動化テストフレームワークには、Instrumentation、Robotium、Uiautomator、Appium、Selendroid、Espressoの各テストフレームワークが独自の得意分野でそれぞれ特徴と適用性があり、対応する自動化テストタスクをうまく遂行でき、実際の応用では自分の実際の状況に応じて選択できることは言うまでもありません.
Espresso
本題に戻りますが、本文は主にGoogleのオープンソーステストフレームワークEspressoを紹介します.他のフレームワークに比べて、それはもっと簡潔で柔軟で、上手で難易度が低く、私のようなテスト開発の基礎のない初心者には友好的です.ただし,EspressoはInstrumentationベースであるため,app間で単独で操作することはできない点に注意が必要である.この問題はAndroidのトップであるGoogleも当然考えている.Googleが発表したもう一つの自動化テストフレームワークUIAutomatorは、app間テストの問題を簡単に解決することができます.さらに、UIAutomator 2.0のリリース後、Android Developers blog postは「最も重要なのは、UIAutomatorが現在Android Instrumentationに基づいていることだ...」と述べた.したがって,Instrumentation test runnerを用いてUIAutomatorとEspressoの2つのフレームワークを実行することができ,両者は実際の開発テストで併用することができる.
特長
Synchronization capabilities Each time your test invokes onView(), Espresso waits to perform the corresponding UI action or assertion until the following synchronization conditions are met:
  • The message queue is empty.
  • There are no instances of AsyncTask currently executing a task.
  • All developer-defined idling resources are idle. By performing these checks, Espresso substantially increases the likelihood that only one UI action or assertion can occur at any given time. This capability gives you more reliable and dependable test results.

  • Googleの公式ドキュメントの紹介では、上記の説明が最も目立つ位置に置かれています.簡単な理解:Espressoはメインスレッドが空いているときにテストコード(絶対ではなく、後述)を実行し、できるだけ任意の時間内に一意の操作しか行わない.
    環境設定
    Googleの実の息子として、面倒を見るのは避けられない.バージョンの更新に関心を持っている友达はとっくに知っていると信じている.Android Studioで2.2バージョン以降、新しいプロジェクトではAndroid StudioがEspressoの依存をデフォルトで追加します.
    dependencies {
        androidTestCompile('com.android.support.test.espresso:espresso-core:3.0.1', {
            exclude group: 'com.android.support', module: 'support-annotations'
            //       support-annotations,        ,           
        })
    }
    

    デフォルトで統合されたEspressoパッケージespresso-coreとその依存パッケージは、一般的なUIテストを完了するのに十分です.また、Espressoには、特別なテストシーンを完了するための拡張パッケージもあります.
  • espresso-web:WebViewテストのサポートリソースを含む
  • espresso-idling-resource:Espressoがバックグラウンドジョブと同期するメカニズム.(coreの依存に含まれている)
  • espresso-contrib:外部の貢献DatePicker、RecyclerViewおよびDrawer行動、交通便利検査、CountingIdlingResourceを含む.
  • espresso-intents:密封試験のための拡張検証とルート意図.
  • espresso-remote-Espresso:マルチプロセッシング機能の場所.

  • 自動化テストを本格的に開始する前に、アニメーションの切り替えによるコントロールの取得に失敗する問題の一部を回避し、テスト時間を大幅に短縮するために、デバイスのシステムアニメーションをオフにする必要があります.「設定」>「開発者オプション」では、次の設定を無効にします.
  • ウィンドウアニメーションスケール
  • 遷移アニメーションスケール
  • アニメーションプログラムの時間スケール
  • 使用方法
    Espressoの主な使い方はとても簡単です
    onView(ViewMatcher)
        .perform(ViewAction)
        .check(ViewAssertion);
    

    3つの部分に分けて理解できます.
  • コントロールルックアップ:Espressoは、現在表示されているインターフェースを、ルックアップ条件(ルックアップ条件として理解される)に適合するコントロールが検出されるまで、順にView Matcher(ルックアップ条件として理解される)を介して比較します.
  • コントロール操作:onViewが提供するコントロールに対してView Action操作を行い、UI操作プロセスに適合するために、できるだけEspressoが提供するView Actionを使用して、Viewを取得して直接コントロールに対して関連操作を行うことを避ける.
  • 結果検証:コントロールの現在の状態を検証します.ここでの検証は、特定のコントロールに対して行われるに違いない.

  • もちろん、「コントロール3部作」だけでは、自動化されたテスト操作全体を完了するには十分ではありません.完全な例を見てみましょう.自動化テストはapp実行に依存する必要があるため、ここでは例としてDemoを書き、レイアウトが簡単でコードを貼らない
    public class MainActivity extends AppCompatActivity implements View.OnClickListener{
        Button button;
        TextView textView;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            button = (Button)findViewById(R.id.btnTest);
            textView = (TextView)findViewById(R.id.tv_content);
            button.setOnClickListener(this);
        }
        @Override
        public void onClick(View v) {
            switch (v.getId()){
                case R.id.btnTest:
                    textView.setVisibility(View.VISIBLE);
                    textView.setText("hello espresso!");
                    break;
                default:
                    break;
            }
        }
    }
    

    インタフェースのデフォルトにはbuttonとtextViewの2つのコントロールがあり、textViewのデフォルトはgoneであり、textViewには「内容の変更」というテキストが付属しています.buttonをクリックするとtextViewの表示状態がvisibleに変更され、textViewに「hello espresso!」というテキストが添付されます.インタフェースの具体的な状況に応じて、上述したように自動化テストコードの作成を行います.
    @RunWith(AndroidJUnit4.class)
    public class MainActivityTest {
        @Rule
        public ActivityTestRule rule = new ActivityTestRule<>(MainActivity.class);
        @Before
        public void BeforeTest(){
            //TODO: @Before        @Test     ,             
        }
        @Test
        public void Test(){
            onView(withId(R.id.tv_content))
                    .check(matches(not(isDisplayed())));
            onView(withId(R.id.btn01))
                    .check(matches(withText("    ")))
                    .perform(click());
            onView(withId(R.id.tv_content))
                    .check(matches(withText("hello espresso!")))
                    .check(matches(isDisplayed()));
        }
        @After
        public void AfterTest(){
            //TODO: @After        @Test     ,               
        }
    }
    

    我々の従来のコード作成に比べて,主な違いは@RunWith@Rule@Before@Test@Afterである.
  • @RunWithテストはRunnerによって実行されます.ここで、テスト例は特定のAndroid JUnit 4を選択して実行します.
  • @Rule現在のテスト開始のActivity
  • を設定する
  • @Before各テストメソッドの実行前に1回呼び出され、通常はテストの事前条件の設定が行われます.
  • @Testは、この方法が試験方法であることを示している.テスト方法はpublic voidで、異常を投げ出すことができます.
  • @Afterは@Beforeに対応しており、各テストメソッドの実行後に1回呼び出され、通常はテスト環境を初期状態に戻すために使用されます.

  • に注意
    1、Espressoはできるだけユーザーの実際の使用をシミュレートし、Espressoに付属するフレームワーク関数を選択し、Viewのメソッドを呼び出さない.2、Activityにまたがらないように、testごとに同じページで完了します.3、できるだけtestの原子化を保証し、いずれのテストも独立している.4、同じテストクラスの隣の二つの@Testは論理関係がない.5、あるEspresso関数を初めて使用すると、エラーが発生する可能性があり、Alt+Enterにプロンプトがないため、1行のコードを書き終わってからAlt+Enter操作を試してみることができます.6、自動化テストに失敗した後、エラーの説明と現在のインタフェースの内容紹介に注意する