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

نویسنده: IT Sectr منتشر شده: 2026-03-31 زمان مطالعه: 9 دقیقه

تست برنامه‌های موبایل فرآیند تأیید این است که برنامه به درستی کار می‌کند، خراب نمی‌شود و الزامات را برآورده می‌کند. به گفته Software Testing Help (2025)، تست خودکار زمان بررسی‌های رگرسیون را 70–80٪ در مقایسه با تست دستی کاهش می‌دهد. در این مقاله، سطوح تست، ابزارهای iOS و Android، TDD و BDD و همچنین CI/CD برای تست‌ها را بررسی خواهیم کرد.

نکات کلیدی

  • تست‌های واحد توابع و کلاس‌های فردی را تأیید می‌کنند؛ تست‌های یکپارچگی تعامل ماژول‌ها را تأیید می‌کنند؛ E2E سناریوی کامل کاربر را پوشش می‌دهد.
  • iOS: XCTest برای تست‌های واحد، XCUITest برای تست‌های UI. Android: JUnit + Mockito + Espresso.
  • فریم‌ورک‌های کراس پلتفرم: Detox (React Native)، Appium (جهانی)، XCUITest (iOS).
  • TDD (توسعه تست‌محور) — اول تست، بعد کد؛ BDD — سناریوها به زبان ساده.
  • CI/CD: تست‌ها به طور خودکار در هر push اجرا می‌شوند — این یک استاندارد اجباری برای توسعه تجاری است.

سطوح تست: Unit، Integration، E2E

تست واحد

تست‌های واحد اساس تست برنامه‌های موبایل هستند. آنها کوچکترین واحد کد — یک تابع، متد یا کلاس واحد — را به صورت ایزوله از بقیه سیستم تأیید می‌کنند. در توسعه موبایل، تست‌های واحد با 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 (سرتاسر) سناریوی کامل کاربر را از ابتدا تا انتها تأیید می‌کنند: راه‌اندازی برنامه، ورود، انجام عمل، بررسی نتیجه. تست‌های UI زیرمجموعه‌ای از E2E هستند که بر رابط متمرکزند. ابزارها: Espresso (Android)، XCUITest (iOS)، Detox (React Native). تست‌های E2E کندترین هستند، بنابراین به صورت جداگانه روی CI اجرا می‌شوند — معمولاً در ساخت‌های شبانه.

ابزارهای iOS: XCTest و XCUITest

XCTest

XCTest فریم‌ورک داخلی اپل برای تست واحد برنامه‌های موبایل است. XCTestRunner تست‌ها را روی شبیه‌ساز یا دستگاه واقعی اجرا می‌کند. تست‌ها از XCTestCase ارث می‌برند، شامل setUp و tearDown برای آماده‌سازی و پاکسازی هستند. XCTest شامل XCTAssert برای تأییدها (XCTAssertEqual، XCTAssertNil، XCTAssertTrue) و XCTWaiter برای انتظار عملیات ناهمگام است.

مثال یک تست XCTest ساده: ایجاد مدل User، بررسی صحت مقداردهی اولیه، قالب‌بندی نام و محاسبه سن. پوشش کد در Xcode نشان می‌دهد کدام خطوط کد توسط تست‌ها پوشش داده شده‌اند — هدف برای پروژه‌های تجاری: حداقل 70–80٪ پوشش منطق تجاری. XCTest از طریق xcodebuild test با Xcode Server و سیستم‌های CI یکپارچه شده است.

XCUITest

XCUITest فریم‌ورک اپل برای تست UI است. از طریق شناسه‌های دسترسی کار می‌کند: XCUIElementQuery دکمه‌ها، فیلدهای ورودی، جداول را بر اساس برچسب، شناسه یا نوع پیدا می‌کند. XCUITest دنباله‌ای از اقدامات را ضبط می‌کند (ضبط/پخش) و کد تست تولید می‌کند. مهم: همه عناصر UI باید برای عملکرد پایدار تست‌ها دارای accessibilityIdentifier باشند.

ابزارهای Android: JUnit، Espresso، Robolectric

JUnit و Mockito

JUnit فریم‌ورک پایه برای تست واحد برنامه‌های موبایل روی Java/Kotlin است. در Android از JUnit 4 (آخرین نسخه پایدار 4.13.2) و JUnit 5 برای پروژه‌های جدید استفاده می‌شود. Mockito کتابخانه‌ای برای ایجاد اشیاء mock است: when(mock.method()).thenReturn(value) — یک الگوی استاندارد برای ایزوله کردن کلاس تست شده از وابستگی‌ها.

مثال تست JUnit برای Android:

java
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 Automator

Espresso فریم‌ورک گوگل برای تست‌های UI Android است. Espresso به طور خودکار با رشته UI همگام می‌شود: onView(withId(R.id.button)).perform(click()).check(matches(isDisplayed())). Espresso به دلیل انتظار داخلی حالت بیکار، نوشتن آسان و پایدار است. UI Automator فریم‌ورکی برای تست‌های بین برنامه‌ای است که می‌تواند با عناصر سیستم (دیالوگ‌های مجوز، سایه اعلان) تعامل داشته باشد.

ابزارهای کراس پلتفرم: Detox، Appium

