CYBERSOFT
Đăng nhập

Scale kiểm thử mobile: chạy song song, device farm & CI

Chuyên nâng caoAppiumCI/CDNâng cao
🗓 1 tháng trước21 phút đọc·👁 1,266 lượt xem👤 58 người đọc

Đưa Appium lên quy mô sản xuất cho ứng dụng bán lẻ: chạy song song nhiều thiết bị, dùng device farm đám mây, kiểm soát flake, đồng bộ hoá bằng chờ tường minh, sharding, ma trận phủ thiết bị và tích hợp CI thành cổng chất lượng.

1. Từ một test đến quy mô lớn

Một ứng dụng bán lẻ phải hoạt động tốt trên hàng loạt điện thoại giá rẻ lẫn cao cấp, nhiều phiên bản hệ điều hành và độ phân giải màn hình khác nhau. Khi bộ test Appium lớn dần, chạy tuần tự từng thiết bị trở nên quá chậm để kịp mỗi lần phát hành. Bài này bàn về cách đưa nền tảng Appium lên quy mô sản xuất: chạy song song, dùng device farm, kiểm soát flake, đồng bộ hoá và tích hợp CI.

Bài toán cốt lõi khi mở rộng là thời gian và độ phủ. Chạy song song rút ngắn thời gian, còn device farm mở rộng độ phủ thiết bị mà không cần mua và bảo trì kho máy vật lý. Nhưng cả hai đều làm lộ ra sự mong manh của test mobile, nên kiểm soát flake và đồng bộ hoá trở thành kỹ năng bắt buộc chứ không còn là tuỳ chọn.

Scale không chỉ là chạy nhanh hơn. Nếu bộ test không ổn định thì chạy song song chỉ nhân số lần đỏ ngẫu nhiên lên, làm mất niềm tin của đội. Ổn định phải đi trước tốc độ.

2. Chạy song song nhiều thiết bị

Chạy song song trong Appium nghĩa là mở nhiều phiên độc lập cùng lúc, mỗi phiên gắn với một thiết bị riêng qua udid. Mấu chốt kỹ thuật là mỗi phiên phải có cổng nội bộ riêng để driver không tranh chấp tài nguyên: trên Android là systemPort cho UiAutomator2, trên iOS là wdaLocalPort cho WebDriverAgent. Nếu hai phiên dùng chung cổng, chúng sẽ chồng chéo và gây lỗi ngẫu nhiên rất khó gỡ.

Chạy song song — nhiều phiên Appium độc lập Runner (shard 1..N) systemPort / wdaLocalPort riêng Pixel 7 · Android 14 iPhone 15 · iOS 17 Galaxy S22 · Android 13 Mỗi phiên = cổng riêng + UDID riêng → không tranh chấp tài nguyên.
Nhiều phiên Appium song song, mỗi phiên có cổng và UDID riêng.
javascript
// wdio.conf: nhiều capabilities song song, mỗi thiết bị cổng riêng
export const config = {
  maxInstances: 3,           // 3 phiên chạy đồng thời
  capabilities: [
    { platformName: 'Android', 'appium:automationName': 'UiAutomator2',
      'appium:udid': 'emulator-5554', 'appium:systemPort': 8201,
      'appium:app': '/builds/retail.apk' },
    { platformName: 'Android', 'appium:automationName': 'UiAutomator2',
      'appium:udid': 'emulator-5556', 'appium:systemPort': 8202,
      'appium:app': '/builds/retail.apk' },
    { platformName: 'iOS', 'appium:automationName': 'XCUITest',
      'appium:udid': '00008110-0011', 'appium:wdaLocalPort': 8101,
      'appium:app': '/builds/retail.ipa' },
  ],
};
💡 Sinh cổng theo chỉ số shard hoặc theo biến môi trường để không bao giờ đụng nhau. Một hàm nhỏ tạo cổng từ chỉ số worker sẽ tiết kiệm nhiều giờ gỡ lỗi tranh chấp.

3. Device farm đám mây

Device farm đám mây như BrowserStack hay Sauce Labs cho bạn truy cập hàng trăm thiết bị thật và mô phỏng qua mạng, kèm video, log và khả năng chạy song song rất lớn mà không cần tự mua và bảo trì kho máy. Bạn tải bản build lên farm, nhận về một mã định danh ứng dụng, rồi trỏ capabilities tới điểm cuối của nhà cung cấp thay vì server Appium cục bộ. Phần còn lại của kịch bản gần như giữ nguyên.

Local vs Cloud device farm Local grid emulator + máy thật cắm USB rẻ · nhanh · phủ thiết bị hẹp tự lo quản lý pin/nhiệt/OS Cloud farm BrowserStack · Sauce Labs hàng trăm OS/thiết bị thật video · log · song song lớn tốn phí · phụ thuộc mạng
So sánh grid cục bộ và device farm đám mây.
javascript
// Trỏ WebdriverIO tới BrowserStack thay vì server cục bộ
export const config = {
  user: process.env.BROWSERSTACK_USERNAME,
  key:  process.env.BROWSERSTACK_ACCESS_KEY,
  hostname: 'hub.browserstack.com',
  path: '/wd/hub',
  capabilities: [{
    platformName: 'Android',
    'appium:automationName': 'UiAutomator2',
    'appium:app': 'bs://<app-hash-sau-khi-upload>',
    'appium:deviceName': 'Samsung Galaxy S22',
    'appium:platformVersion': '12.0',
    'bstack:options': { projectName: 'Retail App', buildName: 'PR-1284' },
  }],
};

Điểm khác biệt nằm ở cách xác thực và địa chỉ điểm cuối, còn các bước tìm element và thao tác vẫn dùng cùng API WebDriver. Nhờ vậy bạn có thể phát triển cục bộ trên emulator rồi chuyển sang farm chỉ bằng cách đổi cấu hình. Với đội bán lẻ, farm đặc biệt hữu ích để phủ các dòng máy phổ biến ở từng thị trường mà đội không sở hữu vật lý.

⚠️ Đừng nhét khoá bí mật của farm vào mã. Luôn đọc chúng từ biến môi trường hoặc kho bí mật của CI để tránh lộ thông tin đăng nhập trong lịch sử kho mã.
🔒

Nội dung bị khoá

Bạn đang xem bản xem trước. Đăng nhập để mở khoá toàn bộ bài viết và tất cả tài liệu Tester/QA.

Đã xem 24% nội dung
  • Đọc trọn vẹn mọi bài viết
  • Lưu bài & ghi chú cá nhân
  • Theo dõi tiến độ đã đọc
  • Luyện phỏng vấn, ISTQB, Mock
Đăng nhập để đọc tiếp

Chưa có mã? Lấy mã qua Fanpage / Zalo CyberSoft.

0

💬 Bình luận (0)

Bạn có thể đọc mọi bình luận. Đăng nhập để bình luận

Chưa có bình luận nào. Hãy là người đầu tiên!