آموزش توسعۀ آزمون محور (TDD) در اندروید – قسمت دوم

نویسنده : سید ایوب کوکبی ۲۹ اسفند ۱۳۹۷

آموزش توسعۀ آزمون محور (TDD) در اندروید – قسمت دوم

همانطور که در مطلب قبلی خواندید، در TDD با نوشتن تست قبل از پیاده‌سازی، راهی مناسب برای تضمین کیفیت کدها در اختیار داریم. در ادامه شما را با هرم تست، انوع تست در اندروید و تنظیم ساختار پروژه برای استفاده از TDD آشنا می‌کنیم.

هرم تست (Testing pyramid)

هرم تست در اندروید چیزی شبیه این است:

هرم تست

از پایین شروع می‌کنیم:

تست واحد (Unit Testing) بیشترین حجم تست در هرم را اشغال کرده است. این تست در کوچک‌ترین سطح برنامه مثلاً در سطح متدها و کلاس‌ها نوشته می‌شود تا از صحت عملکرد واحد‌های سازندۀ برنامه اطمینان حاصل کنیم.

تست یکپارچگی (Integration Testing) صحت عملکرد واحدهای کوچک برنامه را در کنار یکدیگر می‌سنجد. در واقع هدف این تست اطمینان از این موضوع است که آن واحدهایی که به صورت مستقل کار خود را درست انجام داده‌اند آیا در کنار یکدیگر نیز به همان صورت درست کار می‌کنند یا نه.

تست کارکردی (Functional Testing) همانطور که از اسمش پیداست، کارکرد درست برنامه را می‌سنجد. حال که همۀ تست‌های واحد و یکپارچگی درست اجرا شده‌اند آیا برنامه عملکرد مورد انتظار ما را از خود بروز می‌دهد یا نه.

تست دستی (Manual Testing) هم معلوم است. تسترها در نقش کاربران نهایی ویژگی‌های مختلف برنامه را آزمایش می‌کنند تا از عملکرد بدون نقصشان اطمینان حاصل کنند. این تسترها معمولاً طبق یک test plan کارشان را انجام می‌دهند.

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

بخوانید  تست کدها در اندروید - بخش اول

انواع تست در اندروید

تست واحد (Unit Testing):

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

ابزارهای مورد استفاده:

  • JUnit: فریم‌ورکی ساده برای نوشتن تست‌های تکرارپذیر است. این فریم‌ورک مبتنی بر معماری xUnit بوده و مخصوص آزمون واحد ساخته شده است؛
  • Robolectric: چارچوب معروف دیگری برای اجرای سریع تست‌های واحد است. این فریم‌ورک تست‌ها را بدون نیاز به دستگاه یا ایمیلیتور مستقیماً روی JVM اجرا می‌کند و به همین دلیل سرعت اجرای بالایی دارد.

چارچوب‌ها و کتابخانه‌های فروان دیگری نیز مثل Mockito, Powermock, Hamcrest, Fest, AssertJ و … وجود دارند که در اینجا قصد معرفی آن‌ها را نداریم.

تست ابزاری (Instrumentation Testing):

در دنیای اندروید این تست معادل همان تست یکپارچگی یا Integration Test است و کارش سنجش تعامل کاربر با عناصر برنامه است مثلاً کلیک کردن روی دکمه‌ها، نوشتن متن در EditText، انتخاب یکی از آیتم‌های منو و … . تست ابزاری در واقع مجموعه‌ای از قلاب‌ها (Hooks) در سیستم‌عامل اندروید است که به شما اجازه می‌دهد چرخۀ حیات کامپوننت‌های اندروید را خودتان به دست بگیرید (یعنی به جای اینکه کنترل چرخۀ حیات اکتیویتی‌‌ها را به سیستم‌عامل بدهید، خودتان این کار را انجام می‌دهید). این نوع تست برای اجرا نیازمند دستگاه یا ایمیلیتور است.

ابزارهای مورد استفاده:

  • Espresso: چارچوبی مناسب که از سوی گوگل معرفی و پشتیبانی می‌شود؛
  • UIAutomator: یکی دیگر از چارچوب‌های معرفی شده توسط گوگل که برای تست چند برنامه به صورت همزمان کاربرد دارد؛
  • Robotium: این فریم‌ورک به نوعی رقیب اسپرسو محسوب می‌شود و توسط اشخاص دیگری ساخته شده است؛
  • Selendroid: همان Selenium است برای اندروید.
بخوانید  چرا از جاوا به زبان کاتلین (Kotlin) سوئیچ کنیم؟

تست کارکردی (Functional Testing)

این تست عملکرد برنامه را ارزیابی می‌کند. در اندروید برای این کار از Monkey Runner استفاده می‌شود. این ابزار تعدادی API ارائه می‌دهد که با استفاده از آن می‌توانید برنامه‌هایی بنویسید و خارج از کدهای اندروید، کنترل دستگاه یا ایمیلیتور را به دست بگیرید. مثلاً با کمک پایتون می‌توانید برنامه‌ای بسازید که اپلیکیشن شما را بر روی گوشی نصب کند، تست‌های خاصی را اجرا کند، برنامه را اجرا کند، با صفحه‌کلید چیزی به برنامه بفرستد، از صفحۀ خاصی عکس بگیرد و آن تصویر را جایی ذخیره کند. در واقع Monkey Runner ابزاری مناسب برای تست برنامه در سطح فانکشنال یا کارکردی است.

ساختار تست در پروژه

در پروژۀ قسمت بعدی، تمام تست‌ها در دو فولدر androidTest و Test واقع شده‌اند.

Test: تمام آزمون‌های واحد را در این فولدر قرار داده‌ایم. این تست‌ها روی JVM اجرا می‌شوند و نیازی به اتصال دستگاه یا ایمیلیتور نیست. این نوع تست به هیچ فریم‌ورک اندرویدی یا کامپوننت‌هایی مثل Context دسترسی ندارند.

androidTest: تمام تست‌های ابزاری (Instrumentation) را در این فولدر قرار داده‌ایم. ما در این پروژه از فریم‌ورک Espresso استفاده کرده‌ایم. برای اجرای این تست‌ها به دیوایس اندرویدی یا ایمیلیتور نیاز داریم.

سید ایوب کوکبی

نویسنده و مترجم...

0 دیدگاه

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *