monkeyrunner

Eski monkeyrunner aracı, Android cihazı veya emülatörü Android kodu dışından kontrol eden programlar yazmak için bir API sağlıyor.

monkeyrunner aracı, uygulamaları ve cihazları temel olarak işlevsel/çerçeve düzeyinde test etmek ve birim test paketlerini çalıştırmak için tasarlanmıştır ancak başka amaçlar için de kullanılabilir. monkeyrunner ile bir Android uygulaması veya test paketi yükleyen, bu uygulamayı çalıştıran, pakete tuş vuruşları gönderen, kullanıcı arayüzünün ekran görüntülerini alan ve ekran görüntülerini iş istasyonunda depolayan bir Python programı yazabilirsiniz.

Dikkat: monkeyrunner API'ye bakım yapılmadı. Bunun yerine, Uygulama Tarayıcısı aracını veya Kullanıcı Arayüzü Otomatikleştirici test çerçevesini kullanmanızı öneririz.

monkeyrunner aracı, monkey aracı olarak da bilinen UI/Application Exerciser Monkey ile ilişkili değildir. monkey aracı, doğrudan cihaz veya emülatörde bir adb kabuğunda çalışır ve kullanıcı ve sistem etkinlikleri için sözde rastgele akış oluşturur. Buna karşılık monkeyrunner aracı, bir API'den belirli komutlar ve etkinlikler göndererek bir iş istasyonundaki cihazları ve emülatörleri kontrol eder.

monkeyrunner aracı, Android testi için şu özellikleri sağlar:

  • Çoklu cihaz kontrolü: monkeyrunner API, birden fazla cihaz ya da emülatörde bir ya da daha fazla test paketi uygulayabilir. Fiziksel olarak tüm cihazları bağlayabilir veya tüm emülatörleri (ya da her ikisini) aynı anda başlatabilir, her birine sırayla programlı bir şekilde bağlanabilir ve daha sonra bir veya daha fazla test çalıştırabilirsiniz. Ayrıca, bir emülatör yapılandırmasını programatik olarak başlatabilir, bir veya daha fazla test çalıştırabilir ve ardından emülatörü kapatabilirsiniz.
  • İşlevsel test: monkeyrunner, bir Android uygulaması için otomatik başlangıç-bitiş testi çalıştırabilir. Giriş değerlerini tuş vuruşları veya dokunma etkinlikleriyle sağlar ve sonuçları ekran görüntüleri olarak görüntüleyebilirsiniz.
  • Regresyon testi: monkeyrunner, bir uygulamayı çalıştırıp çıkış ekran görüntülerini doğru olduğu bilinen bir grup ekran görüntüsüyle karşılaştırarak uygulama kararlılığını test edebilir.
  • Genişletilebilir otomasyon: monkeyrunner bir API araç seti olduğundan, Android cihazları kontrol etmek için Python tabanlı modül ve programlardan oluşan bir sistem geliştirebilirsiniz. monkeyrunner API'nin kendisini kullanmanın yanı sıra, Android Debug Bridge gibi Android araçlarını çağırmak için standart Python os ve subprocess modüllerini de kullanabilirsiniz.

    monkeyrunner API'ye kendi sınıflarınızı da ekleyebilirsiniz. Bu durum, Monkeyrunner'ı eklentilerle genişletme bölümünde daha ayrıntılı olarak açıklanmıştır.

monkeyrunner aracı, Java programlama dilini kullanan bir Python uygulaması olan Jython'ı kullanır. Jython, monkeyrunner API'nin Android çerçevesiyle kolayca etkileşim kurmasını sağlar. Jython ile API'nin sabitlerine, sınıflarına ve yöntemlerine erişmek için Python söz dizimini kullanabilirsiniz.

Basit bir monkeyrunner programı

Aşağıda, cihaza bağlanarak MonkeyDevice nesnesi oluşturan basit bir monkeyrunner programı verilmiştir. Program, MonkeyDevice nesnesini kullanarak bir Android uygulama paketi yükler, etkinliklerinden birini çalıştırır ve önemli etkinlikleri etkinliğe gönderir. Program, sonucun ekran görüntüsünü alarak bir MonkeyImage nesnesi oluşturur. Program, bu nesneden ekran görüntüsünü içeren bir PNG dosyası yazar.

