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:
- Cihazdaki günlükleri (cihaz logcat) yakalayın
- 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.