یک تست بدون دستگاه سمت میزبان در TF بنویسید

این صفحه به شما می‌گوید که چگونه یک تست سمت میزبان بنویسید که به دستگاهی نیاز ندارد، مانند تستی که روی یک نمونه GCE لینوکس اجرا می‌شود. (برای جزئیات بیشتر در مورد نوشتن یک تست مبتنی بر میزبان که به دستگاهی نیاز دارد، به بخش «نوشتن یک تست مبتنی بر میزبان» در Trade Federation مراجعه کنید.)

انواع تست سمت میزبان

شما می‌توانید چندین نوع تست سمت میزبان را از طریق فدراسیون تجارت (TF) اجرا کنید.

آزمون‌های بومی (gtest)

برای آزمایش یک پلتفرم، تست‌های بومی (gtests) ایجاد کنید. اگر تست به دستگاهی نیاز ندارد، آن را روی یک میزبان اجرا کنید؛ به این ترتیب تست بسیار سریع‌تر اجرا می‌شود. برای پیکربندی چنین تست‌هایی برای اجرا روی یک میزبان آزمایشی، از اجراکننده TF HostGTest استفاده کنید.

این یک نمونه پیکربندی تست TradeFed است:

<configuration description="Runs hello_world_test.">
    <option name="null-device" value="true" />
    <test class="com.android.tradefed.testtype.HostGTest" >
        <option name="module-name" value="hello_world_test" />
    </test>
</configuration>

پیکربندی تست، یک تست gtest ( hello_world_test ) را روی یک میزبان اجرا می‌کند. پیکربندی تست نمونه می‌تواند به صورت خودکار تولید شود. مگر اینکه تست شما نیاز به تنظیم یا پاکسازی خاصی داشته باشد، می‌توانید برای ایجاد پیکربندی‌های مناسب تست TF به تولید خودکار پیکربندی تست اعتماد کنید.

برای پیکربندی gtest سمت میزبان و فعال کردن تولید خودکار پیکربندی test، host_supported در Android.bp مانند hello_world_test روی true تنظیم کنید.

برای اطلاعات بیشتر در مورد نوشتن یک آزمون بومی، به افزودن یک مثال آزمون بومی جدید مراجعه کنید.

تست‌های میزبان JAR

تست‌های میزبان JAR (جاوا) ، مانند JUnit، تست‌هایی هستند که نیازی به اجرا روی دستگاه ندارند و پوشش کد پروژه جاوای شما را فراهم می‌کنند. چنین تست‌هایی را می‌توان با استفاده از اجراکننده HostTest طوری پیکربندی کرد که روی یک میزبان تست اجرا شوند.

نمونه پیکربندی آزمایشی TradeFed

<configuration description="Executes HelloWorldHostTest">
    <test class="com.android.tradefed.testtype.HostTest" >
        <option name="jar" value="HelloWorldHostTest.jar" />
    </test>
</configuration>

پیکربندی تست، یک تست JUnit سمت میزبان از HelloWorldHostTest را اجرا می‌کند. توجه داشته باشید که پیکربندی تست فوق می‌تواند به صورت خودکار تولید شود. مگر اینکه تست شما نیاز به تنظیم یا پاکسازی خاصی داشته باشد، برای ایجاد پیکربندی تست TradeFed مناسب، به تولید خودکار پیکربندی تست تکیه کنید.

برای جزئیات بیشتر در مورد نحوه نوشتن تست میزبان JAR، به صفحه تست‌های میزبان JAR (Java) مراجعه کنید.

تست‌های میزبان جاوای ایزوله

تست‌های جاوا بدون دستگاه را می‌توان در یک محیط ایزوله با کمی هزینه عملکرد اجرا کرد. با این حال، قبل از انتخاب استفاده از این محیط، باید ملاحظات مهمی را در نظر گرفت.

  • این اجراکننده پیش‌فرض مورد استفاده برای تست‌های واحد Robolectric و JUnit است.
  • Tradefed فقط از تست‌های JUnit در محیط ایزوله پشتیبانی می‌کند.
  • فقط وابستگی‌های استاتیک پشتیبانی می‌شوند. هیچ وابستگی‌ای که با lib اعلان شده باشد، در مسیر کلاس لحاظ نمی‌شود.
  • ایزولاسیون رانِر فقط شیم رانِر و محفظه آزمایش شما را در مسیر کلاس قرار می‌دهد.
  • به ازای هر اجرای آزمایشی که با این اجراکننده انجام می‌شود، مقداری سربار ثابت وجود دارد.

