এন্ড-টু-এন্ড TF টেস্টের উদাহরণ

এই টিউটোরিয়াল আপনাকে "hello world" Trade Federation (Tradefed বা TF) টেস্ট কনফিগারেশন তৈরি করার ব্যাপারে গাইড করে এবং TF ফ্রেমওয়ার্কের সাথে ব্যবহারিক পরিচয় করিয়ে দেয়। ডেভেলপমেন্ট এনভায়রনমেন্ট থেকে শুরু করে, আপনি একটি সাধারণ কনফিগারেশন তৈরি করবেন এবং ফিচার যোগ করবেন।

টিউটোরিয়ালে টেস্ট ডেভেলপমেন্ট প্রসেসকে একগুচ্ছ এক্সারসাইজ হিসেবে দেখানো হয়েছে, প্রতিটি এক্সারসাইজে একাধিক ধাপ রয়েছে, যা থেকে কীভাবে কনফিগারেশন তৈরি ও ধীরে ধীরে আরও উন্নত করতে হয় তা বোঝা যায়। টেস্ট কনফিগারেশন সম্পূর্ণ করার জন্য প্রয়োজনীয় সব স্যাম্পেল কোড প্রদান করা হয়েছে এবং প্রতিটি এক্সারসাইজের শীর্ষক একটি অক্ষর দিয়ে অ্যানোটেট করা হয়েছে যা সেই ধাপে সংশ্লিষ্ট ভূমিকা বর্ণনা করে:

  • ডেভেলপারদের জন্য D
  • I for Integrator
  • Test Runner-এর জন্য R

টিউটোরিয়াল সম্পূর্ণ করার পরে, আপনার কাছে একটি কার্যকরী TF কনফিগারেশন থাকবে এবং TF ফ্রেমওয়ার্কের অনেক গুরুত্বপূর্ণ কনসেপ্ট বুঝতে পারবেন।

ট্রেড ফেডারেশন সেট-আপ করা

TF ডেভেলপমেন্ট এনভায়রনমেন্ট সেট-আপ করার ব্যাপারে আরও জানতে, মেশিন সেট-আপ দেখুন। এই টিউটোরিয়ালের বাকি অংশ ধরে নেয় যে আপনার কাছে একটি শেল খোলা আছে যা TF এনভায়রনমেন্টে ইনিশিয়ালাইজ করা হয়েছে।

সহজভাবে বোঝার জন্য, এই টিউটোরিয়ালে TF ফ্রেমওয়ার্কের কোর লাইব্রেরিতে একটি কনফিগারেশন ও তার ক্লাস যোগ করার পদ্ধতি দেখানো হয়েছে। এটি সোর্স ট্রির বাইরে মডিউল ডেভেলপ করার জন্য বাড়ানো যেতে পারে। এর জন্য tradefed JAR কম্পাইল করতে হবে এবং তারপরে সেই JAR-এর সাথে আপনার মডিউল কম্পাইল করতে হবে।

টেস্ট ক্লাস তৈরি করুন (D)

আসুন, একটি হ্যালো ওয়ার্ল্ড টেস্ট তৈরি করি যা stdout-এ একটি মেসেজ ডাম্প করে। Tradefed টেস্ট সাধারণত IRemoteTest ইন্টারফেস ইমপ্লিমেন্ট করে। 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!");
    }
}

এই স্যাম্পেল কোডটি <tree>/tools/tradefederation/core/src/com/android/tradefed/example/HelloWorldTest.java -এ সেভ করুন এবং আপনার শেল থেকে tradefed আবার তৈরি করুন:

m -jN

মনে রাখবেন, উপরের উদাহরণে CLog.i কনসোলে আউটপুট ডাইরেক্ট করার জন্য ব্যবহার করা হয়েছে। ট্রেড ফেডারেশনে লগ-ইন করা সম্পর্কে আরও তথ্য লগিং (D, I, R)-এ বর্ণনা করা হয়েছে।

বিল্ড সফল না হলে, কোনও ধাপ মিস করেছেন কিনা তা নিশ্চিত করতে মেশিন সেট-আপ দেখুন।

কনফিগারেশন তৈরি করা (I)

Trade Federation টেস্ট এক্সিকিউট করার জন্য একটি কনফিগারেশন তৈরি করা হয়। এটি একটি XML ফাইল যা tradefed-কে কোন টেস্ট (বা টেস্টগুলি) রান করতে হবে, সেইসাথে কোন অন্যান্য মডিউল এক্সিকিউট করতে হবে এবং কোন ক্রম অনুসারে তা নির্দেশ করে।

আসুন আমাদের HelloWorldTest-এর জন্য একটি নতুন কনফিগারেশন তৈরি করি (HelloWorldTest-এর সম্পূর্ণ ক্লাস নামটি নোট করুন):

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

এই ডেটা আপনার লোকাল ফাইলসিস্টেমের (যেমন, /tmp/helloworld.xml) যেকোনও জায়গায় helloworld.xml ফাইলে সেভ করুন। TF কনফিগারেশন XML ফাইল (অর্থাৎ config) পার্স করবে, রিফ্লেকশন ব্যবহার করে নির্দিষ্ট ক্লাস লোড করবে, এটিকে ইনস্ট্যানশিয়েট করবে, এটিকে IRemoteTest-এ কাস্ট করবে এবং এর run মেথড কল করবে।

কনফিগ চালান (R)

আপনার শেল থেকে, tradefed কনসোল চালু করুন:

tradefed.sh

হোস্ট মেশিনে কোনও ডিভাইস কানেক্ট করা আছে কিনা এবং সেটি Tradefed-এর কাছে দৃশ্যমান কিনা তা নিশ্চিত করুন:

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

run <config> কনসোল কমান্ড ব্যবহার করে কনফিগারেশন এক্সিকিউট করা যেতে পারে। ব্যবহার করে দেখুন:

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!" আউটপুট দেখতে পাবেন।

কনসোল প্রম্পটে list invocations বা l i ব্যবহার করে আপনি কনফার্ম করতে পারবেন যে কমান্ডটি রান করা হয়ে গেছে এবং এটি কিছু প্রিন্ট করবে না। কমান্ড বর্তমানে রান করলে, সেগুলি এইভাবে দেখানো হয়:

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

ক্লাসপাথে (D, I, R) কনফিগারেশন যোগ করুন

সহজে ডেপ্লয় করার জন্য, আপনি tradefed JAR-এর মধ্যেই কনফিগারেশন বান্ডেল করতে পারেন। classpath-এ থাকা config ফোল্ডারে রাখা সব কনফিগারেশন Tradefed অটোমেটিক শনাক্ত করে।

উদাহরণস্বরূপ, helloworld.xml ফাইলটি tradefed কোর লাইব্রেরিতে (<tree>/tools/tradefederation/core/res/config/example/helloworld.xml) সরান। tradefed রিবিল্ড করুন, tradefed কনসোল রিস্টার্ট করুন, তারপর tradefed-কে classpath থেকে কনফিগারেশনের তালিকা দেখাতে বলুন:

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

আপনি এখন এটি ব্যবহার করে helloworld কনফিগারেশন চালাতে পারবেন:

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!

ডিভাইসের সাথে ইন্টার‍্যাক্ট করা (D, R)

এখনও পর্যন্ত, আমাদের HelloWorldTest-এ আকর্ষণীয় কিছু নেই। Tradefed-এর বিশেষত্ব হল Android ডিভাইস ব্যবহার করে পরীক্ষা চালানো, তাই আসুন আমরা পরীক্ষায় একটি Android ডিভাইস যোগ করি।

IRemoteTest#run পদ্ধতি কল করা হলে ফ্রেমওয়ার্কের মাধ্যমে প্রদান করা TestInformation ব্যবহার করে টেস্ট, Android ডিভাইসের রেফারেন্স পেতে পারে।

