SORU
18 Kasım 2009, ÇARŞAMBA


Nasıl birden fazla Faaliyetleri arasında bir Android uygulaması test musun?

Karmaşık bir Android uygulaması birçok ekranlar ve iş akışları birçok etkinlik yayılmış oluşan inşa ediyoruz. Bizim iş akışları benzer ne görürseniz, bir Bankanın ATM makinesi, örneğin, Activity Giriş geçişler için bir ana menü Activity ya da geçiş için diğer faaliyetleri temel kullanıcı seçenekleri.

Bu yüzden birçok iş var bu yana, uçtan uca bir iş akışı test edebiliriz yani birden fazla faaliyetleri kapsayan otomatik testler oluşturmak için ihtiyacımız var. Örneğin, kullanarak ATM örnek, biz girmek istiyorsanız geçerli PIN doğrula gönderir bize Ana Menü, seç geri nakit, emin olun biz üzerinde nakit çekme, ekran, vb., vb., ve sonunda kendimizi ana menüde arka bulmak ya da "". oturum

Yaptığımız oyuncağı testi API gelecek olan Android (örneğin ActivityInstrumentationTestCase2) ve aynı zamanda Positron ama ne gibi yetenekli test ötesinde sınırları bir tek Activity ve süre bulabiliriz biraz yardımcı bu araçlar için birim testi, vermiyorlar ihtiyaçlarımızı karşılamak için test senaryoları kesen birden fazla Faaliyetleri.

Çerçeve, komut dosyası, GUI kaydediciler/oynatma, vb bir xUnit açığız. ve herhangi bir tavsiye seviniriz.

CEVAP
28 Kasım 2009, CUMARTESİ


Biraz kendi kelle soruma cevap hakkında garip hissediyorum, ama burada...

Yüksek ve düşük bu konuda aradım ve cevap her yerde yayınlanan yok inanamıyorum. Çok yakın geldim. Kesinlikle artık faaliyetlerini kapsayan testler olabilir, ama ben uygulama testleri her zaman güvenilir geçemiyor bazı zamanlama sorunları var gibi görünüyor. Bu birden çok etkinliği başarıyla karşısındaki testleri bildiğim tek örnektir. Umarım ekstraksiyonu ve benim bir tünel hataları getirmemiştir. Bu giriş bir faaliyet içine bir kullanıcı adı ve parola yazın ve sonra da uygun bir karşılama mesajı farklı gösterilir gözlemlemek basit bir test "hareket:." hoş geldiniz

package com.mycompany;

import android.app.*;
import android.content.*;
import android.test.*;
import android.test.suitebuilder.annotation.*;
import android.util.*;
import android.view.*;
import android.widget.*;

import static org.hamcrest.core.Is.*;
import static org.hamcrest.core.IsNull.*;
import static org.hamcrest.core.IsInstanceOf.instanceOf;
import static org.junit.Assert.*;
import static com.mycompany.R.id.*;

public class LoginTests extends InstrumentationTestCase {

   @MediumTest
   public void testAValidUserCanLogIn() {

      Instrumentation instrumentation = getInstrumentation();

      // Register we are interested in the authentication activiry...
      Instrumentation.ActivityMonitor monitor = instrumentation.addMonitor(AuthenticateActivity.class.getName(), null, false);

      // Start the authentication activity as the first activity...
      Intent intent = new Intent(Intent.ACTION_MAIN);
      intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
      intent.setClassName(instrumentation.getTargetContext(), AuthenticateActivity.class.getName());
      instrumentation.startActivitySync(intent);

      // Wait for it to start...
      Activity currentActivity = getInstrumentation().waitForMonitorWithTimeout(monitor, 5);
      assertThat(currentActivity, is(notNullValue()));

      // Type into the username field...
      View currentView = currentActivity.findViewById(username_field);
      assertThat(currentView, is(notNullValue()));
      assertThat(currentView, instanceOf(EditText.class));
      TouchUtils.clickView(this, currentView);
      instrumentation.sendStringSync("MyUsername");

      // Type into the password field...
      currentView = currentActivity.findViewById(password_field);
      assertThat(currentView, is(notNullValue()));
      assertThat(currentView, instanceOf(EditText.class));
      TouchUtils.clickView(this, currentView);
      instrumentation.sendStringSync("MyPassword");

      // Register we are interested in the welcome activity...
      // this has to be done before we do something that will send us to that
      // activity...
      instrumentation.removeMonitor(monitor);
      monitor = instrumentation.addMonitor(WelcomeActivity.class.getName(), null, false);

      // Click the login button...
      currentView = currentActivity.findViewById(login_button;
      assertThat(currentView, is(notNullValue()));
      assertThat(currentView, instanceOf(Button.class));
      TouchUtils.clickView(this, currentView);

      // Wait for the welcome page to start...
      currentActivity = getInstrumentation().waitForMonitorWithTimeout(monitor, 5);
      assertThat(currentActivity, is(notNullValue()));

      // Make sure we are logged in...
      currentView = currentActivity.findViewById(welcome_message);
      assertThat(currentView, is(notNullValue()));
      assertThat(currentView, instanceOf(TextView.class));
      assertThat(((TextView)currentView).getText().toString(), is("Welcome, MyUsername!"));
   }
}

Bu kod belli ki çok okunabilir değil. Aslında böyle şeyler söyleyeceğim şudur ki İngilizce gibi bir API ile basit bir kütüphane içine sürükleyin:

type("myUsername").intoThe(username_field);
click(login_button);

Yaklaşık 4 faaliyetler derinliğe kadar test edilmiş ve yaklaşım dediğim gibi işe yarar ama memnun muyum, arada bir zamanlama sorunu var gibi gözüküyor tamamen anladım değil. Hala test faaliyetleri üzerinde herhangi bir diğer yolu işitme ilgileniyorum.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Dogbert files

    Dogbert file

    12 Ocak 2012
  • FrameCityJackal

    FrameCityJac

    4 Aralık 2010
  • Jeremy Stark

    Jeremy Stark

    23 Mayıs 2010