Uçtan uca TF testi örneği

Bu eğitim, bir "merhaba dünya" oluşturma konusunda size rehberlik eder Ticaret Federasyonu (Tradefed veya TF) test yapılandırması ile TF hakkında uygulamalı bir tanıtım sunar bahsedeceğim. Bir geliştirme ortamından başlayarak, ilk adımda basit bir yapılandırma ve özellik ekleme.

Eğitimde, test geliştirme süreci bir dizi alıştırma, her biri çeşitli adımlardan oluşur. Bu adımlar, projenin nasıl kurulacağını ve aşamalı olarak yapılandırmanızı hassaslaştırın. Testi tamamlamak için ihtiyacınız olan tüm örnek kodlar ve her alıştırmanın başlığı bir egzersiz seti ile bu adımdaki rolleri açıklayan bir mektup:

  • Geliştirici için D
  • Entegratör için I
  • Test Çalıştırıcı için R

Eğiticiyi tamamladıktan sonra, çalışan bir TF yapılandırmanıza sahip olursunuz TF çerçevesindeki birçok önemli kavramı kavrayacaksınız.

Ticaret Federasyonu'nu kurun

TF geliştirme ortamının kurulumuyla ilgili ayrıntılar için şuraya bakın: Makine Kurulum. Bu eğiticinin geri kalanında, en az TF ortamına başlatılır.

Basitlik sağlaması için bu eğiticide, bir yapılandırma ekleme ve temel kütüphaneye ekleyeceksiniz. Bu beceri, geliştirme takas edilen JAR'yi derleyip kaynak ağacın dışına taşıyıp daha sonra karşılaştırmanızı sağlar.

Test sınıfı oluşturma (D)

Bir iletiyi stdout'a aktaran bir hello world testi oluşturalım. CEVAP ticari değişim testi genellikle IRemoteTest kullanır. HelloWorldTest için bir uygulama aşağıda verilmiştir:

package com.android.tradefed.example;

import com.android.tradefed.device.DeviceNotAvailableException;
import com.android.tradefed.invoker.TestInformation;
import com.android.tradefed.log.LogUtil.CLog;
import com.android.tradefed.result.ITestInvocationListener;
import com.android.tradefed.testtype.IRemoteTest;

public class HelloWorldTest implements IRemoteTest {
    @Override
    public void run(TestInformation testInfo, ITestInvocationListener listener) throws DeviceNotAvailableException {
        CLog.i("Hello, TF World!");
    }
}

Bu örnek kodu şuraya kaydedin: <tree>/tools/tradefederation/core/src/com/android/tradefed/example/HelloWorldTest.java. ve kabuğunuzdan gelen takaslarla yeniden üretin:

m -jN

Yukarıdaki örnekte CLog.i öğesinin, çıkışı konsola yönlendirmek için kullanıldığını unutmayın. Daha fazla Ticaret Federasyonu'na giriş yapma hakkındaki bilgiler Günlük Kaydı (D, I, R) bölümünde açıklanmıştır.

Derleme başarılı olmazsa şunu deneyin: Makine Kur'u tıklayın.

Yapılandırma oluşturma (I)

Ticaret Federasyonu testleri, Yapılandırma; hangi modüllerin (veya testlerin) çalıştırılacağını, ayrıca hangi modüllerin sipariş.

HelloWorldTest'imiz için yeni bir Yapılandırma oluşturalım (tüm sınıfın HelloWorldTest'in adı):

<configuration description="Runs the hello world test">
    <test class="com.android.tradefed.example.HelloWorldTest" />
</configuration>

Bu verileri, yerel klasörünüzün herhangi bir yerinde bir helloworld.xml dosyasına kaydedin dosya sistemi (ör. /tmp/helloworld.xml). TF, Yapılandırma XML dosyası (config)), belirtilen sınıfı şunu kullanarak yükleyin: yansıtabilir, somutlaştırabilir, IRemoteTest biçiminde birleştirebilir ve run yöntemini çağırın.

Yapılandırmayı çalıştırın (R)

