نقشه برداری آزمایشی

با مجموعه‌ها، منظم بمانید ذخیره و دسته‌بندی محتوا براساس اولویت‌های شما.

این یک معرفی مختصر از Test Mapping و توضیحی در مورد چگونگی شروع آسان پیکربندی تست ها در پروژه متن باز اندروید (AOSP) است.

نقشه برداری آزمایشی چیست؟

Test Mapping یک رویکرد مبتنی بر Gerrit است که به توسعه‌دهندگان اجازه می‌دهد تا قوانین تست قبل و بعد از ارسال را مستقیماً در درخت منبع Android ایجاد کنند و تصمیمات شاخه‌ها و دستگاه‌ها را به زیرساخت آزمایش بسپارند. تعاریف Test Mapping فایل‌های JSON با نام TEST_MAPPING هستند که می‌توانند در هر فهرست منبع قرار گیرند.

Atest می تواند از فایل های TEST_MAPPING برای اجرای آزمایش های پیش ارسال در فهرست های مرتبط استفاده کند. با Test Mapping، می‌توانید همان مجموعه آزمایش‌ها را برای ارسال چک‌ها با یک تغییر ساده در درخت منبع اندروید اضافه کنید.

این نمونه ها را ببینید:

آزمایش‌های پیش ارسال را به TEST_MAPPING برای services.core اضافه کنید

برای ابزار/دکستر با استفاده از واردات، آزمایش‌های پیش ارسال را به TEST_MAPPING اضافه کنید

نقشه برداری آزمایشی برای اجرای آزمایش ها و گزارش نتایج به مهار تست فدراسیون تجارت (TF) متکی است.

تعریف گروه های آزمایشی

تست نقشه برداری آزمایشات گروهی از طریق یک گروه آزمایشی . نام یک گروه آزمایشی می تواند هر رشته ای باشد. برای مثال، presubmit می‌تواند برای گروهی از آزمایش‌ها باشد که هنگام اعتبارسنجی تغییرات اجرا شوند. و پس از ادغام تغییرات می‌توان از تست‌های postsubmit برای اعتبارسنجی ساخت‌ها استفاده کرد.

قوانین اسکریپت ساخت بسته بندی

برای اینکه Trade Federation Test Harness ماژول های تست Test Mapping را برای یک ساخت معین اجرا کند، این ماژول ها باید test_suite را برای Soong یا LOCAL_COMPATIBILITY_SUITE برای Make در یکی از این دو مجموعه داشته باشند:

  • آزمایش‌های عمومی - آزمایش‌هایی که به عملکرد خاص دستگاه بستگی ندارند (مانند سخت‌افزار خاص فروشنده که اکثر دستگاه‌ها ندارند). بیشتر تست‌ها باید در مجموعه تست‌های عمومی باشند، حتی اگر مختص یک ABI یا bitness یا ویژگی‌های سخت‌افزاری مانند HWASan باشند (برای هر ABI یک هدف test_suites جداگانه وجود دارد)، و حتی اگر باید روی یک دستگاه اجرا شوند.
  • تست های دستگاه - تست هایی که به عملکرد خاص دستگاه بستگی دارد. معمولاً این آزمایش‌ها در vendor/ یافت می‌شوند. از آنجایی که «ویژگی دستگاه» به عملکرد ABI یا SoC اشاره نمی‌کند که دستگاه‌های دیگر ممکن است داشته باشند یا نداشته باشند، بلکه فقط به عملکردی اشاره دارد که برای یک دستگاه منحصر به فرد است، این مورد برای تست‌های JUnit به اندازه آزمایش‌های بومی GTest (که معمولاً باید انجام شود) اعمال می‌شود. general-tests باشند حتی اگر مخصوص ABI باشند).

مثال ها:

Android.bp: test_suites: ["general-tests"],
Android.mk: LOCAL_COMPATIBILITY_SUITE := general-tests

پیکربندی تست ها برای اجرا در مجموعه آزمایشی

برای اجرای یک آزمایش در داخل یک مجموعه آزمایشی، آزمایش:

  • نباید ارائه دهنده ساخت داشته باشد.
  • باید پس از اتمام آن پاکسازی شود، برای مثال، با حذف هر فایل موقتی که در طول آزمایش ایجاد شده است.
  • تنظیمات سیستم را به مقدار پیش فرض یا اصلی تغییر دهید.
  • نباید دستگاهی را در وضعیت خاصی فرض کنیم، مثلاً روت آماده باشد. اکثر تست ها برای اجرا نیازی به دسترسی روت ندارند. اگر آزمایشی باید به روت نیاز داشته باشد، باید آن را با یک RootTargetPreparer در AndroidTest.xml آن مشخص کند، مانند مثال زیر:
<target_preparer class="com.android.tradefed.targetprep.RootTargetPreparer"/>

ایجاد فایل های تست نقشه برداری

برای دایرکتوری که نیاز به پوشش آزمایشی دارد، به سادگی یک فایل TEST_MAPPING JSON شبیه مثال زیر اضافه کنید. این قوانین تضمین می‌کند که آزمایش‌ها در بررسی‌های پیش‌ارسال زمانی که فایل‌هایی در آن فهرست یا هر یک از زیر شاخه‌های آن لمس می‌شوند، اجرا می‌شوند.

به دنبال یک مثال

در اینجا یک نمونه فایل TEST_MAPPING (در قالب JSON است اما با نظرات پشتیبانی می شود):

{
  "presubmit": [
    // JUnit test with options and file patterns.
    {
      "name": "CtsWindowManagerDeviceTestCases",
      "options": [
        {
          "include-annotation": "android.platform.test.annotations.RequiresDevice"
        }
      ],
      "file_patterns": ["(/|^)Window[^/]*\\.java", "(/|^)Activity[^/]*\\.java"]
    },
    // Device-side GTest with options.
    {
      "name" : "hello_world_test",
      "options": [
        {
          "native-test-flag": "\"servicename1 servicename2\""
        },
        {
          "native-test-timeout": "6000"
        }
      ]
    }
    // Host-side GTest.
    {
      "name" : "net_test_avrcp",
      "host" : true
    }
  ],
  "postsubmit": [
    {
      "name": "CtsWindowManagerDeviceTestCases"
    }
  ],
  "imports": [
    {
      "path": "frameworks/base/services/core/java/com/android/server/am"
    }
  ]
}

تنظیم ویژگی ها

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

نام ماژول تست یا نام آزمون یکپارچه سازی فدراسیون تجارت (مسیر منبع به فایل XML آزمایشی، به عنوان مثال، uiautomator/uiautomator-demo ) را می توان در مقدار مشخصه name تنظیم کرد. توجه داشته باشید که فیلد نام نمی تواند از name کلاس یا name روش تست استفاده کند. برای محدود کردن تست‌ها برای اجرا، می‌توانید از گزینه‌هایی مانند include-filter در اینجا استفاده کنید. ( استفاده از نمونه شامل فیلتر ) را ببینید.

تنظیمات میزبان یک تست نشان می‌دهد که آیا تست یک تست بدون دستگاه است که روی میزبان اجرا می‌شود یا خیر. مقدار پیش‌فرض false است، به این معنی که آزمایش برای اجرا به یک دستگاه نیاز دارد. انواع تست های پشتیبانی شده عبارتند از: HostGTest برای باینری های GTest و HostTest برای تست های JUnit.

ویژگی file_patterns به شما امکان می دهد لیستی از رشته های regex را برای مطابقت با مسیر نسبی هر فایل کد منبع (نسبت به دایرکتوری حاوی فایل TEST_MAPPING) تنظیم کنید. در مثال بالا، آزمایش CtsWindowManagerDeviceTestCases در پیش ارسال فقط زمانی اجرا می‌شود که هر فایل جاوا با Window یا Activity شروع شود، که در همان فهرست فایل TEST_MAPPING یا هر یک از دایرکتوری‌های فرعی آن وجود دارد، تغییر کند. اسلش های برگشتی \ باید همانطور که در یک فایل JSON هستند حذف شوند.

ویژگی imports به شما امکان می‌دهد بدون کپی کردن محتوا، آزمایش‌ها را در سایر فایل‌های TEST_MAPPING قرار دهید. توجه داشته باشید که فایل های TEST_MAPPING در دایرکتوری های والد مسیر وارد شده نیز گنجانده خواهد شد. نقشه برداری آزمایشی اجازه واردات تودرتو را می دهد. این بدان معناست که دو فایل TEST_MAPPING می‌توانند یکدیگر را وارد کنند و Test Mapping می‌تواند به درستی تست‌های ارائه شده را ادغام کند.

ویژگی گزینه ها شامل گزینه های اضافی خط فرمان TradeFed است.

برای دریافت لیست کاملی از گزینه های موجود برای یک آزمون معین، اجرا کنید:

tradefed.sh run commandAndExit [test_module] --help

برای جزئیات بیشتر در مورد نحوه عملکرد گزینه ها به TradeFed Option Handling مراجعه کنید.

اجرای تست با Atest

برای اجرای قوانین آزمون پیش ارسال به صورت محلی:

  1. به دایرکتوری حاوی فایل TEST_MAPPING بروید.
  2. دستور را اجرا کنید:
atest

