Atest یک ابزار خط فرمان است که به کاربران امکان میدهد تستهای اندروید را به صورت محلی بسازند، نصب کنند و اجرا کنند و بدون نیاز به دانش در مورد گزینههای خط فرمان کنترل تست Trade Federation ، سرعت اجرای مجدد تستها را تا حد زیادی افزایش دهند. این صفحه نحوه استفاده از Atest برای اجرای تستهای اندروید را توضیح میدهد.
برای اطلاعات کلی در مورد نوشتن تست برای اندروید، به بخش تست پلتفرم اندروید مراجعه کنید.
برای اطلاعات در مورد ساختار کلی Atest، به راهنمای توسعهدهندگان Atest مراجعه کنید.
برای اطلاعات در مورد اجرای تستها در فایلهای TEST_MAPPING از طریق Atest، به اجرای تستها در فایلهای TEST_MAPPING مراجعه کنید.
برای افزودن یک ویژگی به Atest، گردش کار توسعهدهندگان Atest را دنبال کنید.
Set up your environment
برای راهاندازی محیط Atest خود، دستورالعملهای موجود در بخشهای راهاندازی محیط ، انتخاب هدف و ساخت کد را دنبال کنید.
کاربرد اولیه
Atest commands take the following form:
atest test-to-run [optional-arguments]
آرگومانهای اختیاری
جدول زیر آرگومانهای پرکاربرد را فهرست میکند. فهرست کامل از طریق atest --help قابل دسترسی است.
| گزینه | Long option | توضیحات |
|---|---|---|
-b | --build | Builds test targets. (default) |
-i | --install | مصنوعات آزمایشی (APK) را روی دستگاه نصب میکند. (پیشفرض) |
-t | --test | تستها را اجرا میکند. (پیشفرض) |
-s | --serial | تستها را روی دستگاه مشخص شده اجرا میکند. میتوان هر دستگاه را به طور همزمان تست کرد. |
-d | --disable-teardown | Disables test teardown and cleanup. |
| --dry-run | Atest را بدون ساخت، نصب یا اجرای تستهای واقعی، به صورت آزمایشی اجرا میکند. |
-m | --rebuild-module-info | Forces a rebuild of the module-info.json file. |
-w | --wait-for-debugger | Waits for debugger to finish before executing. |
-v | --verbose | Displays DEBUG level logging. |
| --iterations | حلقه، تستها را تا رسیدن به حداکثر تکرار اجرا میکند. (به طور پیشفرض ۱۰) |
| --rerun-until-failure [COUNT=10] | تمام تستها را تا زمان وقوع خطا یا رسیدن به حداکثر تکرار، دوباره اجرا میکند. (به طور پیشفرض ۱۰) |
| --retry-any-failure [COUNT=10] | تستهای ناموفق را تا زمان قبولی یا رسیدن به حداکثر تکرار، دوباره اجرا میکند. (به طور پیشفرض ۱۰) |
| --start-avd | به طور خودکار یک AVD ایجاد میکند و تستهایی را روی دستگاه مجازی اجرا میکند. |
| --acloud-create | Creates an AVD using the acloud command. |
| --[CUSTOM_ARGS] | Specifies custom arguments for the test runners. |
-a | --all-abi | آزمایشها را برای تمام معماریهای دستگاه موجود اجرا میکند. |
| --host | تست را به طور کامل روی میزبان و بدون دستگاه اجرا میکند. توجه: اجرای تست میزبان که به دستگاهی با --host نیاز دارد، با شکست مواجه خواهد شد. |
| --history | Shows test results in chronological order. |
| --latest-result | Prints the latest test result. |
برای اطلاعات بیشتر در مورد -b ، -i و -t ، به بخش «مراحل مشخص کردن: ساخت، نصب یا اجرا» مراجعه کنید.
تستها را مشخص کنید
برای اجرای تستها، یک یا چند تست را با استفاده از یکی از شناسههای زیر مشخص کنید:
- نام ماژول
- ماژول:کلاس
- نام کلاس
- Tradefed integration test
- File path
- نام بسته
ارجاعات به چندین تست را با فاصله از هم جدا کنید، مانند این:
atest test-identifier-1 test-identifier-2
نام ماژول
برای اجرای کل یک ماژول آزمایشی، از نام ماژول آن استفاده کنید. نام را همانطور که در متغیرهای LOCAL_MODULE یا LOCAL_PACKAGE_NAME در فایل Android.mk یا Android.bp آن تست آمده است، وارد کنید.
مثالها:
atest FrameworksServicesTestsatest CtsVideoTestCases
ماژول:کلاس
برای اجرای یک کلاس واحد درون یک ماژول، از Module:Class استفاده کنید. Module همان چیزی است که در Module name توضیح داده شده است. Class نام کلاس آزمایشی در فایل .java است و میتواند نام کلاس کامل یا نام پایه باشد.
مثالها:
atest CtsVideoTestCases:VideoEncoderDecoderTestatest FrameworksServicesTests:ScreenDecorWindowTestsatest FrameworksServicesTests:com.android.server.wm.ScreenDecorWindowTests
نام کلاس
برای اجرای یک کلاس بدون ذکر صریح نام ماژول، از نام کلاس استفاده کنید.
مثالها:
atest ScreenDecorWindowTestsatest VideoEncoderDecoderTest
آزمون ادغام Tradefed
برای اجرای تستهایی که مستقیماً در TradeFed ادغام شدهاند (غیر ماژولها)، نام را همانطور که در خروجی دستور tradefed.sh list configs ظاهر میشود، وارد کنید. برای مثال:
برای اجرای تست reboot.xml :
atest example/reboot
برای اجرای تست native-benchmark.xml :
atest native-benchmark
مسیر فایل
Atest از اجرای تستهای مبتنی بر ماژول و تستهای مبتنی بر ادغام با وارد کردن مسیر فایل یا دایرکتوری تست آنها به صورت مناسب پشتیبانی میکند. همچنین از اجرای یک کلاس واحد با مشخص کردن مسیر فایل جاوای کلاس پشتیبانی میکند. هر دو مسیر نسبی و مطلق پشتیبانی میشوند.
اجرای یک ماژول
مثالهای زیر دو روش برای اجرای ماژول CtsVideoTestCases با استفاده از یک مسیر فایل را نشان میدهند.
اجرا از طریق repo-root اندروید:
atest cts/tests/video
از مسیر repo-root/cts/tests/video اندروید اجرا کنید:
atest .
اجرای کلاس تست
مثال زیر نحوه اجرای یک کلاس خاص را در ماژول CtsVideoTestCases با استفاده از یک مسیر فایل نشان میدهد.
از repo-root اندروید:
atest cts/tests/video/src/android/video/cts/VideoEncoderDecoderTest.java
اجرای تست یکپارچهسازی
مثال زیر نحوه اجرای تست یکپارچهسازی را با استفاده از مسیر فایل از Android repo-root نشان میدهد:
atest tools/tradefederation/contrib/res/config/example/reboot.xml
نام بسته
Atest از جستجوی تستها بر اساس نام بسته پشتیبانی میکند.
مثالها:
atest com.android.server.wm
atest com.android.uibench.janktests
مراحل را مشخص کنید: ساخت، نصب یا اجرا
از گزینههای -b ، -i و -t برای مشخص کردن مراحلی که باید اجرا شوند استفاده کنید. اگر گزینهای را مشخص نکنید، تمام مراحل اجرا میشوند.
- فقط اهداف ساخت:
atest -b test-to-run - فقط تستها را اجرا کنید:
atest -t test-to-run - نصب apk و اجرای تستها:
atest -it test-to-run - ساخت و اجرا، اما نصب نکنید:
atest -bt test-to-run
Atest میتواند یک تست را مجبور به رد کردن مرحله پاکسازی یا جداسازی کند. بسیاری از تستها، مانند CTS، پس از اجرای تست، دستگاه را پاکسازی میکنند، بنابراین تلاش برای اجرای مجدد تست با -t بدون پارامتر --disable-teardown با شکست مواجه خواهد شد. برای رد کردن مرحله پاکسازی تست و تست مجدد از -d قبل از -t استفاده کنید.
atest -d test-to-runatest -t test-to-run
اجرای متدهای خاص
Atest از اجرای متدهای خاص در یک کلاس تست پشتیبانی میکند. اگرچه کل ماژول باید ساخته شود، اما این کار زمان لازم برای اجرای تستها را کاهش میدهد. برای اجرای متدهای خاص، کلاس را با استفاده از هر یک از روشهای پشتیبانی شده برای شناسایی یک کلاس (Module:Class، مسیر فایل و غیره) شناسایی کنید و نام متد را اضافه کنید:
atest reference-to-class#method1
هنگام مشخص کردن چندین متد، آنها را با کاما از هم جدا کنید:
atest reference-to-class#method1,method2,method3
مثالها:
atest com.android.server.wm.ScreenDecorWindowTests#testMultipleDecorsatest FrameworksServicesTests:ScreenDecorWindowTests#testFlagChange,testRemoval
دو مثال زیر روشهای ترجیحی برای اجرای یک متد واحد، testFlagChange را نشان میدهند. این مثالها نسبت به استفادهی صرف از نام کلاس ارجحیت دارند، زیرا مشخص کردن ماژول یا محل فایل جاوا به Atest اجازه میدهد تا تست را بسیار سریعتر پیدا کند.
استفاده از ماژول:کلاس:
atest FrameworksServicesTests:ScreenDecorWindowTests#testFlagChange
از repo-root اندروید:
atest frameworks/base/services/tests/wmtests/src/com/android/server/wm/ScreenDecorWindowTests.java#testFlagChange
چندین متد میتوانند از کلاسها و ماژولهای مختلف اجرا شوند:
atest FrameworksServicesTests:ScreenDecorWindowTests#testFlagChange,testRemoval ScreenDecorWindowTests#testMultipleDecors
اجرای چندین کلاس
برای اجرای چندین کلاس، آنها را با فاصله از هم جدا کنید، همانطور که برای اجرای چندین تست استفاده میشود. Atest کلاسها را به طور کارآمد میسازد و اجرا میکند، بنابراین مشخص کردن زیرمجموعهای از کلاسها در یک ماژول، عملکرد را نسبت به اجرای کل ماژول بهبود میبخشد.
برای اجرای دو کلاس در یک ماژول:
atest FrameworksServicesTests:ScreenDecorWindowTests FrameworksServicesTests:DimmerTests
برای اجرای دو کلاس در ماژولهای مختلف:
atest FrameworksServicesTests:ScreenDecorWindowTests CtsVideoTestCases:VideoEncoderDecoderTest
اجرای فایلهای باینری GTest
Atest میتواند فایلهای باینری GTest را اجرا کند. از -a برای اجرای این تستها برای تمام معماریهای دستگاه موجود استفاده کنید، که در این مثال armeabi-v7a (ARM 32-bit) و arm64-v8a (ARM 64-bit) هستند.
نمونه تست ورودی:
atest -a libinput_tests inputflinger_tests
برای انتخاب یک باینری GTest خاص برای اجرا، از علامت دونقطه (:) برای مشخص کردن نام آزمایش و از هشتگ (#) برای مشخص کردن بیشتر یک روش خاص استفاده کنید.
برای مثال، برای تعریف آزمون زیر:
TEST_F(InputDispatcherTest, InjectInputEvent_ValidatesKeyEvents)
برای مشخص کردن کل تست، دستور زیر را اجرا کنید:
atest inputflinger_tests:InputDispatcherTest
یا با استفاده از موارد زیر یک تست جداگانه اجرا کنید:
atest inputflinger_tests:InputDispatcherTest#InjectInputEvent_ValidatesKeyEvents
اجرای تستها در TEST_MAPPING
Atest میتواند تستها را در فایلهای TEST_MAPPING اجرا کند.
اجرای تستهای پیشارسال به صورت ضمنی
تستهای presubmit را در فایلهای TEST_MAPPING در دایرکتوریهای فعلی و والد اجرا کنید:
atest
تستهای presubmit را در فایلهای TEST_MAPPING در دایرکتوریهای /path/to/project و والد آن اجرا کنید:
atest --test-mapping /path/to/project
اجرای یک گروه آزمایشی مشخص
گروههای آزمایشی موجود عبارتند از: presubmit (پیشفرض)، postsubmit ، mainline-presubmit و all .
تستهای ارسال پست را در فایلهای TEST_MAPPING در دایرکتوریهای فعلی و والد اجرا کنید:
atest :postsubmit
اجرای تستها از همه گروهها در فایلهای TEST_MAPPING:
atest :all
تستهای ارسال پست را در فایلهای TEST_MAPPING در دایرکتوریهای /path/to/project و والد آن اجرا کنید:
atest --test-mapping /path/to/project:postsubmit
تستهای خط اصلی را در فایلهای TEST_MAPPING در دایرکتوریهای /path/to/project و والد آن اجرا کنید:
atest --test-mapping /path/to/project:mainline-presubmit
اجرای تستها در زیرشاخهها
به طور پیشفرض، Atest فقط تستهای موجود در فایلهای TEST_MAPPING را به سمت بالا (از دایرکتوری فعلی یا دایرکتوری داده شده تا دایرکتوریهای والد آن) جستجو میکند. اگر میخواهید تستهای موجود در فایلهای TEST_MAPPING را در زیردایرکتوریها نیز اجرا کنید، --include-subdirs برای مجبور کردن Atest به شامل کردن آن تستها نیز استفاده کنید:
atest --include-subdirs /path/to/projectاجرای تستها به صورت تکرارشونده
با ارسال آرگومان --iterations تستها را در تکرار اجرا کنید. چه تست قبول شود و چه رد شود، Atest تست را تا رسیدن به حداکثر تکرار تکرار میکند.
مثالها:
به طور پیشفرض، Atest ده بار تکرار میشود. تعداد تکرارها باید یک عدد صحیح مثبت باشد.
atest test-to-run --iterationsatest test-to-run --iterations 5
رویکردهای زیر تشخیص تستهای ناقص را آسانتر میکنند:
رویکرد ۱: تمام تستها را تا زمانی که یک شکست رخ دهد یا به حداکثر تکرار برسد، اجرا کنید.
- زمانی که یک شکست رخ میدهد یا تکرار به دور دهم (به طور پیشفرض) میرسد، متوقف میشود.
atest test-to-run --rerun-until-failure - زمانی که یک شکست رخ میدهد یا تکرار به دور صدم میرسد، متوقف شوید.
atest test-to-run --rerun-until-failure 100
رویکرد ۲: فقط تستهای ناموفق را تا زمان قبولی یا رسیدن به حداکثر تکرار اجرا کنید.
- فرض کنید
test-to-runچندین مورد تست دارد و یکی از تستها با شکست مواجه میشود. فقط تست ناموفق را 10 بار (به طور پیشفرض) یا تا زمانی که تست با موفقیت انجام شود، اجرا کنید.atest test-to-run --retry-any-failure - وقتی تست ناموفق اجرا شد یا به صدمین دور رسید، اجرای آن را متوقف کنید.
atest test-to-run --retry-any-failure 100
اجرای تستها روی AVDها
Atest قادر است تستها را روی یک AVD تازه ایجاد شده اجرا کند. برای ایجاد یک AVD و ساخت مصنوعات، acloud create اجرا کنید، سپس از مثالهای زیر برای اجرای تستهای خود استفاده کنید.
یک AVD را شروع کنید و روی آن تست اجرا کنید:
acloud create --local-instance --local-image && atest test-to-run
شروع یک AVD به عنوان بخشی از یک اجرای آزمایشی:
atest test-to-run --acloud-create "--local-instance --local-image"
برای اطلاعات بیشتر، acloud create --help اجرا کنید.
گزینهها را به ماژول ارسال کنید
Atest قادر است گزینهها را به ماژولهای تست ارسال کند. برای افزودن گزینههای خط فرمان TradeFed به اجرای تست خود، از ساختار زیر استفاده کنید و مطمئن شوید که آرگومانهای سفارشی شما از قالب گزینه خط فرمان Tradefed پیروی میکنند.
atest test-to-run -- [CUSTOM_ARGS]
گزینههای ماژول تست را به آمادهسازها یا اجراکنندههای تست هدف که در فایل پیکربندی تست تعریف شدهاند، ارسال کنید:
atest test-to-run -- --module-arg module-name:option-name:option-valueatest GtsPermissionTestCases -- --module-arg GtsPermissionTestCases:ignore-business-logic-failure:true
گزینهها را به یک نوع یا کلاس runner ارسال کنید:
atest test-to-run -- --test-arg test-class:option-name:option-valueatest CtsVideoTestCases -- --test-arg com.android.tradefed.testtype.JarHosttest:collect-tests-only:true
برای اطلاعات بیشتر در مورد گزینههای فقط آزمایشی، به بخش «ارسال گزینهها به ماژولها» مراجعه کنید.