Kabuktan, takas edilen konsolu başlatın:

tradefed.sh

Bir cihazın ana makineye bağlı olduğundan ve takas edilenler tarafından görülebildiğinden emin olun:

tf> list devices
Serial            State      Product   Variant   Build   Battery
004ad9880810a548  Available  mako      mako      JDQ39   100

Yapılandırmalar, run <config> kullanılarak yürütülebilir konsol komutu. Bunu deneyin:

tf> run /tmp/helloworld.xml
05-12 13:19:36 I/TestInvocation: Starting invocation for target stub on build 0 on device 004ad9880810a548
Hello, TF World!

"Hello, TF World!" ifadesini göreceksiniz. çıkışını görürsünüz.

Bir komutun çalıştırıldığını onaylamak için list invocations veya l i, hiçbir şey yazdırmaz. Komutlar şu anda şu şekilde görüntülenir:

tf >l i
Command Id  Exec Time  Device       State
10          0m:00      [876X00GNG]  running stub on build(s) 'BuildInfo{bid=0, target=stub, serial=876X00GNG}'

Yapılandırmayı sınıf yoluna ekleyin (D, I, R)

Dağıtım kolaylığı için yapılandırmaları ayrıca takas edilen JAR'leri dinleyebilirsiniz. Tradefed, config klasörlerini eklemeniz gerekir.

Örnek olarak, helloworld.xml dosyasını takas edilen temel kitaplık (<tree>/tools/tradefederation/core/res/config/example/helloworld.xml). Takas edilen konsolu yeniden oluşturun, takas edilen konsolu yeniden başlatın ve ardından takas edilen konsoldan sınıf yolundan yapılandırma listesi:

tf> list configs
[…]
example/helloworld: Runs the hello world test

Artık helloworld yapılandırmasını şu komut yardımıyla çalıştırabilirsiniz:

tf> run example/helloworld
05-12 13:21:21 I/TestInvocation: Starting invocation for target stub on build 0 on device 004ad9880810a548
Hello, TF World!

Cihazla etkileşimde bulunma (D, R)

Şu ana kadar HelloWorldTest'imiz ilginç bir şey yapmıyor. Tradefed özel alan, Android cihazlar kullanarak testler yapıyor. Bu nedenle, teste tabi tutulmasıdır.

Testler, sağlanan TestInformation kullanarak bir Android cihaza referans alabilir IRemoteTest#run yöntemi çağrıldığında çerçeve tarafından belirlenir.

HelloWorldTest yazdırma mesajını, aşağıdaki seri numarasını görüntüleyecek şekilde değiştirelim: cihaz:

@Override
public void run(TestInformation testInfo, ITestInvocationListener listener) throws DeviceNotAvailableException {
    CLog.i("Hello, TF World! I have device " + testInfo.getDevice().getSerialNumber());
}

Takas edilen ürünleri yeniden derleyin ve cihazların listesini kontrol edin:

tradefed.sh
tf> list devices
Serial            State      Product   Variant   Build   Battery
004ad9880810a548  Available  mako      mako      JDQ39   100

Kullanılabilir olarak listelenen seri numarasını not edin; yani HelloWorld'e atanması gereken cihaz:

tf> run example/helloworld
05-12 13:26:18 I/TestInvocation: Starting invocation for target stub on build 0 on device 004ad9880810a548
Hello, TF World! I have device 004ad9880810a548

Cihazın seri numarasını gösteren yeni basılı mesajı olanak tanır.

Test sonuçlarını gönder (D)

IRemoteTest, sonuçları ITestInvocationListener örneği #run yöntemine sağlanır. TF çerçevesinin kendisi başlangıcı raporlamak ( ITestInvocationListener#invocationStarted) ve bitirmek için ITestInvocationListener#invocationEnded) tıklayın.

Test çalıştırması, testlerin mantıksal bir koleksiyonudur. Test sonuçlarını bildirmek için: IRemoteTest, bir test çalıştırmasının başlatılmasını raporlamaktan sorumludur. başlangıcı ve bitişi ile test çalıştırmasının sonu.

