مفاهیم و پیادهسازی Jetpack Compose
آزمایش دسترسیپذیری به شما این امکان را میدهد که برنامه خود را از دیدگاه کاربر تجربه کنید و مشکلات کاربردپذیری را که ممکن است از قلم افتاده باشند، پیدا کنید. آزمایش دسترسیپذیری میتواند فرصتهایی را برای قدرتمندتر و همهکارهتر کردن برنامه شما برای همه کاربران، از جمله افراد دارای معلولیت، آشکار کند.
این سند رویکردهای زیر را شرح میدهد:
- آزمایش با استفاده از ابزارهای تحلیل : از ابزارها برای کشف فرصتهایی برای بهبود دسترسیپذیری برنامه خود استفاده کنید.
- تست خودکار : تست دسترسیپذیری را در Espresso و Robolectric فعال کنید.
آزمایش با استفاده از ابزارهای تحلیل
ابزارهای تحلیل میتوانند فرصتهایی را برای بهبود دسترسیپذیری کشف کنند که ممکن است با آزمایش دستی از دست بدهید.
اسکنر دسترسی
برنامهی «اسکنر دسترسیپذیری» صفحهی شما را اسکن میکند و راههایی برای بهبود دسترسیپذیری برنامهتان پیشنهاد میدهد. «اسکنر دسترسیپذیری» از « چارچوب تست دسترسیپذیری» استفاده میکند و پس از بررسی برچسبهای محتوا، موارد قابل کلیک، کنتراست و موارد دیگر، پیشنهادهای خاصی ارائه میدهد.
چارچوب تست دسترسیپذیری اندروید (Android Accessibility Test Framework) در اندروید استودیو ادغام شده است تا به شما در یافتن مشکلات دسترسیپذیری در طرحبندیهایتان کمک کند. برای اجرای این پنل، روی دکمه گزارش خطا (error report button!) در ویرایشگر طرحبندی (Layout Editor) کلیک کنید.
شکل ۱. نسخه نمایشی اسکنر دسترسیپذیری.
برای مطالعه بیشتر، به منابع زیر مراجعه کنید:
نمایشگر خودکار رابط کاربری
ابزار uiautomatorviewer یک رابط کاربری گرافیکی (GUI) مناسب برای اسکن و تجزیه و تحلیل اجزای رابط کاربری که در حال حاضر در یک دستگاه مبتنی بر اندروید نمایش داده میشوند، ارائه میدهد. میتوانید از UI Automator برای بررسی سلسله مراتب طرحبندی و مشاهده ویژگیهای اجزای رابط کاربری که در پیشزمینه دستگاه قابل مشاهده هستند، استفاده کنید. این اطلاعات به شما امکان میدهد تستهای دقیقتری ایجاد کنید، به عنوان مثال با ایجاد یک انتخابگر رابط کاربری که با یک ویژگی قابل مشاهده خاص مطابقت دارد. این ابزار در دایرکتوری tools در Android SDK قرار دارد.
در تست دسترسیپذیری، این ابزار برای اشکالزدایی مشکلاتی که با استفاده از سایر روشهای تست یافت میشوند، مفید است. به عنوان مثال، اگر تست دستی نشان دهد که یک نما متن قابل خواندن مورد نیاز خود را ندارد یا یک نما در زمانی که نباید، فوکوس دریافت میکند، میتوانید از این ابزار برای یافتن منبع مشکل استفاده کنید.
برای کسب اطلاعات بیشتر در مورد UI Automator Viewer، به بخش «نوشتن تستهای خودکار با UI Automator» مراجعه کنید.
پرز
اندروید استودیو برای مشکلات مختلف دسترسیپذیری، هشدارهای lint را نشان میدهد و پیوندهایی به مکانهای مرتبط در کد منبع شما ارائه میدهد. در مثال زیر، یک تصویر فاقد ویژگی contentDescription است. فقدان توضیحات محتوا منجر به پیام زیر میشود:
[Accessibility] Missing 'contentDescription' attribute on image
شکل 2 نمونهای از نحوه نمایش این پیام در اندروید استودیو را نشان میدهد:
contentDescription است.تست خودکار
پلتفرم اندروید از چندین چارچوب تست، مانند Espresso، پشتیبانی میکند که به شما امکان میدهد تستهای خودکاری ایجاد و اجرا کنید که قابلیت دسترسی برنامه شما را ارزیابی میکنند.
اسپرسو
Espresso یک کتابخانه تست اندروید است که برای سریع و آسان کردن تست رابط کاربری طراحی شده است. این کتابخانه به شما امکان میدهد با اجزای رابط کاربری تحت تست در برنامه خود تعامل داشته باشید و تأیید کنید که رفتارهای خاصی رخ میدهد یا شرایط خاصی برآورده میشود.
برای دیدن یک مرور ویدیویی از تست دسترسیپذیری با Espresso، ویدیوی زیر را از دقیقه ۳۱:۵۴ تا ۳۴:۱۹ تماشا کنید: طراحی و تست فراگیر: دسترسیپذیری برنامه شما را افزایش میدهد - Google I/O 2016 .
این بخش نحوهی اجرای بررسیهای دسترسیپذیری با استفاده از Espresso را شرح میدهد.
فعال کردن چکها
شما میتوانید تست دسترسیپذیری را با استفاده از کلاس AccessibilityChecks فعال و پیکربندی کنید:
کاتلین
import androidx.test.espresso.accessibility.AccessibilityChecks
@RunWith(AndroidJUnit4::class)
@LargeTest
class MyWelcomeWorkflowIntegrationTest {
init {
AccessibilityChecks.enable()
}
}
جاوا
import androidx.test.espresso.accessibility.AccessibilityChecks;
@RunWith(AndroidJUnit4.class)
@LargeTest
public class MyWelcomeWorkflowIntegrationTest {
@BeforeClass
public void enableAccessibilityChecks() {
AccessibilityChecks.enable();
}
}
به طور پیشفرض، بررسیها هنگام انجام هر اقدام view تعریف شده در ViewActions اجرا میشوند. هر بررسی شامل view ای که عمل روی آن انجام میشود و همچنین تمام view های فرزند آن است. میتوانید کل سلسله مراتب view های یک صفحه را در طول هر بررسی با ارسال true به setRunChecksFromRootView() ارزیابی کنید، همانطور که در قطعه کد زیر نشان داده شده است:
کاتلین
AccessibilityChecks.enable().setRunChecksFromRootView(true)
جاوا
AccessibilityChecks.enable().setRunChecksFromRootView(true);
زیرمجموعههای نتایج را حذف کنید
پس از اینکه Espresso بررسیهای دسترسیپذیری را روی برنامه شما انجام داد، ممکن است فرصتهای متعددی برای بهبود دسترسیپذیری برنامه خود پیدا کنید که نمیتوانید فوراً به آنها رسیدگی کنید. برای جلوگیری از شکست مداوم تستهای Espresso به دلیل این نتایج، میتوانید آنها را موقتاً نادیده بگیرید. چارچوب تست دسترسیپذیری (ATF) این قابلیت را با استفاده از متد setSuppressingResultMatcher() ارائه میدهد، که به Espresso دستور میدهد تمام نتایجی را که عبارت تطبیقدهنده داده شده را برآورده میکنند، سرکوب کند.
وقتی در برنامه خود تغییراتی ایجاد میکنید که به یک جنبه از دسترسیپذیری میپردازد، برای Espresso مفید است که نتایج را برای هر چه بیشتر جنبههای دیگر دسترسیپذیری نشان دهد. به همین دلیل، بهتر است فقط فرصتهای شناختهشده خاص برای بهبود را سرکوب کنید.
وقتی یافتههای تست دسترسیپذیری را که قصد دارید بعداً به آنها رسیدگی کنید، موقتاً غیرفعال میکنید، مهم است که بهطور تصادفی یافتههای مشابه را غیرفعال نکنید. به همین دلیل، از تطبیقدهندههایی استفاده کنید که دامنهی محدودی دارند. برای انجام این کار، تطبیقدهندهای را انتخاب کنید تا Espresso فقط در صورتی نتیجهی مورد نظر را غیرفعال کند که هر یک از بررسیهای دسترسیپذیری زیر را برآورده کند:
- بررسیهای دسترسیپذیری از نوع خاص، مانند مواردی که اندازه هدف لمسی را بررسی میکنند.
- بررسیهای دسترسیپذیری که یک عنصر رابط کاربری خاص، مانند یک دکمه، را ارزیابی میکنند.
ATF چندین تطبیقدهنده تعریف میکند تا به شما در تعیین نتایجی که باید در تستهای Espresso خود نشان دهید، کمک کند. مثال زیر نتایج بررسیهایی را که مربوط به کنتراست رنگ یک عنصر TextView هستند، نادیده میگیرد. شناسه عنصر countTV است.
کاتلین
AccessibilityChecks.enable().apply {
setSuppressingResultMatcher(
allOf(
matchesCheck(TextContrastCheck::class.java),
matchesViews(withId(R.id.countTV))
)
)
}
جاوا
AccessibilityValidator myChecksValidator =
AccessibilityChecks.enable()
.setSuppressingResultMatcher(
allOf(
matchesCheck(TextContrastCheck.class),
matchesViews(withId(R.id.countTV))));