Contoh pengujian TF menyeluruh

Tutorial ini memandu Anda membuat kata "halo dunia" Federasi Perdagangan (TF atau Tradefed) dan memberikan pengantar interaktif tentang TF Google Workspace for Education. Mulai dari lingkungan pengembangan, Anda akan membuat konfigurasi dan menambahkan fitur.

Tutorial ini menyajikan proses pengembangan pengujian sebagai satu set latihan, masing-masing terdiri dari beberapa langkah, yang menunjukkan cara membangun memperbaiki konfigurasi Anda. Semua kode contoh yang Anda perlukan untuk menyelesaikan pengujian disediakan, dan judul setiap latihan dianotasi dengan surat yang menjelaskan peran yang terlibat dalam langkah tersebut:

  • D untuk Developer
  • I untuk Integrator
  • R untuk Test Runner

Setelah menyelesaikan tutorial, Anda akan memiliki konfigurasi TF yang berfungsi dan memahami banyak konsep penting dalam kerangka kerja TF.

Menyiapkan Federasi Perdagangan

Untuk mengetahui detail tentang cara menyiapkan lingkungan pengembangan TF, lihat Mesin Penyiapan. Bagian selanjutnya dari tutorial ini mengasumsikan bahwa Anda telah membuka {i>shell<i} yang telah melakukan inisialisasi ke lingkungan TF.

Untuk mempermudah, tutorial ini mengilustrasikan penambahan konfigurasi dan ke library inti framework TF. Hal ini dapat diperluas ke pengembangan di luar hierarki sumber dengan mengompilasi JAR yang diperdagangkan, lalu mengompilasi modul Anda terhadap JAR tersebut.

Membuat class pengujian (D)

Mari kita buat pengujian halo dunia yang hanya membuang pesan ke stdout. J {i>traeded test<i} umumnya menerapkan IRemoteTest dalam antarmuka berbasis web yang sederhana. Berikut adalah implementasi untuk HelloWorldTest:

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!");
    }
}

Simpan kode contoh ini ke <tree>/tools/tradefederation/core/src/com/android/tradefed/example/HelloWorldTest.java dan membangun ulang tradefed dari shell Anda:

m -jN

Perlu diperhatikan bahwa CLog.i dalam contoh di atas digunakan untuk mengarahkan output ke konsol. Selengkapnya informasi tentang logging di Federasi Perdagangan dijelaskan di Logging (D, I, R).

Jika build tidak berhasil, konsultasikan Mesin Penyiapan untuk memastikan Anda tidak melewatkan satu langkah pun.

Membuat konfigurasi (I)

Tes Federasi Perdagangan dapat dijalankan dengan membuat Konfigurasi, file XML yang menginstruksikan di-trading di mana yang akan diuji (atau beberapa pengujian) yang akan dijalankan, serta modul lain mana yang akan dieksekusi dan di mana pesanan.

Mari membuat Konfigurasi baru untuk HelloWorldTest (perhatikan class lengkap nama HelloWorldTest):

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

Simpan data ini ke file helloworld.xml di mana saja di lokasi lokal Anda sistem file (misalnya, /tmp/helloworld.xml). TF akan mengurai File XML konfigurasi (alias config), memuat class yang ditentukan menggunakan refleksikan, buat instance, mentransmisikannya ke IRemoteTest, dan memanggilnya metode run.

Menjalankan konfigurasi (R)

Dari shell Anda, luncurkan konsol yang diberi feed:

tradefed.sh

Pastikan perangkat terhubung ke mesin host dan dapat diperdagangkan:

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

Konfigurasi dapat dijalankan menggunakan run <config> menggunakan perintah console. Coba:

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!

Anda akan melihat "Hello, TF World!" (Halo Dunia TF). output pada terminal.

Anda dapat mengonfirmasi bahwa perintah telah selesai dijalankan menggunakan list invocations atau l i pada prompt konsol, dan seharusnya tidak mencetak apa pun. Jika perintah saat ini berjalan, parameter tersebut akan ditampilkan sebagai berikut:

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

Menambahkan konfigurasi ke classpath (D, I, R)

Untuk kemudahan deployment, Anda juga dapat memaketkan konfigurasi ke dalam paket JAR itu sendiri. Tradefed otomatis mengenali semua konfigurasi yang ditempatkan di config pada classpath.