Tek bir öğe kullanarak HelloWorldTest uygulaması başarısız oldu.

@Override
public void run(TestInformation testInfo, ITestInvocationListener listener) throws DeviceNotAvailableException {
    CLog.i("Hello, TF World! I have device " + testInfo.getDevice().getSerialNumber());

    TestDescription testId = new TestDescription("com.example.TestClassName", "sampleTest");
    listener.testRunStarted("helloworldrun", 1);
    listener.testStarted(testId);
    listener.testFailed(testId, "oh noes, test failed");
    listener.testEnded(testId, Collections.emptyMap());
    listener.testRunEnded(0, Collections.emptyMap());
}

TF, yeniden kullanabileceğiniz çeşitli IRemoteTest uygulamaları içerir en iyi yöntemin ne olduğunu öğreneceğiz. Örneğin, Araç Testi Android uygulamasının testlerini bir Android cihazda uzaktan çalıştırabilir, ve bu sonuçları ITestInvocationListener alanına iletebilir). Ayrıntılar için bkz. Test et Türler.

Mağaza test sonuçları (I)

TF yapılandırması için varsayılan test işleyici uygulaması: TextResultReporter, bu kod, çağrının sonuçlarını stdout'a atar. Örnek olarak, Önceki bölümdeki HelloWorldTest yapılandırması:

./tradefed.sh
tf> run example/helloworld
04-29 18:25:55 I/TestInvocation: Invocation was started with cmd: /tmp/helloworld.xml
04-29 18:25:55 I/TestInvocation: Starting invocation for 'stub' with '[ BuildInfo{bid=0, target=stub, serial=876X00GNG} on device '876X00GNG']
04-29 18:25:55 I/HelloWorldTest: Hello, TF World! I have device 876X00GNG
04-29 18:25:55 I/InvocationToJUnitResultForwarder: Running helloworldrun: 1 tests
04-29 18:25:55 W/InvocationToJUnitResultForwarder:
Test com.example.TestClassName#sampleTest failed with stack:
 oh noes, test failed
04-29 18:25:55 I/InvocationToJUnitResultForwarder: Run ended in 0 ms

Çağrı sonuçlarını başka bir yerde (ör. bir dosya) depolamak için bir özel ITestInvocationListener uygulaması için Yapılandırmanızda result_reporter etiketi var.

TF ayrıca XmlResultReporter aşağıdakine benzer bir biçimde bir XML dosyasına test sonuçlarını yazan işleyici, ant JUnit XML yazarı tarafından kullanılır. result_reporter değerini belirtmek için yapılandırma, …/res/config/example/helloworld.xml öğesini düzenleyin yapılandırma:

<configuration description="Runs the hello world test">
    <test class="com.android.tradefed.example.HelloWorldTest" />
    <result_reporter class="com.android.tradefed.result.XmlResultReporter" />
</configuration>

Exchange'i yeniden derleyin ve hello World örneğini tekrar çalıştırın:

tf> run example/helloworld
05-16 21:07:07 I/TestInvocation: Starting invocation for target stub on build 0 on device 004ad9880810a548
Hello, TF World! I have device 004ad9880810a548
05-16 21:07:07 I/XmlResultReporter: Saved device_logcat log to /tmp/0/inv_2991649128735283633/device_logcat_6999997036887173857.txt
05-16 21:07:07 I/XmlResultReporter: Saved host_log log to /tmp/0/inv_2991649128735283633/host_log_6307746032218561704.txt
05-16 21:07:07 I/XmlResultReporter: XML test result file generated at /tmp/0/inv_2991649128735283633/test_result_536358148261684076.xml. Total tests 1, Failed 1, Error 0

Bir XML dosyasının oluşturulduğunu belirten günlük iletisine dikkat edin; "the" oluşturulan dosya aşağıdaki gibi görünmelidir:

