اختبار في Swift (iOS/macOS): مراجعة الأطر والأدوات
تعتمد جودة تطبيقات الهواتف المحمولة وأجهزة سطح المكتب المكتوبة بلغة Swift بشكل مباشر على نظام اختبار منظم جيدًا. في نظام Apple البيئي، توجد عدة أطر ناضجة تغطي جميع مستويات هرم الاختبار: من اختبارات الوحدة إلى اختبارات واجهة المستخدم واختبار الانحدار البصري. في هذه المقالة، سنستعرض الأدوات الرئيسية وإمكانياتها ونقدم أمثلة عملية بلغة Swift.
1. XCTest — الإطار القياسي من Apple
XCTest مدمج في Xcode وهو الأداة الرئيسية لكتابة اختبارات الوحدة وواجهة المستخدم. يدعم الاختبار غير المتزامن، والأداء، والتكامل مع CI/CD.
مثال لاختبار وحدة:
import XCTest@testable import MyApp
final class CalculatorTests: XCTestCase { var calculator: Calculator!
override func setUp() { super.setUp() calculator = Calculator() }
func testAddition() { let result = calculator.add(2, 3) XCTAssertEqual(result, 5, "يجب أن تكون عملية الجمع صحيحة") }
func testAsyncOperation() { let expectation = XCTestExpectation(description: "عملية غير متزامنة") calculator.fetchRemoteValue { value in XCTAssertGreaterThan(value, 0) expectation.fulfill() } wait(for: [expectation], timeout: 5.0) }}الإمكانيات الرئيسية لـ XCTest:
- التأكيدات:
XCTAssertEqual،XCTAssertNil،XCTAssertThrowsError - قياس الأداء عبر
measure - اختبار واجهة المستخدم باستخدام
XCUIApplicationوXCUIElement - دعم التشغيل المتوازي للاختبارات
2. Quick + Nimble — نهج BDD
Quick هو إطار BDD يسمح بكتابة الاختبارات بأسلوب "Given-When-Then". Nimble هو رفيقه، ويوفر مطابقات تعبيرية.
مثال باستخدام Quick/Nimble:
import Quickimport Nimble
class UserSpec: QuickSpec { override func spec() { describe("نموذج المستخدم") { var user: User!
beforeEach { user = User(name: "أليس", age: 30) }
context("عندما يكون العمر صالحًا") { it("يجب أن يكون بالغًا") { expect(user.isAdult).to(beTrue()) } }
context("عند تحديث الاسم") { it("يغير الاسم بشكل صحيح") { user.updateName("بوب") expect(user.name) == "بوب" } } } }}المزايا:
- اختبارات قابلة للقراءة، مفهومة لغير المبرمجين
- مطابقات مرنة:
beCloseTo()،contain()،throwError() - دعم عدم التزامن عبر
toEventually()
3. XCUITest — اختبار واجهة المستخدم
لاختبار واجهة المستخدم، يتم استخدام XCUITest. يحاكي إجراءات المستخدم: النقر، السحب، إدخال النص.
مثال لاختبار واجهة مستخدم لنظام iOS:
import XCTest
class LoginUITests: XCTestCase { let app = XCUIApplication()
override func setUp() { continueAfterFailure = false app.launch() }
func testSuccessfulLogin() { let usernameField = app.textFields["username"] usernameField.tap() usernameField.typeText("testuser")
let passwordField = app.secureTextFields["password"] passwordField.tap() passwordField.typeText("password123")
app.buttons["Login"].tap() XCTAssertTrue(app.staticTexts["Welcome"].exists) }}
أيضاً في المكتبة
توصيات