Sebagai ilustrasi, pindahkan file helloworld.xml ke file yang telah ditukar library inti (<tree>/tools/tradefederation/core/res/config/example/helloworld.xml). Build ulang yang telah di-trading, mulai ulang konsol yang di-trading, lalu minta di-trading untuk menampilkan daftar konfigurasi dari classpath:

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

Sekarang Anda dapat menjalankan konfigurasi helloworld menggunakan:

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!

Berinteraksi dengan perangkat (D, R)

Sejauh ini, HelloWorldTest belum melakukan sesuatu yang menarik. Tradefed adalah menjalankan pengujian menggunakan perangkat Android, jadi mari tambahkan perangkat Android melakukan pengujian.

Pengujian bisa mendapatkan referensi ke perangkat Android dengan menggunakan TestInformation, jika oleh framework saat metode IRemoteTest#run dipanggil.

Mari kita ubah pesan cetak HelloWorldTest untuk menampilkan nomor seri perangkat:

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

Sekarang, bangun ulang trade-nya dan periksa daftar perangkat:

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

Perhatikan nomor seri yang tercantum sebagai Tersedia; yang perangkat yang harus dialokasikan ke HelloWorld:

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

Anda akan melihat pesan cetak baru yang menampilkan nomor seri perangkat seluler.

Mengirim hasil pengujian (D)

IRemoteTest melaporkan hasil dengan memanggil metode di ITestInvocationListener yang diberikan ke metode #run. Kerangka kerja TF itu sendiri bertanggung jawab untuk melaporkan awal (melalui ITestInvocationListener#invocationStarted) dan berakhir (melalui ITestInvocationListener#invocationEnded) dari setiap Pemanggilan.

Pengujian adalah kumpulan pengujian yang logis. Untuk melaporkan hasil pengujian, IRemoteTest bertanggung jawab untuk melaporkan dimulainya pengujian, awal dan akhir dari setiap pengujian, dan di akhir dari pengujian.

Berikut adalah contoh implementasi HelloWorldTest dengan satu hasil pengujian gagal.

@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 mencakup beberapa implementasi IRemoteTest yang dapat Anda gunakan kembali alih-alih menulis sendiri dari awal. Misalnya, InstrumentasiTest dapat menjalankan pengujian aplikasi Android dari jarak jauh pada perangkat Android, mengurai hasil, dan meneruskan hasil tersebut ke ITestInvocationListener). Untuk mengetahui detailnya, lihat Pengujian Jenis.

Menyimpan hasil pengujian (I)

Implementasi pemroses pengujian default untuk konfigurasi TF adalah TextResultReporter, yang mengeluarkan hasil pemanggilan ke {i>stdout<i}. Sebagai ilustrasi, jalankan Konfigurasi HelloWorldTest dari bagian sebelumnya:

./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

Untuk menyimpan hasil pemanggilan di tempat lain, seperti di file, tentukan implementasi ITestInvocationListener kustom menggunakan tag result_reporter di konfigurasi Anda.

TF juga mencakup XmlResultReporter yang menulis hasil pengujian ke file XML dalam format yang mirip dengan digunakan oleh penulis XML JUnit ant. Untuk menentukan result_reporter dalam edit …/res/config/example/helloworld.xml konfigurasi:

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

Sekarang, bangun ulang tradefed dan jalankan ulang sampel hello world:

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

Perhatikan pesan log yang menyatakan bahwa file XML telah dihasilkan; tindakan file yang dihasilkan akan terlihat seperti ini:

<?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>

Anda juga bisa menulis pemroses pemanggilan kustom Anda sendiri, perlu menerapkan ITestInvocationListener dalam antarmuka berbasis web yang sederhana.

Tradefed mendukung beberapa pemroses pemanggilan, sehingga Anda dapat mengirim hasil pengujian ke beberapa tujuan independen. Untuk melakukannya, tentukan beberapa <result_reporter> tag di konfigurasi Anda.

Fasilitas penebangan (D, I, R)

Fasilitas logging TF mencakup kemampuan untuk:

  1. Mengambil log dari perangkat (atau logcat perangkat)
  2. Mencatat log dari framework Trade Federation yang berjalan di mesin host (disebut juga log host)

Framework TF secara otomatis menangkap logcat dari perangkat yang dialokasikan dan mengirimkannya ke pemroses pemanggilan untuk diproses. XmlResultReporter kemudian menyimpan logcat perangkat yang direkam sebagai file.