<?xml version='1.0' encoding='UTF-8' ?>
<testsuite name="stub" tests="1" failures="1" errors="0" time="9" timestamp="2011-05-17T04:07:07" hostname="localhost">
  <properties />
  <testcase name="sampleTest" classname="com.example.TestClassName" time="0">
    <failure>oh noes, test failed
    </failure>
  </testcase>
</testsuite>

Kendi özel çağrı dinleyicilerinizi de yazabilirsiniz. Cevaplarınız proje yöneticisi olarak ITestInvocationListener kullanır.

Tradefed, test sonuçlarını gönderebilmeniz için birden fazla çağrı dinleyicisini destekler. . Bunu yapmak için, birden fazla Yapılandırmanızda <result_reporter> etiket var.

Günlük kaydı tesisleri (D, I, R)

TF'nin günlüğe kaydetme olanakları şunları içerir:

  1. Cihazdaki günlükleri (cihaz logcat) yakalayın
  2. Ana makinede çalışan Ticaret Federasyonu çerçevesinden günlükleri kaydetme (ana makine günlüğü olarak da bilinir)

TF çerçevesi, ayrılan cihazdan logcat'i otomatik olarak yakalar ve işlenmek üzere çağrı dinleyicisine gönderir. XmlResultReporter, daha sonra yakalanan cihaz logcat'ini bir dosya olarak kaydeder.

TF ana makine günlükleri, CLog sarmalayıcı Log sınıfı için ddmlib Log sınıfı kullanın. Şimdi HelloWorldTest'teki önceki System.out.println çağrısından CLog çağrısı:

