Android Studio'da nasıl test oluşturabilirim?


109

Intellij Idea'ya dayanan Android Studio'yu indirdim.

Testler nasıl oluşturulur?

Bir Test Modülü oluşturma seçeneği olduğunu fark ettim, ancak bu hiçbir şey yapmıyor, sadece src ile yeni bir proje oluşturun

Ayrıca, mevcut bir sınıf üzerinde birim testleri oluşturmaya izin veren CTRL + AlT + T kısayol tuşuna basmayı da denedim, ancak bunu mevcut projeye yerleştirmek istiyor gibi görünüyor. Tabii ki bu TDD'ye yardımcı olmuyor

Burada deneyimi olan var mı?


2
Ayrıca bir test projesi oluşturmaya çalıştım. Eclipse projesinde yaptığınız gibi Android komut satırı aracıyla yaparsanız, AndroidManifest.xml dosyasını bulamadığı için hata alırsınız. Görünüşe göre Google'ın Grundle projeleriyle başa çıkmak için Android araçlarını güncellemesi gerekiyor. Ancak, Android'de test etme konusunda yeniyim, bu yüzden size yardımcı olamıyorum = (
Kage,

Yanıtlar:


56

Bu cevap, Android testine yeni başlayan kişiler içindir. Testin nasıl çalıştığını görmenize yardımcı olacak iki basit örnek vereceğim. Önümüzdeki 10 dakika boyunca takip ederseniz, testlerinizi kendi uygulamanıza eklemeye hazır olacaksınız. Sanırım ne kadar kolay olduğuna şaşıracaksınız. Ben kesinlikle öyleydim.

Android Testine Giriş

Yapacağınız iki farklı test türü vardır.

  • Yerel birim testleri. Bunlar yerel olarak JVM'de (Java Sanal Makinesi) çalıştırılır. Yerel oldukları için hızlılar. Kodunuzun Android API'lerine değil, yalnızca Java'ya ihtiyaç duyan kısımlarını test etmek için bunları kullanabilirsiniz. (Bazen yerel olarak daha fazla şeyi test etmek için sahte bir API nesnesi yapabilirsiniz. Buna alay denir . Sahte Contextbir örnektir.)
  • Aletli testler. Bu testler gerçek bir cihazda veya emülatörde çalıştırılır. Bu onları yerel testlerden daha yavaş yapar. Ancak, tam Android API'ye sahip olduğunuz için daha esnektirler.

Yeni bir proje oluşturun ve aşağıdaki varsayılan klasörleri göreceksiniz.

görüntü açıklamasını buraya girin

Her şey zaten orada ve testlerinizi oluşturmanız için sizi bekliyor. Hepsi zaten kuruldu!

Yerel birim testleri nasıl oluşturulur?

ExampleUnitTestYukarıdaki resimde gösterilen dosyayı açın . Bunun gibi bir şeye benzemeli:

public class ExampleUnitTest {
    @Test
    public void addition_isCorrect() throws Exception {
        assertEquals(4, 2 + 2);
    }
}

Tüm testleri çalıştırmak için çift yeşil oka veya yalnızca birini çalıştırmak için tek yeşil oka basın. (Bu durumda tek bir test olduğundan ikisi de aynı şeyi yapar.)

görüntü açıklamasını buraya girin

Geçmelidir ( bu cevabı okurken 2 + 2hareketsiz 4kaldığı sürece ). Tebrikler, az önce ilk testinizi yaptınız!

Kendi testinizi yapmak

Kendi testimizi yazalım. Öncelikle bu sınıfı ana uygulama projenize ekleyin, böylece test edilecek bir şeyimiz olsun:

public class MyClass {
    public int add(int a, int b) {
        return a + b;
    }
}

Şimdi addition_isCorrect()test sınıfındaki yöntemi aşağıdaki kod gibi olacak şekilde değiştirin (veya yalnızca farklı bir ada sahip başka bir yöntem ekleyin):

public class ExampleUnitTest {
    @Test
    public void addition_isCorrect() throws Exception {
        MyClass myClass = new MyClass();
        int result = myClass.add(2, 2);
        int expected = 4;
        assertEquals(expected, result);
    }
}

Tekrar çalıştırın ve geçtiğini görmelisiniz. Tebrikler, kendi ilk testinizi oluşturdunuz! (Sanırım teknik olarak benimdi, ama, hey, yeterince yakın. Benim olan senin.)

Aletli testler nasıl oluşturulur

ExampleInstrumentedTestDosyayı açın . Bunun gibi bir şeye benzemeli:

@RunWith(AndroidJUnit4.class)
public class ExampleInstrumentedTest {
    @Test
    public void useAppContext() throws Exception {
        // Context of the app under test.
        Context appContext = InstrumentationRegistry.getTargetContext();

        assertEquals("com.example.myapp", appContext.getPackageName());
    }
}

Bu yeşil düğmelerden birine tekrar basın.

görüntü açıklamasını buraya girin

Bağlı gerçek bir cihazınız olduğu veya emülatörün kurulduğu sürece, onu başlatmalı ve uygulamanızı çalıştırmalıdır. Tebrikler, az önce aletli ilk testinizi yaptınız!

Kendi testinizi yapmak

Aletli testler , testleri çalıştırmak için Espresso kullanır. Uygulamanızı test ettirebileceğiniz kendi küçük robot kullanıcınız gibidir. Bir düğmeye basmak veya TextView özelliklerini okumak gibi bir şey yapmasını söyleyebilirsiniz.

Testin nasıl yapılacağına dair talimatları elle yazabilirsiniz, ancak daha yeni başladığımız için otomatik kayıt işlevini kullanalım . Bu çok basit.

Öncelikle kullanıcı arayüzünüze bir düğme ekleyin, böylece üzerinde çalışacak bir şeyimiz olsun. Bunu ben yaptım:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.myapp.MainActivity">

    <Button
        android:id="@+id/myButton"
        android:text="Click me"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

</android.support.constraint.ConstraintLayout> 

Ardından menüde Çalıştır> Espresso Testini Kaydet'e basın .

görüntü açıklamasını buraya girin

Başladıktan sonra, öykünücüdeki düğmeyi tıklayın ve ardından bitirmek için Kayıt iletişim kutusunda Tamam'ı seçin. Aşağıdaki test kodunu otomatik olarak oluşturmalıdır.

@LargeTest
@RunWith(AndroidJUnit4.class)
public class MainActivityTest {

    @Rule
    public ActivityTestRule<MainActivity> mActivityTestRule = new ActivityTestRule<>(MainActivity.class);

    @Test
    public void mainActivityTest() {
        ViewInteraction appCompatButton = onView(
                allOf(withId(R.id.myButton), withText("Click me"), isDisplayed()));
        appCompatButton.perform(click());
    }
}

Harika! İlk enstrümantasyonlu testi yarattınız! Bu çok kolaydı. Bunu gerçek bir test yapmak için muhtemelen bir iddia eklemelisiniz, ancak bunu kayıt cihazı için de yapmak oldukça kolaydır. Bu videoyu izleyinBiraz daha derine inmek için .

İlerideki çalışma

Önce videoları izler, sonra belgeleri okurdum. Hepsi oldukça faydalı. Son bağlantı, neyin test edileceğini seçerken düşünülmesi gereken bazı önemli şeyleri kapsayan bir dizi makaledir.


1
Harika cevap @ Suragch. Hızlı soru: Yerel birim test senaryosu için destek dosyalarını nereye koymalıyım? Çatlak /app, ancak testin temelinden tam yolu koymaktan memnuniyet duyarım, ancak Android Studio'da çalıştırırsam, testler root_'dan çalıştırılır , ancak Gradle komut satırından (veya CI) çalıştırırsam o zaman _root . (İdeal olarak, assetsher iki şekilde de çalıştırıldığında belirli klasörlere erişmek isterim ).
mm2001

@ mm2001, bu cevabı kendi kendime nasıl test edeceğimi öğrenmek için yazdım, bu yüzden senin kadar ileri gitmedim bile. Bunu benden önce çözersen, bir yorum bırakabilir misin?
Suragch

Bunu yararlı buldum: stackoverflow.com/a/42751502/19506 - bir klasör oluştur test/resourcesve dosyaları oraya koy diyor , örneğin test.txtbunlara erişim sağla getClass().getClassLoader().getResource("test.txt"). APK varlıklarına doğrudan erişmenin muhtemelen kötü bir fikir olduğuna karar verdim, bu nedenle, bir derleme adımında veya harici bir güncelleme sürecinde test etmek için dosyaları kopyalayarak bununla ilgileneceğim. Gradle'ın farklı versiyonları hakkında kalan bazı sorular var, ancak henüz bununla yüzleşmedim.
mm2001

36

Düzenleme: 0.1.8 itibariyle bu artık IDE'de desteklenmektedir . Lütfen aşağıdaki talimatları kullanmak yerine oradaki talimatları izleyin.

Android Gradle Eklentisi Kullanıcı Kılavuzu'nu takiben, yeni oluşturulan bir projede aşağıdaki adımları uygulayarak komut satırında çalışan testler alabildim (varsayılan 'com.example.myapplication' paketini kullandım):

  1. Testler için bir src / instrumentTest / java dizini ekleyin
  2. Com.example.myapplication.test paketine bir test sınıfı (ActivityTestCase genişletme) ekleyin
  3. Bir sanal cihaz başlatın
  4. Komut satırında (MyApplicationProject / MyApplication dizininde) '../gradlew connectedInstrumentTest' komutunu kullanın

Bu, testlerimi çalıştırdı ve test sonuçlarını MyApplicationProject / MyApplication / build / reports / instrumentTests / connected içine yerleştirdi. Android uygulamalarını test etme konusunda yeniyim, ancak iyi çalışıyor gibi görünüyor.

IDE'nin içinden, aynı test sınıfını denemek ve çalıştırmak mümkündür. İhtiyacın olacak

  1. Maven Central'ı bir depo olarak listelemek için build.gradle'ı güncelleyin
  2. Build.gradle'ı güncelleyin, bir instrumentTestCompile bağımlılığı olarak JUnit 3.8'i ekleyin, örneğin, instrumentTestCompile 'junit: junit: 3.8'
  3. 'Proje Yapısı'nda JUnit'i bağımlılık sıralamasında ilk olacak şekilde manuel olarak taşıyın

Ancak bu başarısız olur (testleri çalıştırırken kullanılan sınıf yolunda test çıktı dizini eksik). Ancak, anladığım kadarıyla Android'e özgü bir test çalıştırıcısının gerekli olduğuna bakılmaksızın bunun işe yarayacağından emin değilim.


20

Gradle.build dosyasını kullanmanızı öneririm .

  1. Testler için bir src / androidTest / java dizini ekleyin ( Chris'in açıklamaya başladığı gibi )

  2. Gradle.build dosyasını açın ve orada belirtin:

    android {
    
        compileSdkVersion rootProject.compileSdkVersion
        buildToolsVersion rootProject.buildToolsVersion
    
        sourceSets {
    
            androidTest {
                java.srcDirs = ['androidTest/java']
            }
        }
    }
  3. "Projeyi Gradle dosyasıyla Eşitle" ye basın (üst panelde). Şimdi "java" klasörünün ("androidTest" içinde) yeşil renkte olduğunu görmelisiniz.

  4. Artık orada herhangi bir test dosyası oluşturabilir ve bunları çalıştırabilirsiniz.


AndroidTest.setRoot ('instrumentTest')
IgorGanapolsky

3
Mevcut Android Studio sürümünde buna gerek yoktur, daha fazlası - enstrümanı adı olan her şeyi değiştirin androidTest
Yuriy Chernyshov

"EnstrümanTest" ve "androidTest" adları tamamen keyfidir. Bunlar sadece test projeniz için dizin isimleridir. Bir 'testler' dizini de oluşturabilirsiniz. Ayrıca SDK'nın test çerçevesindeki paket adı android.test.InstrumentationTestCase'dir. Kanonik olarak, 'enstrümantasyonun' kişinin testlerini adlandırmak için hala mantıklı olduğuna inanıyorum. Aşağıdaki kaynak koduna bakın: grepcode.com/file/repository.grepcode.com/java/ext/…
IgorGanapolsky

7
Lütfen buradaki belgeleri okuyun: tools.android.com/tech-docs/new-build-system . 0.9.0 sürümünden bu yana, enstrümanTest androidTest olarak yeniden adlandırıldı .
Yuriy Chernyshov

1
Olarak @IgorGanapolsky adlandırma klasörü androidTest keyfi DEĞİLDİR. Klasörün yeşile dönmesi için yapılması gerekir.
saatçi


10

Android Studio v.2.3.3

Test etmek istediğiniz kod içeriğini vurgulayın ve kısayol tuşunu kullanın: CTRL+ SHIFT+T

Kurulumunuzu tamamlamak için iletişim arayüzünü kullanın.

Test çerçevesinin, en iyi sonuçlar için proje paketi düzeninizi yansıtması beklenir, ancak doğru dizine ve yapı ayarlarına sahip olmanız koşuluyla, manuel olarak özel testler oluşturabilirsiniz.


7

Şu an itibariyle (stüdyo 0.61) uygun proje yapısını korumak yeterlidir. Tutulmadaki gibi ayrı bir test projesi oluşturmaya gerek yoktur (aşağıya bakınız).

Test yapısı


4

Android Studio gelişmeye devam ediyor, böylece yukarıdaki yanıtlar sonunda artık geçerli olmayacak. Android Studio 1.2.1.1'in güncel sürümü için, şu adreste test etme konusunda güzel bir eğitim var:

http://evgenii.com/blog/testing-activity-in-android-studio-tutorial-part-1/


2
Evet, AS gelişmeye devam ediyor, bu nedenle birinin son teknoloji hakkında bir makale oluşturması ve bunun geçerli olduğu sürüm numarasından asla bahsetmemesi oldukça aptalca. tek ipucu, en alttaki tarih.
Tom

3

Görünüşe göre en büyük değişikliklerden biri, Android Studio ile test uygulamasının uygulama projesine entegre edilmiş olmasıdır.

Bunun sizin özel sorununuza yardımcı olup olmadığından emin değilim, ancak bir Gradle projesiyle test yapma konusunda bir rehber buldum. Android Gradle kullanıcı Kılavuzu


3

Bulduğum en kolay yol, aşağıdaki blog yazımda basitleştirilmiş yol :

  1. Tüm birim testlerinizi yazacağınız bir klasör oluşturun (tercihen com.example.app.tests)
  2. Yeni bir test sınıfı oluşturun (tercihen NameOfClassTestedTests, yani BankAccountLoginActivityTests)
  3. Enstrümantasyon Test Durumunu Genişletin
  4. Birim testlerini yapılandırmayı başardığımızdan emin olmak için başarısız bir birim testi yazın
  5. Bir birim test yöntemi adının "test" kelimesiyle başlaması gerektiğini unutmayın (tercihen testTestedMethodNameExpectedResult () yani testBankAccountValidationFailedShouldLogout ())
  6. Projenizi birim testleri için yapılandırın:
  7. "Çalıştır ..." menüsünü açın ve "yapılandırmaları düzenle" yi tıklayın
  8. + Düğmesini tıklayın
  9. Android Testleri şablonunu seçin
  10. Çalıştırma yapılandırmanız için bir ad girin (tercihen 'Uygulama Adı Testleri')
  11. Modül birleşik giriş kutusunda uygulamanızı seçin
  12. "Hepsi Pakette" radyo düğmesini seçin (genel olarak bu seçeneği seçmek istersiniz çünkü tüm test sınıflarınızdaki tüm birim testlerini çalıştırır)
  13. 1. adımdaki test paketi adını girin (yani com.example.app.tests)
  14. Testlerinizi çalıştırmak istediğiniz cihazı seçin
  15. Yapılandırmayı uygulayın ve kaydedin
  16. Birim testleri çalıştırın (ve hata bekleyin):
  17. Çalıştır menüsünden yeni oluşturduğunuz Test yapılandırmasını seçin
  18. Çalıştır'a tıklayın ve sonuçları çıktı konsolunda okuyun

Kodunuzu daha okunabilir, bakımı yapılabilir ve iyi test edilmiş hale getirmek için iyi şanslar!


Soru enstrümantasyon testleri hakkındaydı! Bazı enstrümantasyon testi yazarken de zorluk çekiyorum. Stackoverflow.com/questions/35426990/…
Monica

2

Android Studio, önce bir geliştirici önizlemesi ve şimdi beta sürümünde olan hareketli bir hedef oldu. Projedeki Test sınıflarının yolu zaman içinde değişmiştir, ancak hangi AS sürümünü kullanıyor olursanız olun, yol .iml dosyanızda bildirilir. Şu anda, 0.8.3 sürümüyle, aşağıdakileri iç iml dosyasında bulacaksınız:

      <sourceFolder url="file://$MODULE_DIR$/src/androidTest/res" type="java-test-resource" />
  <sourceFolder url="file://$MODULE_DIR$/src/androidTest/resources" type="java-test-resource" />
  <sourceFolder url="file://$MODULE_DIR$/src/androidTest/assets" type="java-test-resource" />
  <sourceFolder url="file://$MODULE_DIR$/src/androidTest/aidl" isTestSource="true" />
  <sourceFolder url="file://$MODULE_DIR$/src/androidTest/java" isTestSource="true" />
  <sourceFolder url="file://$MODULE_DIR$/src/androidTest/groovy" isTestSource="true" />
  <sourceFolder url="file://$MODULE_DIR$/src/androidTest/jni" isTestSource="true" />
  <sourceFolder url="file://$MODULE_DIR$/src/androidTest/rs" isTestSource="true" />

.İml dosyası, test sınıflarınızı nereye yerleştireceğinizi söyler.



0

Aşağıdaki kütüphaneyi gradle dosyasının içine ekleyin

 androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })

AndroidTest dizini içinde HomeActivityTest sınıfı oluşturun ve testi çalıştırmadan önce, dize kaynak dosyası içine flurry_api_key ve sender_id dizesini ekleyin ve başarısızlık ve başarı durumu için değeri değiştirin.

@RunWith(AndroidJUnit4.class)
public class HomeActivityTest
{
    private static final String SENDER_ID = "abc";
    private static final String RELEASE_FLURRY_API_KEY = "xyz";

    @Test
    public void gcmRegistrationId_isCorrect() throws Exception
    {
        // Context of the app under test.
        Context appContext = InstrumentationRegistry.getTargetContext();

        Assert.assertEquals(SENDER_ID, appContext.getString(R.string.sender_id));
    }

    @Test
    public void flurryApiKey_isCorrect() throws Exception
    {
        // Context of the app under test.
        Context appContext = InstrumentationRegistry.getTargetContext();

        Assert.assertEquals(RELEASE_FLURRY_API_KEY, appContext.getString(R.string.flurry_api_key));
    }
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.