# Imports the monkeyrunner modules used by this program.
from com.android.monkeyrunner import MonkeyRunner, MonkeyDevice

# Connects to the current device, returning a MonkeyDevice object.
device = MonkeyRunner.waitForConnection()

# Installs the Android package. Notice that this method returns a boolean, so you can test
# whether the installation worked.
device.installPackage('myproject/bin/MyApplication.apk')

# Sets a variable with the package's internal name.
package = 'com.example.android.myapplication'

# Sets a variable with the name of an Activity in the package.
activity = 'com.example.android.myapplication.MainActivity'

# Sets the name of the component to start.
runComponent = package + '/' + activity

# Runs the component.
device.startActivity(component=runComponent)

# Presses the Menu button.
device.press('KEYCODE_MENU', MonkeyDevice.DOWN_AND_UP)

# Takes a screenshot.
result = device.takeSnapshot()

# Writes the screenshot to a file.
result.writeToFile('myproject/shot1.png','png')

Monkeyrunner API'si

monkeyrunner API, com.android.monkeyrunner paketinde üç modülde bulunur:

  • MonkeyRunner: monkeyrunner programları için yardımcı yöntemler sınıfı. Bu sınıf, monkeyrunner uygulamasını bir cihaza veya emülatöre bağlamak için bir yöntem sağlar. Ayrıca, monkeyrunner programı için kullanıcı arayüzü oluşturma ve yerleşik yardımı görüntüleme yöntemleri de sağlar.
  • MonkeyDevice: Bir cihazı veya emülatörü temsil eder. Bu sınıfta paket yükleme ve kaldırma, Etkinlik başlatma ve bir uygulamaya klavye ya da dokunma etkinlikleri gönderme yöntemleri sağlanır. Bu sınıfı test paketlerini çalıştırmak için de kullanırsınız.
  • MonkeyImage: Ekran görüntüsü alma işlemini temsil eder. Bu sınıf; ekranları yakalama, bit eşlem resimlerini çeşitli biçimlere dönüştürme, iki MonkeyImage nesnesini karşılaştırma ve dosyaya resim yazma yöntemleri sağlar.

Python programında, her sınıfa Python modülü olarak erişirsiniz. monkeyrunner aracı bu modülleri otomatik olarak içe aktarmaz. Bir modülü içe aktarmak için Python from ifadesini kullanın:

from com.android.monkeyrunner import <module>

Burada <module>, içe aktarmak istediğiniz sınıf adıdır. Modül adlarını virgülle ayırarak aynı from ifadesindeki birden fazla modülü içe aktarabilirsiniz.

Monkeyrunner'ı koş

monkeyrunner programlarını bir dosyadan veya etkileşimli bir oturumda monkeyrunner ifadeleri girerek çalıştırabilirsiniz. SDK dizininizin tools/ alt dizininde bulunan monkeyrunner komutunu çağırarak her ikisini de yapabilirsiniz. Bağımsız değişken olarak bir dosya adı sağlarsanız monkeyrunner komutu, dosyanın içeriğini Python programı olarak çalıştırır; aksi takdirde, etkileşimli bir oturum başlatır.

monkeyrunner komutunun söz dizimi aşağıdaki gibidir:

monkeyrunner -plugin <plugin_jar> <program_filename> <program_options>

Tablo 1'de monkeyrunner işaretleri ve bağımsız değişkenler açıklanmaktadır.

Tablo 1. monkeyrunner işaret ve bağımsız değişken

Bağımsız değişken Açıklama
-plugin <plugin_jar> (İsteğe bağlı) monkeyrunner için eklenti içeren bir JAR dosyası belirtir. monkeyrunner eklentileri hakkında daha fazla bilgi edinmek için Monkeyrunner'ı eklentilerle genişletme bölümüne bakın. Birden fazla dosya belirtmek için bağımsız değişkeni birden çok kez ekleyin.
<program_filename> Bu bağımsız değişkeni sağlarsanız monkeyrunner komutu, dosyanın içeriğini bir Python programı olarak çalıştırır. Aksi takdirde komut, etkileşimli bir oturum başlatır.
<program_options> (İsteğe bağlı) <program_file>. bölgesindeki program için işaretler ve bağımsız değişkenler

