تست برنامههای موبایل فرآیند تأیید این است که برنامه به درستی کار میکند، خراب نمیشود و الزامات را برآورده میکند. به گفته Software Testing Help (2025)، تست خودکار زمان بررسیهای رگرسیون را 70–80٪ در مقایسه با تست دستی کاهش میدهد. در این مقاله، سطوح تست، ابزارهای iOS و Android، TDD و BDD و همچنین CI/CD برای تستها را بررسی خواهیم کرد.
نکات کلیدی
تستهای واحد اساس تست برنامههای موبایل هستند. آنها کوچکترین واحد کد — یک تابع، متد یا کلاس واحد — را به صورت ایزوله از بقیه سیستم تأیید میکنند. در توسعه موبایل، تستهای واحد با JUnit (Android) و XCTest (iOS) نوشته میشوند. یک تست واحد خوب باید سریع، مستقل و تکرارپذیر باشد — نباید به شبکه، پایگاه داده یا اجزای UI وابسته باشد. برای ایزولهسازی از test doubles استفاده میشود: mock، stub و fake.
Mockito (Java/Kotlin) و MockK (Kotlin-first) کتابخانههای محبوب برای ایجاد اشیاء mock در Android هستند. در iOS از OCMock، Cuckoo یا پروتکلهای دستی استفاده میشود. قانون: تستهای واحد باید منطق تجاری و مدلهای داده را پوشش دهند. تستهای UI نباید تستهای واحد را تکرار کنند — آنها تعامل کاربر با رابط را تأیید میکنند.
تستهای یکپارچگی تعامل بین اجزا را تأیید میکنند: مخزن با پایگاه داده، ViewModel با سرویس API، ناوبری بین صفحات. برخلاف تستهای واحد، تستهای یکپارچگی از وابستگیهای واقعی یا نزدیک به واقعیت استفاده میکنند (مثلاً پایگاه داده درون حافظه یا سرور mock). Robolectric فریمورکی برای اجرای تستهای Android روی JVM بدون شبیهساز است که تستهای یکپارچگی را 10 برابر سریعتر میکند.
تستهای عکس فوری (Golden Tests) نوع خاصی از تست یکپارچگی هستند که یک جزء UI رندر شده را با یک تصویر مرجع (عکس فوری) مقایسه میکنند. اگر ظاهر تغییر کند، تست شکست میخورد — توسعهدهنده میبیند چه چیزی تغییر کرده است. Facebook SnapshotTestCase (iOS) و Shot (Android) ابزارهای محبوب برای تست عکس فوری هستند.
تستهای E2E (سرتاسر) سناریوی کامل کاربر را از ابتدا تا انتها تأیید میکنند: راهاندازی برنامه، ورود، انجام عمل، بررسی نتیجه. تستهای UI زیرمجموعهای از E2E هستند که بر رابط متمرکزند. ابزارها: Espresso (Android)، XCUITest (iOS)، Detox (React Native). تستهای E2E کندترین هستند، بنابراین به صورت جداگانه روی CI اجرا میشوند — معمولاً در ساختهای شبانه.
XCTest فریمورک داخلی اپل برای تست واحد برنامههای موبایل است. XCTestRunner تستها را روی شبیهساز یا دستگاه واقعی اجرا میکند. تستها از XCTestCase ارث میبرند، شامل setUp و tearDown برای آمادهسازی و پاکسازی هستند. XCTest شامل XCTAssert برای تأییدها (XCTAssertEqual، XCTAssertNil، XCTAssertTrue) و XCTWaiter برای انتظار عملیات ناهمگام است.
مثال یک تست XCTest ساده: ایجاد مدل User، بررسی صحت مقداردهی اولیه، قالببندی نام و محاسبه سن. پوشش کد در Xcode نشان میدهد کدام خطوط کد توسط تستها پوشش داده شدهاند — هدف برای پروژههای تجاری: حداقل 70–80٪ پوشش منطق تجاری. XCTest از طریق xcodebuild test با Xcode Server و سیستمهای CI یکپارچه شده است.
XCUITest فریمورک اپل برای تست UI است. از طریق شناسههای دسترسی کار میکند: XCUIElementQuery دکمهها، فیلدهای ورودی، جداول را بر اساس برچسب، شناسه یا نوع پیدا میکند. XCUITest دنبالهای از اقدامات را ضبط میکند (ضبط/پخش) و کد تست تولید میکند. مهم: همه عناصر UI باید برای عملکرد پایدار تستها دارای accessibilityIdentifier باشند.
JUnit فریمورک پایه برای تست واحد برنامههای موبایل روی Java/Kotlin است. در Android از JUnit 4 (آخرین نسخه پایدار 4.13.2) و JUnit 5 برای پروژههای جدید استفاده میشود. Mockito کتابخانهای برای ایجاد اشیاء mock است: when(mock.method()).thenReturn(value) — یک الگوی استاندارد برای ایزوله کردن کلاس تست شده از وابستگیها.
مثال تست JUnit برای Android:
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;
import static org.junit.Assert.*;
import static org.mockito.Mockito.*;
@RunWith(MockitoJUnitRunner.class)
public class LoginViewModelTest {
@Mock
AuthRepository authRepository;
@Test
public void login_emptyEmail_returnsError() {
LoginViewModel vm = new LoginViewModel(authRepository);
String result = vm.login("", "password123");
assertEquals("Email cannot be empty", result);
verify(authRepository, never()).authenticate(any());
}
}
Espresso فریمورک گوگل برای تستهای UI Android است. Espresso به طور خودکار با رشته UI همگام میشود: onView(withId(R.id.button)).perform(click()).check(matches(isDisplayed())). Espresso به دلیل انتظار داخلی حالت بیکار، نوشتن آسان و پایدار است. UI Automator فریمورکی برای تستهای بین برنامهای است که میتواند با عناصر سیستم (دیالوگهای مجوز، سایه اعلان) تعامل داشته باشد.
Detox یک فریمورک E2E جعبه خاکستری برای تست برنامههای موبایل React Native از Wix است. Detox از یک پایگاه کد تست واحد روی هر دو پلتفرم کار میکند و در داخل از Espresso (Android) و XCUITest (iOS) استفاده میکند. Detox به طور خودکار منتظر میماند تا برنامه بیکار شود (بدون انیمیشن، درخواست شبکه، تایمر) و تنها پس از آن اقدام بعدی را انجام میدهد.
Appium یک فریمورک کراس پلتفرم جهانی است که از Android، iOS، Web و برنامههای ترکیبی پشتیبانی میکند. Appium از پروتکل WebDriver استفاده میکند و از هر زبان برنامهنویسی (Java، Python، JS، Ruby) پشتیبانی میکند. سرور Appium به عنوان یک سرور HTTP کار میکند که دستورات را به دستورات بومی UI Automator / XCUITest ترجمه میکند. اشکال اصلی Appium سرعت است: تستها کندتر از Espresso یا XCUITest بومی اجرا میشوند.
| معیار | iOS | Android |
|---|---|---|
| تستهای واحد | XCTest | JUnit 4/5 + Mockito |
| تستهای UI | XCUITest | Espresso, UI Automator |
| تستهای عکس فوری | FBSnapshotTestCase | Shot, Roborazzi |
| اتوماسیون حرکات | XCUIGesture | UiAutomator touch |
| پوشش کد | Xcode Code Coverage | Jacoco |
| یکپارچگی CI | xcodebuild test | Gradle connectedCheck |
TDD یک روششناسی تست برنامههای موبایل است که در آن تست قبل از کد پیادهسازی نوشته میشود. چرخه Red-Green-Refactor: (1) تستی بنویسید که شکست میخورد (Red)، (2) حداقل کد را برای قبولی تست بنویسید (Green)، (3) کد را در حالی که تست قبول میشود، بازنویسی کنید. TDD 100٪ پوشش تست برای قابلیت جدید و معماری تمیز ارائه میدهد، زیرا تست اولین مشخصات نیازمندی است.
BDD توسعهای از TDD است که در آن تستها به زبان طبیعی در قالب Given-When-Then نوشته میشوند. Given (زمینه) — When (عمل) — Then (نتیجه مورد انتظار). تستهای BDD برای همه اعضای تیم قابل درک است: توسعهدهندگان، تستکنندگان، تحلیلگران و مشتریان. Mock در مقابل Stub در مقابل Fake: Mock تعامل را تأیید میکند (آیا متد فراخوانی شده است)، Stub دادههای ثابت را برمیگرداند، Fake یک پیادهسازی کاری ساده شده است (مثلاً DB درون حافظه). در IT Sectr، ما از TDD برای منطق تجاری حیاتی و از BDD برای سناریوهای پذیرش استفاده میکنیم.
دوگانههای تست نام عمومی اشیایی است که وابستگیهای واقعی را در تستها جایگزین میکنند. چهار نوع وجود دارد: Dummy (شیء برای پر کردن پارامترها، استفاده نمیشود)، Stub (مقادیر داده شده را برمیگرداند)، Spy (فراخوانیها را برای تأیید ثبت میکند)، Mock (فراخوانیهای مورد انتظار را از پیش تعریف میکند). درک تفاوت برای طراحی صحیح تست بسیار مهم است.
CI/CD — یکپارچگی مداوم و تحویل مداوم: عمل ساخت و تست خودکار برنامههای موبایل با هر تغییر کد. در توسعه موبایل، خط لوله CI/CD شامل: لینتینگ، تستهای واحد، تستهای یکپارچگی، ساخت APK/IPA و تستهای UI است. GitHub Actions و Bitrise پلتفرمهای محبوب برای CI/CD موبایل هستند. تستها باید سریع اجرا شوند: تستهای واحد در 1–2 دقیقه، یکپارچگی در 5–10، تستهای UI در 15–30 دقیقه.
Device Farm مزرعهای از دستگاههای واقعی برای تست است. Firebase Test Lab (Android) و Xcode Cloud (iOS) دسترسی ابری به صدها مدل دستگاه را فراهم میکنند. Device Farm مشکلاتی را آشکار میکند که در شبیهسازها قابل مشاهده نیستند: اندازههای مختلف صفحه، عملکرد روی دستگاههای قدیمی، مشکلات سازگاری. در IT Sectr، ما به طور منظم از Firebase Test Lab برای Android و Xcode Cloud برای iOS استفاده میکنیم.
سوالات متداول
برای پروژههای تجاری، حداقل 70–80٪ پوشش منطق تجاری. پوشش کد UI دشوارتر است — 50٪ کافی است. نکته اصلی درصد نیست بلکه کیفیت تستهاست: سناریوهای حیاتی، موارد مرزی و مدیریت خطا را تست کنید.
Mock تعامل را تأیید میکند — آیا یک متد خاص با پارامترهای خاص فراخوانی شده است. Stub دادههای از پیش تعریف شده را برمیگرداند. Mock رفتار را بررسی میکند، Stub وضعیت را بررسی میکند.
بله، اما فقط برای سناریوهای حیاتی: ورود، ثبتنام، تکمیل سفارش، پرداخت. تستهای UI کند و شکننده هستند — برای هر صفحه تست ننویسید. روی سناریوهای E2E کاربر تمرکز کنید.
تست عکس فوری (Golden Test) یک جزء UI رندر شده را با یک تصویر مرجع مقایسه میکند. اگر ظاهر تغییر کند (فونت، فاصله، رنگ)، تست شکست میخورد — توسعهدهنده بررسی میکند که آیا تغییر عمدی است. ایدهآل برای کتابخانههای کامپوننت.
تستهای E2E را روی چندین دستگاه موازی اجرا کنید، از Cloud Device Farm استفاده کنید و تستها را به گروههای مستقل تقسیم کنید. تستها را بهینه کنید: انتظارها را به حداقل برسانید، از mock برای درخواستهای شبکه استفاده کنید.
خلاصه
ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد
IT Sectr از سال 2017 برنامههای iOS و Android را برای استارتاپها و کسبوکارها ایجاد میکند. ما به شما مشاوره میدهیم و بهترین راهحل را پیشنهاد خواهیم کرد.