আসুন, ডিভাইসের সিরিয়াল নম্বর দেখানোর জন্য HelloWorldTest প্রিন্ট মেসেজটি পরিবর্তন করি:

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

এখন tradefed আবার তৈরি করুন এবং ডিভাইসের তালিকা চেক করুন:

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

উপলভ্য হিসেবে তালিকাভুক্ত সিরিয়াল নম্বরটি নোট করুন; সেটি হল সেই ডিভাইস যা 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

ডিভাইসের সিরিয়াল নম্বর সহ নতুন প্রিন্ট মেসেজটি দেখতে পাবেন।

টেস্টের ফলাফল পাঠানো (D)

IRemoteTest, #run পদ্ধতিতে প্রদান করা ITestInvocationListener ইনস্ট্যান্সে কলিং পদ্ধতির মাধ্যমে ফলাফল রিপোর্ট করে। TF ফ্রেমওয়ার্ক নিজেই প্রতিটি ইনভোকেশন শুরু (ITestInvocationListener#invocationStarted-এর মাধ্যমে) এবং শেষ (ITestInvocationListener#invocationEnded-এর মাধ্যমে) হওয়ার রিপোর্ট করার জন্য দায়ী।

টেস্ট রান হল পরীক্ষার একটি যৌক্তিক সংগ্রহ। টেস্টের ফলাফল রিপোর্ট করতে, IRemoteTest টেস্ট রান শুরু হওয়ার রিপোর্ট, প্রতিটি টেস্ট শুরু ও শেষ হওয়ার রিপোর্ট এবং টেস্ট রান শেষ হওয়ার রিপোর্ট দেওয়ার জন্য দায়ী।

একটি ফেল করা টেস্টের ফলাফলের সাথে HelloWorldTest ইমপ্লিমেন্টেশন কেমন হতে পারে তা এখানে দেওয়া হল।

@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-এ একাধিক IRemoteTest ইমপ্লিমেন্টেশন অন্তর্ভুক্ত থাকে যা আপনি স্ক্র্যাচ থেকে নিজের লেখার পরিবর্তে পুনরায় ব্যবহার করতে পারেন। যেমন, InstrumentationTest Android ডিভাইসে Android অ্যাপ্লিকেশনের টেস্ট রিমোটলি রান করতে, ফলাফল পার্স করতে এবং সেই ফলাফল ITestInvocationListener)-এ ফরোয়ার্ড করতে পারে। আরও বিবরণের জন্য, টেস্টের প্রকার দেখুন।

স্টোর টেস্টের ফলাফল (I)

TF কনফিগারেশনের জন্য ডিফল্ট টেস্ট লিসেনার ইমপ্লিমেন্টেশন হল TextResultReporter, যা stdout-এ ইনভোকেশনের ফলাফল ডাম্প করে। উদাহরণস্বরূপ, আগের বিভাগ থেকে HelloWorldTest কনফিগারেশন রান করুন:

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

ইনভোকেশনের ফলাফল অন্য কোথাও, যেমন কোনও ফাইলে স্টোর করতে, আপনার কনফিগারেশনে result_reporter ট্যাগ ব্যবহার করে কাস্টম ITestInvocationListener ইমপ্লিমেন্টেশন নির্দিষ্ট করুন।

TF-এ XmlResultReporter লিসেনারও অন্তর্ভুক্ত থাকে, যা ant JUnit XML রাইটারের ব্যবহার করা ফর্ম্যাটের মতো একটি ফর্ম্যাটে XML ফাইলে পরীক্ষার ফলাফল লেখে। কনফিগারেশনে result_reporter নির্দিষ্ট করতে, …/res/config/example/helloworld.xml config এডিট করুন:

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

এখন tradefed আবার বিল্ড করুন এবং 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

XML ফাইল তৈরি করা হয়েছে বলে উল্লেখ করা লগ মেসেজটি লক্ষ্য করুন; তৈরি করা ফাইলটি এইরকম দেখতে হবে:

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

এছাড়াও, আপনি নিজের কাস্টম ইনভোকেশন লিসনার লিখতে পারেন—সেগুলিকে শুধু ITestInvocationListener ইন্টারফেস ইমপ্লিমেন্ট করতে হবে।

Tradefed একাধিক ইনভোকেশন লিসনারকে সাপোর্ট করে, তাই আপনি একাধিক স্বতন্ত্র গন্তব্যে পরীক্ষার ফলাফল পাঠাতে পারবেন। এটি করতে, আপনার কনফিগে একাধিক <result_reporter> ট্যাগ উল্লেখ করুন।

লগিং সুবিধা (D, I, R)

TF-এর লগিং সুবিধার মধ্যে এগুলি অন্তর্ভুক্ত:

  1. ডিভাইস থেকে লগ ক্যাপচার করা (অর্থাৎ ডিভাইস লগক্যাট)
  2. হোস্ট মেশিনে রান করা Trade Federation ফ্রেমওয়ার্ক থেকে লগ রেকর্ড করা (হোস্ট লগ নামেও পরিচিত)

TF ফ্রেমওয়ার্ক অটোমেটিক বরাদ্দ করা ডিভাইস থেকে logcat ক্যাপচার করে এবং প্রসেস করার জন্য ইনভোকেশন লিসনারে পাঠায়। XmlResultReporter তারপর ক্যাপচার করা ডিভাইস logcat ফাইল হিসেবে সেভ করে।

ddmlib Log ক্লাসের জন্য CLog র‍্যাপার ব্যবহার করে TF হোস্ট লগ রিপোর্ট করা হয়। আসুন, HelloWorldTest-এর আগের System.out.println কলটিকে একটি CLog কলে কনভার্ট করি:

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

CLog সরাসরি স্ট্রিং ইন্টারপোলেশন ম্যানেজ করে, এটি String.format-এর মতো। আপনি TF আবার তৈরি ও রান করলে, stdout-এ লগ মেসেজ দেখতে পাবেন:

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

ডিফল্ট হিসেবে, tradefed stdout-এ হোস্ট লগ মেসেজ আউটপুট করে। TF-এ লগ প্রয়োগও অন্তর্ভুক্ত থাকে যা কোনও ফাইলে মেসেজ লেখে: FileLogger. ফাইল লগিং যোগ করতে, কনফিগে একটি logger ট্যাগ যোগ করুন, যার মধ্যে 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>

এখন, 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
…

লগ মেসেজটি হোস্ট লগের পাথ নির্দেশ করে, যা দেখলে, আপনার HelloWorldTest লগ মেসেজটি দেখতে পাওয়ার কথা:

more /tmp/0/inv_6390011618174565918/host_log_4255420317120216614.txt

আউটপুটের উদাহরণ:

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

ম্যানেজ করার বিকল্প (D, I, R)

TF কনফিগারেশন (অর্থাৎ কনফিগারেশন অবজেক্ট) থেকে লোড করা অবজেক্ট @Option অ্যানোটেশন ব্যবহার করে কমান্ড লাইন আর্গুমেন্ট থেকেও ডেটা পেতে পারে।

অংশগ্রহণ করতে, একটি কনফিগারেশন অবজেক্ট ক্লাস মেম্বার ফিল্ডে @Option অ্যানোটেশন প্রয়োগ করে এবং এটিকে একটি অনন্য নাম প্রদান করে। এটি সেই মেম্বার ফিল্ড ভ্যালুকে কমান্ড লাইন বিকল্পের মাধ্যমে পপুলেট করার সুবিধা দেয় (এবং অটোমেটিক সেই বিকল্পকে কনফিগারেশন সহায়তা সিস্টেমে যোগ করে)।

মনে রাখবেন: সব ধরনের ফিল্ড কাজ করে না। কোন কোন ধরনের কন্টেন্ট কাজ করে তার বিবরণ পেতে, OptionSetter দেখুন।

HelloWorldTest-এ @Option যোগ করা যাক:

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