Detox برای React Native

Detox یک فریم‌ورک E2E جعبه خاکستری برای تست برنامه‌های موبایل React Native از Wix است. Detox از یک پایگاه کد تست واحد روی هر دو پلتفرم کار می‌کند و در داخل از Espresso (Android) و XCUITest (iOS) استفاده می‌کند. Detox به طور خودکار منتظر می‌ماند تا برنامه بیکار شود (بدون انیمیشن، درخواست شبکه، تایمر) و تنها پس از آن اقدام بعدی را انجام می‌دهد.

Appium

Appium یک فریم‌ورک کراس پلتفرم جهانی است که از Android، iOS، Web و برنامه‌های ترکیبی پشتیبانی می‌کند. Appium از پروتکل WebDriver استفاده می‌کند و از هر زبان برنامه‌نویسی (Java، Python، JS، Ruby) پشتیبانی می‌کند. سرور Appium به عنوان یک سرور HTTP کار می‌کند که دستورات را به دستورات بومی UI Automator / XCUITest ترجمه می‌کند. اشکال اصلی Appium سرعت است: تست‌ها کندتر از Espresso یا XCUITest بومی اجرا می‌شوند.

مقایسه ابزارهای تست iOS و Android
معیار 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 و BDD: روش‌شناسی تست

TDD: توسعه تست‌محور

TDD یک روش‌شناسی تست برنامه‌های موبایل است که در آن تست قبل از کد پیاده‌سازی نوشته می‌شود. چرخه Red-Green-Refactor: (1) تستی بنویسید که شکست می‌خورد (Red)، (2) حداقل کد را برای قبولی تست بنویسید (Green)، (3) کد را در حالی که تست قبول می‌شود، بازنویسی کنید. TDD 100٪ پوشش تست برای قابلیت جدید و معماری تمیز ارائه می‌دهد، زیرا تست اولین مشخصات نیازمندی است.

BDD: توسعه رفتارمحور

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 و Device Farm

اتوماسیون تست در CI/CD

CI/CD — یکپارچگی مداوم و تحویل مداوم: عمل ساخت و تست خودکار برنامه‌های موبایل با هر تغییر کد. در توسعه موبایل، خط لوله CI/CD شامل: لینتینگ، تست‌های واحد، تست‌های یکپارچگی، ساخت APK/IPA و تست‌های UI است. GitHub Actions و Bitrise پلتفرم‌های محبوب برای CI/CD موبایل هستند. تست‌ها باید سریع اجرا شوند: تست‌های واحد در 1–2 دقیقه، یکپارچگی در 5–10، تست‌های UI در 15–30 دقیقه.

Device Farm

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 داده‌های از پیش تعریف شده را برمی‌گرداند. Mock رفتار را بررسی می‌کند، Stub وضعیت را بررسی می‌کند.

آیا باید برای UI تست بنویسم؟

بله، اما فقط برای سناریوهای حیاتی: ورود، ثبت‌نام، تکمیل سفارش، پرداخت. تست‌های UI کند و شکننده هستند — برای هر صفحه تست ننویسید. روی سناریوهای E2E کاربر تمرکز کنید.

تست عکس فوری چیست؟

تست عکس فوری (Golden Test) یک جزء UI رندر شده را با یک تصویر مرجع مقایسه می‌کند. اگر ظاهر تغییر کند (فونت، فاصله، رنگ)، تست شکست می‌خورد — توسعه‌دهنده بررسی می‌کند که آیا تغییر عمدی است. ایده‌آل برای کتابخانه‌های کامپوننت.

چگونه تست‌های E2E را سریع‌تر کنیم؟

تست‌های E2E را روی چندین دستگاه موازی اجرا کنید، از Cloud Device Farm استفاده کنید و تست‌ها را به گروه‌های مستقل تقسیم کنید. تست‌ها را بهینه کنید: انتظارها را به حداقل برسانید، از mock برای درخواست‌های شبکه استفاده کنید.

خلاصه

  • تست‌های واحد — اساس هرم تست: سریع، ایزوله، پوشش منطق تجاری.
  • iOS: XCTest برای واحد، XCUITest برای UI. Android: JUnit + Mockito، Espresso برای UI، Robolectric برای تست‌های یکپارچگی سریع.
  • فریم‌ورک‌های کراس پلتفرم: Detox (React Native)، Appium (جهانی)، XCUITest (بومی iOS).
  • TDD — تست قبل از کد، BDD — سناریوها به زبان تجاری (Given-When-Then).
  • CI/CD — اجرای خودکار تست در هر push برای توسعه مدرن ضروری است.
  • Device Farm — تست روی دستگاه‌های واقعی در ابر برای شناسایی مشکلات سخت‌افزاری.
  • هرم تست: واحد زیاد، یکپارچگی کمتر، E2E حتی کمتر — تعادل بهینه بین سرعت و پوشش.

ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد

IT Sectr از سال 2017 برنامه‌های iOS و Android را برای استارتاپ‌ها و کسب‌وکارها ایجاد می‌کند. ما به شما مشاوره می‌دهیم و بهترین راه‌حل را پیشنهاد خواهیم کرد.

بحث درباره پروژه