یک دونده تست Tradefed بنویسید

این صفحه نحوه نوشتن یک تست رانر جدید در Tradefed را شرح می‌دهد.

پیشینه

اگر در مورد جایگاه اجراکنندگان تست در معماری Tradefed کنجکاو هستید، به ساختار یک اجراکننده تست مراجعه کنید.

این پیش‌نیاز نوشتن یک اجراکننده‌ی تست جدید نیست؛ اجراکننده‌های تست را می‌توان به صورت جداگانه نوشت.

حداقل موارد: پیاده‌سازی رابط کاربری

حداقل شرایط لازم برای احراز صلاحیت به عنوان یک اجراکننده تست Tradefed، پیاده‌سازی رابط IRemoteTest و به طور خاص‌تر، متد run(TestInformation testInfo, ITestInvocationListener listener) است.

این متد، متدی است که هنگام استفاده از اجراکننده‌ی تست، توسط harness فراخوانی می‌شود، مشابه Java Runnable.

هر بخش از آن متد، بخشی از اجرای تست رانِر (test runner) محسوب می‌شود.

گزارش نتایج حاصل از اجرای تست

متد run در رابط پایه، دسترسی به یک شیء شنونده از نوع ITestInvocationListener را فراهم می‌کند. این شیء کلید گزارش نتایج ساختاریافته از اجراکننده تست به Harness است.

با گزارش نتایج ساختاریافته، یک اجراکننده تست دارای ویژگی‌های زیر است:

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

با این اوصاف، گزارش نتایج ساختاریافته اختیاری است؛ یک اجراکننده‌ی تست ممکن است صرفاً بخواهد وضعیت کل اجرا را به صورت «با موفقیت» (PASSED) یا «با شکست» (FAILED) ارزیابی کند، بدون اینکه جزئیاتی از اجرای واقعی ارائه دهد.

رویدادهای زیر را می‌توان برای شنونده فراخوانی کرد تا مهار را از پیشرفت فعلی اجراها مطلع کند:

  • testRunStarted: شروع گروهی از موارد آزمایشی مرتبط با هم را اعلام می‌کند.
    • testStarted: شروع یک مورد آزمایشی را اطلاع می‌دهد.
    • testFailed/testIgnored: تغییر وضعیت Test Case در حال انجام را اطلاع می‌دهد. Test Case بدون هیچ گونه تغییر وضعیتی، Pass شده در نظر گرفته می‌شود.
    • testEnded: پایان یافتن مورد آزمایشی را اعلام می‌کند.
  • testRunFailed: اطلاع می‌دهد که وضعیت کلی اجرای گروه موارد آزمایشی ناموفق است. یک اجرای آزمایشی می‌تواند مستقل از نتایج موارد آزمایشی، بسته به آنچه اجرا انتظار داشته، قبول یا رد شود . به عنوان مثال، یک فایل باینری که چندین مورد آزمایشی را اجرا می‌کند، می‌تواند همه موارد آزمایشی قبول را گزارش کند، اما با یک کد خروج خطا (به هر دلیلی: فایل‌های لو رفته و غیره).
  • testRunEnded: پایان گروه موارد آزمایش را اعلام می‌کند.

نگهداری و اطمینان از ترتیب صحیح فراخوانی‌ها، مسئولیت پیاده‌سازی اجراکننده‌ی تست است، برای مثال، اطمینان از اینکه testRunEnded در صورت بروز استثنا با استفاده از یک عبارت finally فراخوانی می‌شود.

فراخوانی‌های مربوط به موارد آزمایشی ( testStarted ، testEnded و غیره) اختیاری هستند. اجرای آزمایشی ممکن است بدون هیچ مورد آزمایشی انجام شود.

ممکن است متوجه شده باشید که این ساختار رویدادها از ساختار معمول JUnit الهام گرفته شده است. این کار عمداً برای این انجام شده است که همه چیز به چیزهای اساسی که توسعه‌دهندگان معمولاً در مورد آن اطلاعات دارند، نزدیک باشد.

