این صفحه نحوه نوشتن یک تست دستگاه به سبک JUnit4 که توسط میزبان هدایت میشود را شرح میدهد. این بدان معناست که سمت میزبانِ مهار، اقداماتی را علیه دستگاه آغاز خواهد کرد.
توجه داشته باشید که ما تستهای «سمت میزبان» و تستهای «میزبان-محور» را کمی متفاوت در نظر میگیریم:
- تست مبتنی بر میزبان: تستی است که روی میزبان اجرا میشود و با یک یا چند دستگاه در تعامل است. سیستم تحت آزمایش (SUT) روی خود میزبان نیست، بلکه از طریق میزبان آزمایش میشود.
- تست سمت میزبان: تستی است که صرفاً روی میزبان اجرا میشود و چیزی را فقط روی میزبان آزمایش میکند، مثلاً تستهای واحد.
چرا به جای تست ابزار دقیق، یک تست مبتنی بر میزبان ایجاد کنیم؟
برخی از آزمایشها ممکن است نیاز داشته باشند که شما وضعیت کلی دستگاه را تغییر دهید، مانند صدور دستور راهاندازی مجدد. در مورد آزمایش ابزار دقیق، راهاندازی مجدد، ابزار دقیق را از کار میاندازد، آزمایش نمیتواند ادامه یابد و هیچ نتیجهای در دسترس نخواهد بود.
تستهای مبتنی بر میزبان همچنین میتوانند مراحل راهاندازی اضافی را که نیاز به تعامل با دستگاههای خارجی دارند که تست به آنها وابسته است، هدایت کنند.
یک تست مبتنی بر میزبان میتواند این موارد استفاده را مدیریت کند و امکان تست پیشرفته دستگاه را با سناریوهای بیشتر فراهم کند. اگر در چنین شرایطی هستید، نوشتن یک تست مبتنی بر میزبان منطقیترین گزینه است.
تستهای مبتنی بر میزبان چگونه در TF نوشته میشوند؟
در اینجا یک نمونه آورده شده است:
@RunWith(DeviceJUnit4ClassRunner.class)
public class SampleHostJUnit4DeviceTest extends BaseHostJUnit4Test {
@Before
public void setUp() throws Exception {
// Some setup
}
@Test
public void testCheckWeHaveDevice() throws Exception {
Assert.assertNotNull(getDevice());
}
}
تستهای مبتنی بر میزبان در Trade Federation توسط اجراکننده تست JUnit4 DeviceJUnit4ClassRunner هدایت میشوند. ساختار کلی کلاس تست مشابه یک تست JUnit4 معمولی است:
-
@BeforeClass -
@Before -
@Test -
@After -
@AfterClass -
Assume،Assert
توسعه BaseHostJunit4Test راهی برای به ارث بردن API ابزارهای تست مفید مانند موارد زیر است:
-
installPackage: امکان نصب یک فایل APK را روی دستگاه هدف فراهم میکند. -
installPackageAsUser: به شما امکان میدهد تا یک فایل APK را به عنوان کاربر روی دستگاه هدف نصب کنید. -
uninstallPackage: به شما امکان میدهد یک فایل APK را حذف نصب کنید. -
isPackageInstalled: بررسی میکند که آیا یک بسته نصب شده است یا خیر. -
hasDeviceFeature: بررسی میکند که آیا دستگاه از یک ویژگی پشتیبانی میکند یا خیر. (pm list features) -
runDeviceTests(DeviceTestRunOptions options): با استفاده از DeviceTestRunOptions ، یک تست ابزار دقیق را روی یک دستگاه هدف اجرا میکند تا تمام گزینههای ممکن را مدیریت کند.
همچنین دسترسی به شیء دستگاه Tradefed را فراهم کنید:
-
getDevice(): یک شیء دستگاه TF را برای دستکاری دستگاه برمیگرداند. -
getBuild(): یک شیء TF از نوع اطلاعات ساخت را برمیگرداند تا اطلاعات مربوط به ساخت را دریافت کند. -
getAbi(): ABI که تست روی آن اجرا میشود را برمیگرداند.
پشتیبانی Tradefed: آمادهسازی و پاکسازی دستگاهها در هر کلاس
JUnit4 @BeforeClass و @AfterClass فقط برای متدهای استاتیک قابل استفاده هستند، که استفاده از هندلر #getDevice() را برای انجام برخی تنظیمات یا پاکسازیهای مختص دستگاه، یکباره و برای هر کلاس غیرممکن میکند. برای حل این مشکل، از حاشیهنویسی Tradefed استفاده کنید.
- @BeforeClassWithInfo: قبل از حاشیهنویسیهای @BeforeClass اجرا میشود
- @AfterClassWithInfo: بعد از حاشیهنویسیهای @AfterClass اجرا میشود
@BeforeClassWithInfo
public static void beforeClassWithDevice(TestInformation testInfo) {
assertNotNull(testInfo.getDevice());
testInfo.properties().put("mytest:test-prop", "test");
}
@AfterClassWithInfo
public static void afterClassWithDevice(TestInformation testInfo) {
assertNotNull(testInfo.getDevice());
testInfo.properties().put("mytest:test-prop", "test");
}
TestInformation به شما امکان میدهد از دستگاه استفاده کنید و ویژگیهایی را ذخیره کنید که میتوانند در محدوده استاتیک یا غیر استاتیک استفاده شوند. BaseHostJUnit4Test از دریافت TestInformation در یک محدوده غیر استاتیک از طریق #getTestInformation() پشتیبانی میکند.
اگر BaseHostJUnit4Test ارثبری نمیکنید، میتوانید ITestInformationReceiver برای دریافت شیء TestInformation پیادهسازی کنید.
چگونه یک تست مبتنی بر میزبان را در Tradefed پیکربندی کنیم؟
در فایل پیکربندی XML Tradefed، تستهای مبتنی بر میزبان از طریق اجراکننده HostTest اجرا میشوند.
<test class="com.android.tradefed.testtype.HostTest" >
<option name="class" value="android.sample.cts.SampleHostJUnit4DeviceTest" />
</test>