monkeyrunner yerleşik yardımı

Şu komutu çalıştırarak monkeyrunner için API referansı oluşturabilirsiniz:

monkeyrunner help.py <format> <outfile>

Bağımsız değişkenler şunlardır:

  • <format>, düz metin çıkışı için text veya HTML çıkışı için html şeklindedir.
  • <outfile>, çıkış dosyası için yol nitelikli bir addır.

Monkeyrunner'ı eklentilerle genişletin

monkeyrunner API'yi, Java'da yazdığınız sınıflarla genişletebilir ve bir veya daha fazla JAR dosyasına ekleyebilirsiniz. Bu özelliği, monkeyrunner API'yi kendi sınıflarınızla genişletmek veya mevcut sınıfları genişletmek için kullanabilirsiniz. Bu özelliği monkeyrunner ortamını başlatmak için de kullanabilirsiniz.

monkeyrunner işlevine eklenti sağlamak için monkeyrunner komutunu tablo 1'de açıklanan -plugin <plugin_jar> bağımsız değişkeniyle çağırın.

Eklenti kodunuzda, com.android.monkeyrunner içinde ana monkeyrunner sınıflarını MonkeyDevice, MonkeyImage ve MonkeyRunner içe aktarabilir ve genişletebilirsiniz (monkeyrunner API ile ilgili bölüme bakın).

Eklentilerin Android SDK'ya erişmenize izin vermediğini unutmayın. com.android.app gibi paketleri içe aktaramazsınız. Bunun nedeni monkeyrunner ürününün, çerçeve API'lerinin düzeyinin altındaki cihazla veya emülatörle etkileşime geçmesidir.

Eklenti başlangıç sınıfı

Bir eklentinin JAR dosyası, komut dosyası işlemeye başlamadan önce örneklenen bir sınıf belirtebilir. Bu sınıfı belirtmek için MonkeyRunnerStartupRunner anahtarını JAR dosyasının manifest dosyasına ekleyin. Değer için başlangıçta çalıştırılacak sınıfın adını kullanın. Aşağıdaki snippet'te bu işlemi ant derleme komut dosyası içinde nasıl yapacağınız gösterilmektedir:

<jar jarfile="myplugin" basedir="${build.dir}">
<manifest>
<attribute name="MonkeyRunnerStartupRunner" value="com.myapp.myplugin"/>
</manifest>
</jar>


monkeyrunner aracının çalışma zamanı ortamına erişmek için başlangıç sınıfı, com.google.common.base.Predicate<PythonInterpreter> yöntemini uygulayabilir. Örneğin, bu sınıf varsayılan ad alanında bazı değişkenler oluşturur:

Kotlin

package com.android.example

import com.google.common.base.Predicate
import org.python.util.PythonInterpreter

class Main: Predicate<PythonInterpreter> {

    override fun apply(anInterpreter: PythonInterpreter): Boolean {
        /*
         * Examples of creating and initializing variables in the monkeyrunner environment's
         * namespace. During execution, the monkeyrunner program can refer to the variables
         * "newtest" and "use_emulator"
         *
         */
        anInterpreter.set("newtest", "enabled")
        anInterpreter.set("use_emulator", 1)
        return true
    }
}

Java

package com.android.example;

import com.google.common.base.Predicate;
import org.python.util.PythonInterpreter;

public class Main implements Predicate<PythonInterpreter> {
    @Override
    public boolean apply(PythonInterpreter anInterpreter) {

        /*
        * Examples of creating and initializing variables in the monkeyrunner environment's
        * namespace. During execution, the monkeyrunner program can refer to the variables "newtest"
        * and "use_emulator"
        *
        */
        anInterpreter.set("newtest", "enabled");
        anInterpreter.set("use_emulator", 1);

        return true;
    }
}