گزارش گزارش‌ها از اجراکننده‌ی تست

اگر در حال نوشتن کلاس تست یا runner مخصوص Tradefed خود هستید، IRemoteTest را پیاده‌سازی خواهید کرد و از طریق متد run() یک ITestInvocationListener دریافت خواهید کرد. این listener می‌تواند برای ثبت فایل‌ها به صورت زیر استفاده شود:

    listener.testLog(String dataName, LogDataType type_of_data, InputStreamSource data);

با دستگاه تست کنید

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

نویسندگان آزمایشی که می‌خواهند به مرحله بعدی آزمایش دستگاه بروند، به رابط‌های زیر نیاز دارند:

  • IDeviceTest امکان دریافت شیء ITestDevice را فراهم می‌کند که نشان‌دهنده‌ی دستگاه تحت آزمایش است و API لازم برای تعامل با آن را فراهم می‌کند.
  • IBuildReceiver به تست اجازه می‌دهد تا شیء IBuildInfo ایجاد شده در مرحله ارائه دهنده ساخت را که شامل تمام اطلاعات و مصنوعات مربوط به تنظیمات تست است، دریافت کند.

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

با چندین دستگاه تست کنید

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

برای نوشتن یک اجراکننده تست که بتواند از چندین دستگاه استفاده کند، باید IMultiDeviceTest را پیاده‌سازی کنید، که به شما امکان می‌دهد نقشه‌ای از ITestDevice به IBuildInfo دریافت کنید که شامل لیست کامل نمایش‌های دستگاه و اطلاعات ساخت مرتبط با آنها است.

تابع تنظیم‌کننده (setter) از رابط کاربری همیشه قبل از متد run فراخوانی می‌شود، بنابراین می‌توان با اطمینان فرض کرد که ساختار هنگام فراخوانی run در دسترس خواهد بود.

آزمایش‌هایی که از تنظیمات خود آگاه هستند

برخی از پیاده‌سازی‌های اجراکننده‌ی تست ممکن است برای عملکرد صحیح به اطلاعاتی در مورد تنظیمات کلی نیاز داشته باشند، برای مثال برخی فراداده‌ها در مورد فراخوانی، یا اینکه کدام target_preparer قبلاً اجرا شده است و غیره.

برای دستیابی به این هدف، یک اجراکننده‌ی تست می‌تواند به شیء IConfiguration که بخشی از آن است و در آن اجرا می‌شود، دسترسی پیدا کند. برای جزئیات بیشتر به توضیحات شیء پیکربندی مراجعه کنید.

برای پیاده‌سازی اجراکننده‌ی تست، باید IConfigurationReceiver را پیاده‌سازی کنید تا شیء IConfiguration را دریافت کند.

تست رانر انعطاف‌پذیر

اگر اجراکننده‌های تست (Test Runners) کنترل دقیقی روی آنها داشته باشند، می‌توانند روشی انعطاف‌پذیر برای اجرای تست‌های خود ارائه دهند، برای مثال، یک اجراکننده تست JUnit می‌تواند هر تست واحد را به صورت جداگانه اجرا کند.

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

پشتیبانی از فیلترینگ در رابط ITestFilterReceiver شرح داده شده است، که امکان دریافت مجموعه‌ای از فیلترهای include و exclude برای تست‌هایی که باید یا نباید اجرا شوند، فراهم می‌کند.

قرارداد ما این است که یک تست در صورتی اجرا می‌شود که با یک یا چند فیلتر شامل مطابقت داشته باشد و با هیچ یک از فیلترهای حذف مطابقت نداشته باشد. اگر هیچ فیلتر شاملی داده نشده باشد، تمام تست‌ها باید اجرا شوند، مادامی که با هیچ یک از فیلترهای حذف مطابقت نداشته باشند.