monkeyrunner

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

monkeyrunner aracı öncelikle uygulamaları ve cihazları işlevsel/çerçeve düzeyinde test etmek ve birim test paketlerini çalıştırmak için tasarlanmıştır ancak başka amaçlarla da kullanabilirsiniz. monkeyrunner ile bir Android uygulamasını veya test paketini yükleyen, çalıştıran, tuş vuruşlarını 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'si desteklenmemektedir. Bunun yerine UI Automator test çerçevesini kullanmanızı öneririz.

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

monkeyrunner aracı, Android testi için aşağıdaki özellikleri sunar:

  • Birden fazla cihazı kontrol etme: monkeyrunner API, birden fazla cihaz veya emülatörde bir veya daha fazla test paketi uygulayabilir. Tüm cihazları fiziksel olarak bağlayabilir veya tüm emülatörleri (ya da her ikisini) aynı anda başlatabilir, her birine sırayla programatik olarak bağlanabilir ve ardından bir veya daha fazla test çalıştırabilirsiniz. Ayrıca bir emülatör yapılandırma programı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ının baştan sona otomatik testini çalıştırabilir. Tuş vuruşları veya dokunma etkinlikleriyle giriş değerleri sağlarsınız ve sonuçları ekran görüntüleri olarak görürsünüz.
  • Regresyon testi: monkeyrunner, bir uygulamayı çalıştırıp çıkış ekran görüntülerini doğru olduğu bilinen bir ekran görüntüsü grubuyla 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üllerden ve programlardan oluşan bir sistem geliştirebilirsiniz. monkeyrunner API'yi kullanmanın yanı sıra, Android araçlarını (ör. Android Debug Bridge) ç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 konu, Extend monkeyrunner with plugins (monkeyrunner'ı eklentilerle genişletme) bölümünde daha ayrıntılı olarak açıklanmaktadır.

monkeyrunner aracı, Java programlama dilini kullanan bir Python uygulaması olan Jython'u 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, bir cihaza bağlanarak monkeyrunner nesnesi oluşturan basit bir MonkeyDevice programı verilmiştir. Program, MonkeyDevice nesnesini kullanarak bir Android uygulama paketi yükler, etkinliklerinden birini çalıştırır ve etkinliğe önemli etkinlikler gönderir. Program daha sonra 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 paketindeki üç modülde yer alır:

  • MonkeyRunner: monkeyrunner programları için bir yardımcı yöntem sınıfı. Bu sınıf, monkeyrunner iş ortağı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üzleri oluşturma ve yerleşik yardımı görüntüleme yöntemleri de sunar.
  • MonkeyDevice: Bir cihazı veya emülatörü temsil eder. Bu sınıf, paketleri yükleme ve kaldırma, Etkinlik başlatma ve bir uygulamaya klavye veya dokunma etkinlikleri gönderme yöntemleri sağlar. Test paketlerini çalıştırmak için de bu sınıfı kullanırsınız.
  • MonkeyImage: Ekran görüntüsü resmini ifade eder. Bu sınıf; ekran yakalama, bitmap resimleri ç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>

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

monkeyrunner'ı çalıştırma

monkeyrunner programlarını bir dosyadan veya etkileşimli bir oturumda monkeyrunner ifadelerini girerek çalıştırabilirsiniz. Bu işlemleri, SDK dizininizin tools/ alt dizininde bulunan monkeyrunner komutunu çağırarak yapabilirsiniz. Dosya adını bağımsız değişken olarak 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 şöyledir:

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şaretler ve bağımsız değişkenler

Bağımsız değişken Açıklama
-plugin <plugin_jar> (İsteğe bağlı) monkeyrunner için bir eklenti içeren JAR dosyasını belirtir. monkeyrunnerEklentiler hakkında daha fazla bilgi edinmek için Eklentilerle monkeyrunner'ı 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 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>. içindeki program için işaretler ve bağımsız değişkenler

monkeyrunner yerleşik yardım

Aşağıdaki komutu çalıştırarak monkeyrunner için bir API referansı oluşturabilirsiniz:

monkeyrunner help.py <format> <outfile>

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

  • <format>, düz metin çıkışı için text, HTML çıkışı için ise html olur.
  • <outfile>, çıkış dosyasının yolunu içeren adıdır.

Eklentilerle monkeyrunner'ı genişletme

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

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

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

Eklentilerin Android SDK'sına erişmenizi sağlamadığını unutmayın. com.android.app gibi paketleri içe aktaramazsınız. Bunun nedeni, monkeyrunner'nın çerçeve API'lerinin altında kalan cihaz veya emülatörle etkileşimde bulunmasıdır.

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

Bir eklentinin JAR dosyası, komut dosyası işleme başlamadan önce oluşturulan bir sınıfı belirtebilir. Bu sınıfı belirtmek için anahtarı MonkeyRunnerStartupRunner JAR dosyasının manifestine 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şlemin ant derleme komut dosyasında nasıl yapılacağı gösterilmektedir:

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

Başlangıç sınıfı, monkeyrunner aracının çalışma zamanı ortamına erişmek için com.google.common.base.Predicate<PythonInterpreter>'ı uygulayabilir. Örneğin, bu sınıf varsayılan ad alanında bazı değişkenleri ayarlar:

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;
    }
}