এরপর, HelloWorldTest-এ বিকল্পের ভ্যালু দেখানোর জন্য একটি লগ মেসেজ যোগ করা যাক, যাতে আমরা দেখাতে পারি যে এটি সঠিকভাবে পাওয়া গেছে:

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

শেষে, TF আবার তৈরি করুন এবং helloworld রান করুন; আপনি my_option ডিফল্ট ভ্যালু সহ একটি লগ মেসেজ দেখতে পাবেন:

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

কমান্ড লাইন থেকে ভ্যালু পাস করা

my_option-এর জন্য একটি ভ্যালু পাস করুন; আপনি দেখতে পাবেন যে my_option সেই ভ্যালু দিয়ে পূরণ করা হয়েছে:

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

TF কনফিগারেশনে একটি সহায়তা সিস্টেমও অন্তর্ভুক্ত থাকে, যা @Option ফিল্ডের জন্য অটোমেটিক সহায়তা টেক্সট দেখায়। এখনই এটি ব্যবহার করে দেখুন এবং আপনি 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.

"শুধুমাত্র গুরুত্বপূর্ণ বিকল্প প্রিন্ট করা" সংক্রান্ত মেসেজটি দেখুন। বিকল্পের সংখ্যা কমানোর জন্য, TF Option#importance অ্যাট্রিবিউট ব্যবহার করে নির্ধারণ করে যে --help নির্দিষ্ট করা থাকলে কোনও নির্দিষ্ট @Option ফিল্ডের সাহায্যকারী টেক্সট দেখানো হবে কিনা। --help-allগুরুত্বপূর্ণ হোক বা না হোক, সব @Option ফিল্ডের জন্য সবসময় সহায়তা দেখায়। আরও বিবরণের জন্য, Option.Importance দেখুন।

কনফিগারেশন থেকে ভ্যালু পাস করা

এছাড়াও, আপনি কনফিগারেশনের মধ্যে একটি <option name="" value=""> এলিমেন্ট যোগ করে বিকল্পের ভ্যালু নির্দিষ্ট করতে পারেন। helloworld.xml ব্যবহার করে এটি পরীক্ষা করুন:

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

helloworld আবার তৈরি করে রান করলে এখন এই আউটপুট পাওয়া যাবে:

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

এছাড়াও, কনফিগারেশন সংক্রান্ত সহায়তা আপডেট করে my_option-এর ডিফল্ট ভ্যালু দেখাতে হবে:

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

helloworld কনফিগারেশনে অন্তর্ভুক্ত অন্যান্য কনফিগারেশন অবজেক্ট, যেমন FileLogger, বিকল্প গ্রহণ করে। --log-level-display বিকল্পটি আকর্ষণীয় কারণ এটি stdout-এ দেখানো লগ ফিল্টার করে। টিউটোরিয়ালের শুরুতে, আপনি হয়ত "হ্যালো, TF World! আমরা FileLogger ব্যবহার করা শুরু করার পরে, stdout-এ 'আমার ডিভাইস …' লগ মেসেজ দেখানো বন্ধ হয়ে গেছে। --log-level-display arg পাস করে আপনি stdout-এ লগিংয়ের ভার্বোসিটি বাড়াতে পারবেন।

এখন এটি চেষ্টা করে দেখুন এবং আপনি দেখতে পাবেন যে 'আমার ডিভাইস আছে' লগ মেসেজটি stdout-এ আবার দেখা যাচ্ছে, এছাড়াও এটি একটি ফাইলে লগ করা হয়েছে:

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

এই পর্যন্তই!

মনে রাখবেন, আপনি কোনও বিষয়ে আটকে গেলে, ট্রেড ফেডারেশন সোর্স কোডে অনেক সহায়ক তথ্য আছে যা ডকুমেন্টেশনে প্রকাশ করা হয়নি। অন্য কোনও উপায়ে কাজ না হলে, মেসেজের বিষয়ে "ট্রেড ফেডারেশন" লিখে android-platform Google গ্রুপে জিজ্ঞাসা করে দেখুন।