همه آزمایش‌های پیش‌ارسال پیکربندی شده در فایل‌های TEST_MAPPING دایرکتوری فعلی و دایرکتوری‌های والد آن اجرا می‌شوند. Atest دو تست را برای پیش ارسال (A و B) پیدا کرده و اجرا می کند.

این ساده‌ترین راه برای اجرای آزمایش‌های پیش ارسال در فایل‌های TEST_MAPPING در فهرست راهنمای فعلی (CWD) و دایرکتوری‌های والد است. Atest فایل TEST_MAPPING را در CWD و همه فهرست‌های والد آن پیدا کرده و از آن استفاده می‌کند.

ساختار کد منبع

مثال زیر نشان می دهد که چگونه فایل های TEST_MAPPING را می توان در درخت منبع پیکربندی کرد.

src
├── project_1
│   └── TEST_MAPPING
├── project_2
│   └── TEST_MAPPING
└── TEST_MAPPING

محتوای src/TEST_MAPPING :

{
  "presubmit": [
    {
      "name": "A"
    }
  ]
}

محتوای src/project_1/TEST_MAPPING :

{
  "presubmit": [
    {
      "name": "B"
    }
  ],
  "postsubmit": [
    {
      "name": "C"
    }
  ],
  "other_group": [
    {
      "name": "X"
    }
  ]}

محتوای src/project_2/TEST_MAPPING :

{
  "presubmit": [
    {
      "name": "D"
    }
  ],
  "import": [
    {
      "path": "src/project_1"
    }
  ]}

تعیین دایرکتوری های هدف

می‌توانید یک فهرست هدف را برای اجرای آزمایش‌ها در فایل‌های TEST_MAPPING در آن فهرست تعیین کنید. دستور زیر دو تست (A, B) را اجرا خواهد کرد.

atest --test-mapping src/project_1

قوانین آزمون ارسال پست در حال اجرا

همچنین می‌توانید از این دستور برای اجرای قوانین تست postsubmit تعریف‌شده در TEST_MAPPING در src_path (پیش‌فرض CWD) و دایرکتوری‌های والد آن استفاده کنید:

atest [--test-mapping] [src_path]:postsubmit

اجرای فقط آزمایش هایی که به هیچ دستگاهی نیاز ندارند

می‌توانید از گزینه --host برای Atest استفاده کنید تا فقط آزمایش‌هایی را که روی میزبان پیکربندی شده‌اند و به هیچ دستگاهی نیاز ندارند، اجرا کنید. بدون این گزینه، Atest هر دو تست را اجرا می‌کند، تست‌هایی که به دستگاه نیاز دارند و تست‌هایی که روی میزبان اجرا می‌شوند و نیازی به دستگاه ندارند. آزمون ها در دو مجموعه مجزا برگزار می شود.

atest [--test-mapping] --host

شناسایی گروه های آزمایشی

می توانید گروه های آزمایشی را در دستور Atest مشخص کنید. دستور زیر تمام تست‌های ارسال ارسال مربوط به فایل‌های دایرکتوری src/ project_1 را اجرا می‌کند که فقط یک تست (C) دارد.

یا می توانید از :all برای اجرای تمام تست ها بدون در نظر گرفتن گروه استفاده کنید. دستور زیر چهار تست (A، B، C، X) را اجرا می کند:

atest --test-mapping src/project_1:all

از جمله زیر شاخه ها

به‌طور پیش‌فرض، آزمایش‌های در حال اجرا در TEST_MAPPING با Atest فقط آزمایش‌های پیش‌ارسال پیکربندی‌شده در فایل TEST_MAPPING در CWD (یا دایرکتوری داده‌شده) و دایرکتوری‌های والد آن را اجرا می‌کنند. اگر می‌خواهید آزمایش‌هایی را در همه فایل‌های TEST_MAPPING در زیرمجموعه‌ها اجرا کنید، از گزینه --include-subdir استفاده کنید تا Atest را مجبور کنید آن تست‌ها را نیز شامل شود.

atest --include-subdir

بدون گزینه --include --include-subdir ، Atest فقط تست A را اجرا می کند. با گزینه --include --include-subdir ، Atest دو تست (A, B) را اجرا می کند.

نظر در سطح خط پشتیبانی می شود

می‌توانید یک نظر در سطح خط // -قالب اضافه کنید تا فایل TEST_MAPPING را با شرح تنظیمات زیر تکمیل کنید. ATest و فدراسیون تجارت، TEST_MAPPING را به یک فرمت JSON معتبر بدون نظر پردازش می کنند. برای تمیز نگه داشتن فایل JSON و خواندن آسان، فقط نظرات با فرمت در سطح خط // پشتیبانی می شود.

مثال:

{
  // For presubmit test group.
  "presubmit": [
    {
      // Run test on module A.
      "name": "A"
    }
  ]
}