@Override
public void run(ITestInvocationListener listener) throws DeviceNotAvailableException {
    CLog.i("Hello, TF World! I have device %s", getDevice().getSerialNumber());

CLog, String.format. TF'yi yeniden derleyip yeniden çalıştırdığınızda stdout'taki günlük mesajı:

tf> run example/helloworld
…
05-16 21:30:46 I/HelloWorldTest: Hello, TF World! I have device 004ad9880810a548
…

Varsayılan olarak takas çıktılar ana makine günlüğü iletileri stdout'a iletebilir. TF ayrıca mesaj gönderebilirsiniz: FileLogger. Dosya günlük kaydı eklemek için yapılandırmaya bir logger etiketi ekleyin ve FileLogger tam sınıf adı:

<configuration description="Runs the hello world test">
    <test class="com.android.tradefed.example.HelloWorldTest" />
    <result_reporter class="com.android.tradefed.result.XmlResultReporter" />
    <logger class="com.android.tradefed.log.FileLogger" />
</configuration>

Şimdi, helloworld örneğini yeniden derleyip çalıştırın:

tf >run example/helloworld
…
05-16 21:38:21 I/XmlResultReporter: Saved device_logcat log to /tmp/0/inv_6390011618174565918/device_logcat_1302097394309452308.txt
05-16 21:38:21 I/XmlResultReporter: Saved host_log log to /tmp/0/inv_6390011618174565918/host_log_4255420317120216614.txt
…

Günlük mesajı, ana makine günlüğünün yolunu belirtir. Bu günlük HelloWorldTest günlük mesajınızı içermelidir:

more /tmp/0/inv_6390011618174565918/host_log_4255420317120216614.txt

Örnek çıkış:

…
05-16 21:38:21 I/HelloWorldTest: Hello, TF World! I have device 004ad9880810a548

Sevkiyata hazırlık seçenekleri (D, I, R)

TF Yapılandırmasından yüklenen nesneler (diğer adıyla Yapılandırma nesneleri) @Option ek açıklaması.

Katılmak için bir yapılandırma nesnesi sınıfı, @Option işlemini uygular ek açıklama ekler ve buna benzersiz bir ad verir. Böylece, üye alanı değeri (ve ayrıca bu seçeneği yapılandırma yardım sistemine otomatik olarak ekler.

Not: Tüm alan türleri desteklenmez. Örneğin, hakkında daha fazla bilgi edinmek için bkz. OptionSetter'ı seçin.

HelloWorldTest'e @Option ekleyelim:

@Option(name="my_option",
        shortName='m',
        description="this is the option's help text",
        // always display this option in the default help text
        importance=Importance.ALWAYS)
private String mMyOption = "thisisthedefault";

Sonra, seçeneğin değerini Aracın doğru şekilde alındığını gösterebilmemiz için HelloWorldTest:

@Override
public void run(ITestInvocationListener listener) throws DeviceNotAvailableException {
    …
    CLog.logAndDisplay(LogLevel.INFO, "I received option '%s'", mMyOption);

Son olarak, TF'yi yeniden derleyin ve helloworld'ü çalıştırın; şunu içeren bir günlük mesajı görürsünüz: my_option varsayılan değeri:

tf> run example/helloworld
…
05-24 18:30:05 I/HelloWorldTest: I received option 'thisisthedefault'

Komut satırından değer iletme

my_option için bir değer girin; farklı bir yerde my_option şu değerle doldurulur:

tf> run example/helloworld --my_option foo
…
05-24 18:33:44 I/HelloWorldTest: I received option 'foo'

TF yapılandırmalarında bir de yardım sistemi vardır. Bu sistemde @Option alanları için yardım metni. Şimdi denediğinizde my_option için yardım metni:

tf> run example/helloworld --help
Printing help for only the important options. To see help for all options, use the --help-all flag

  cmd_options options:
    --[no-]help          display the help text for the most important/critical options. Default: false.
    --[no-]help-all      display the full help text for all options. Default: false.
    --[no-]loop          keep running continuously. Default: false.

  test options:
    -m, --my_option      this is the option's help text Default: thisisthedefault.

  'file' logger options:
    --log-level-display  the minimum log level to display on stdout. Must be one of verbose, debug, info, warn, error, assert. Default: error.

"Yalnızca önemli seçeneklerin yazdırılması" ile ilgili mesaja dikkat edin. Azaltmak için seçenek yardım karmaşıklığı nedeniyle, TFOption#importance aşağıdaki durumlarda belirli bir @Option alanı yardım metninin gösterilip gösterilmeyeceğini belirler --help belirtilmişse. --help-all şunun için her zaman yardım gösterir: dikkate almadan tüm @Option alanları için geçerlidir. Ayrıntılar için bkz. Option.Önem.

Bir yapılandırmadan değer iletme

Ayrıca, <option name="" value=""> öğesi. Şunu kullanarak test edin: helloworld.xml:

<test class="com.android.tradefed.example.HelloWorldTest" >
    <option name="my_option" value="fromxml" />
</test>

helloworld'ü yeniden oluşturup çalıştırmak artık şu çıktıyı üretmelidir:

05-24 20:38:25 I/HelloWorldTest: I received option 'fromxml'

Yapılandırma yardımı da my_option:

tf> run example/helloworld --help
  test options:
    -m, --my_option      this is the option's help text Default: fromxml.

helloworld yapılandırmasına dahil diğer yapılandırma nesneleri: FileLogger, seçenekleri de kabul edin. Seçenek --log-level-display, şu özelliklere sahip günlükleri filtrelediği için ilginçtir: stdout'ta görünür. Eğiticinin önceki bölümlerinde "Merhaba, TF Dünya! Cihazım var ...' sonrasında günlük mesajının stdout'ta görüntülenmesi durduruldu FileLogger kullanımına geçildi. Görseldeki ayrıntı düzeyini artırabilirsiniz. --log-level-display bağımsız değişkenini ileterek stdout'a günlük kaydını tutmanızı sağlar.

Şimdi bunu denediğinizde "Cihazım var" mesajını göreceksiniz günlük mesajı yeniden görünür stdout, bir dosyaya giriş yapılmasına ek olarak:

tf> run example/helloworld --log-level-display info
…
05-24 18:53:50 I/HelloWorldTest: Hello, TF World! I have device 004ad9880810a548

Hepsi bu kadar!

Hatırlatalım, bir konuda takılırsanız Ticaret Federasyon kaynak kodu, göz önünde bulundurun. Hiçbiri işe yaramazsa android-platform Google Grubu, "Ticaret Federasyonu" ile girin.