Log {i>host <i}TF dilaporkan menggunakan Wrapper CLog untuk class Log ddmlib. Mari konversi panggilan System.out.println sebelumnya di HelloWorldTest ke Panggilan CLog:

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

CLog menangani interpolasi string secara langsung, mirip dengan String.format. Saat Anda membangun kembali dan menjalankan kembali TF, Anda akan melihat pesan log tentang {i>stdout<i}:

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

Secara default, ditukar log host output pesan ke stdout. TF juga mencakup implementasi log yang menulis pesan ke file: FileLogger. Untuk menambahkan logging file, tambahkan tag logger ke konfigurasi, dengan menentukan nama class lengkap FileLogger:

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

Sekarang, bangun ulang dan jalankan kembali contoh helloworld:

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
…

Pesan log menunjukkan jalur log {i>host<i}, yang ketika dilihat, harus berisi pesan log HelloWorldTest:

more /tmp/0/inv_6390011618174565918/host_log_4255420317120216614.txt

Contoh output:

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

Opsi penanganan (D, I, R)

Objek yang dimuat dari Konfigurasi TF (alias Objek Konfigurasi) juga dapat menerima data dari argumen baris perintah melalui penggunaan @Option.

Untuk berpartisipasi, class objek Configuration menerapkan @Option ke isian anggota dan memberinya nama unik. Hal ini memungkinkan kolom anggota untuk diisi melalui opsi baris perintah (dan juga otomatis menambahkan opsi tersebut ke sistem bantuan konfigurasi).

Catatan: Tidak semua jenis kolom didukung. Untuk jenis yang didukung, lihat OptionSetter.

Mari tambahkan @Option ke HelloWorldTest:

@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";

Selanjutnya, mari kita tambahkan pesan log untuk menampilkan nilai opsi di HelloWorldTest agar dapat menunjukkan bahwa kode tersebut diterima dengan benar:

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

Terakhir, bangun kembali TF dan jalankan helloworld; Anda akan melihat pesan log dengan Nilai default my_option:

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

Meneruskan nilai dari command line

Meneruskan nilai untuk my_option; Anda akan melihat my_option diisi dengan nilai tersebut:

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

Konfigurasi TF juga mencakup sistem bantuan, yang secara otomatis menampilkan teks bantuan untuk kolom @Option. Coba sekarang, dan Anda akan melihat teks bantuan untuk my_option:

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.

Perhatikan pesan tentang "mencetak opsi penting saja". Untuk mengurangi membantu kekacauan, TF menggunakan atribut Option#importance untuk menentukan apakah akan menampilkan teks bantuan kolom @Option tertentu saat --help ditentukan. --help-all selalu menampilkan bantuan untuk semua kolom @Option, terlepas dari tingkat kepentingannya. Untuk mengetahui detailnya, lihat Option.Tingkat Kepentingan.

Meneruskan nilai dari konfigurasi

Anda juga dapat menentukan nilai Option dalam konfigurasi dengan menambahkan elemen Elemen <option name="" value="">. Mengujinya menggunakan helloworld.xml:

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

Membangun ulang dan menjalankan helloworld sekarang akan menghasilkan output berikut:

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

Bantuan konfigurasi juga akan diperbarui untuk menunjukkan nilai {i>default<i} dari my_option:

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

Objek konfigurasi lain yang disertakan dalam konfigurasi helloworld, seperti FileLogger, juga menerima opsi. Opsi --log-level-display menarik karena memfilter log yang muncul di {i>stdout<i}. Di awal tutorial, Anda mungkin telah melihat pesan "Halo, TF Dunia! Aku punya perangkat ...' pesan log berhenti ditampilkan di {i>stdout<i} setelah kita beralih menggunakan FileLogger. Anda bisa menambah panjang logging ke stdout dengan meneruskan argumen --log-level-display.

Coba ini sekarang, dan Anda akan melihat pesan 'Saya memiliki perangkat' pesan log muncul kembali pada {i>stdout<i}, selain mencatat ke dalam file:

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

Itu saja, teman-teman!

Sebagai pengingat, jika Anda terhambat pada sesuatu, Perdagangan Federation code code memiliki banyak informasi berguna yang tidak ditampilkan di dokumentasi tersebut. Jika semua upaya di atas tidak berhasil, coba minta platform android Google Grup, dengan "Federasi Perdagangan" pada subjek pesan.