نمونه پیکربندی آزمایشی Tradefed (ایزوله)

<configuration description="Executes HelloWorldHostTest">
    <test class="com.android.tradefed.testtype.IsolatedHostTest" >
        <option name="jar" value="HelloWorldHostTest.jar" />
    </test>
</configuration>

نمونه پیکربندی Soong برای تولید خودکار

به جای ایجاد دستی پیکربندی آزمایشی مانند بالا ، Soong می‌تواند با استفاده از تعریفی مانند این مثال، پیکربندی را به صورت خودکار تولید کند.

java_test_host {
    name: "HelloWorldHostTest",

    test_options: {
        unit_test: true,
    },

    test_suites: ["general-tests"],

    srcs: ["test/**/*.java"],

    static_libs: [
        "junit",
    ],
}

تست‌های روبولکتیک

تست‌های Roboelectric از همان runner تست‌های میزبان ایزوله، به همراه چند گزینه خاص، استفاده می‌کنند.

  • گزینه robolectric-resources امکان ارسال چند گزینه خط فرمان مخصوص Robolectric به subprocess را فراهم می‌کند و همچنین ساختار درختی android-all را به مسیر کلاس subprocess اضافه می‌کند. در حالی که دو مورد دیگر بهترین شیوه‌ها هستند، این گزینه برای اجرای تست‌های Robolectric با هرگونه موفقیتی الزامی است.
  • گزینه java-folder امکان تغییر زمان اجرای جاوا مورد استفاده توسط زیرفرآیند را فراهم می‌کند. این امر به دلیل ترجیح Robolectric بر نسخه‌های خاصی از جاوا که ممکن است با JVM ترجیحی سیستم میزبان همسو نباشند، ضروری است.
  • گزینه exclude-paths به اجراکننده زیرفرآیند اجازه می‌دهد تا از بارگیری ماژول‌های خاص به طور کلی اجتناب کند، که زمانی مفید است که یک JAR با کلاس‌های اضافی همراه باشد که می‌توانند باعث خطاهای بارگیری شوند. java. یک استثنای رایج است تا از بروز استثنائات SecurityException جلوگیری شود.

نمونه پیکربندی Roboelectric

<configuration description="Executes a Sample Robolectric Test">
    <option name="java-folder" value="prebuilts/jdk/jdk9/linux-x86/" />
    <option name="exclude-paths" value="java" />
    <option name="use-robolectric-resources" value="true" />
    <test class="com.android.tradefed.testtype.IsolatedHostTest">
        <option name="jar" value="RobolectricExampleTest.jar" />
    </test>
</configuration>

نمونه پیکربندی Soong برای تولید خودکار Roboelectric

به جای ایجاد دستی پیکربندی آزمایشی مانند بالا ، Soong می‌تواند با استفاده از تعریفی مانند این مثال، پیکربندی را به صورت خودکار تولید کند.

android_robolectric_test {
    name: "HelloWorldRoboTest",
    srcs: [
        "src/**/*.java",
    ],

    // Include the testing libraries
    static_libs: [
        "mockito-robolectric-prebuilt",
        "platform-test-annotations",
        "testng",
        "truth-prebuilt",
    ],

    instrumentation_for: "HelloWorldApp",
}

آزمون پایتون

اگر منطق تست در پایتون نوشته شده است، از نوع ساخت python_test_host برای ایجاد یک فایل par که می‌تواند توسط TF PythonBinaryHostTest اجرا شود، استفاده کنید.

نمونه پیکربندی آزمایشی TradeFed

<configuration description="Config to run atest unittests">
    <test class="com.android.tradefed.testtype.python.PythonBinaryHostTest" >
        <option name="par-file-name" value="atest_unittests" />
        <option name="test-timeout" value="2m" />
    </test>
</configuration>

تنظیمات مجموعه تست

برای اینکه تست سمت میزبان توسط TF برای یک ساخت مشخص قابل دسترسی باشد، تنظیمات ماژول تست `test_suites` را روی `general-tests` تنظیم کنید:

test_suites: ["general-tests"],

با این تنظیم، تست در فایل general-tests.zip روی هدف test_suites بسته‌بندی می‌شود.