اختبار في Swift (iOS/macOS): الأطر والأدوات
تطوير تطبيقات عالية الجودة لمنصات Apple لا يمكن تصوره دون اختبار موثوق. تقدم بيئة Swift حلولاً مدمجة بالإضافة إلى أطر خارجية قوية تغطي جميع المستويات: من اختبارات الوحدة إلى اختبارات واجهة المستخدم. في هذه المقالة، سنقوم بتحليل مفصل للأدوات الرئيسية للاختبار في iOS/macOS، ونقاط قوتها، وسنقدم أمثلة عملية بلغة Swift.
1. XCTest — الإطار القياسي من Apple
XCTest هو الأساس لجميع الاختبارات في Xcode. إنه مدمج في بيئة التطوير المتكاملة (IDE)، ويدعم التشغيل المتوازي، وقياس الأداء، واختبار واجهة المستخدم. لإنشاء اختبار، يكفي أن ترث فئة من XCTestCase.
مثال على اختبار وحدة باستخدام XCTest
import XCTest@testable import MyApp
class CalculatorTests: XCTestCase {
var calculator: Calculator!
override func setUp() { super.setUp() calculator = Calculator() }
override func tearDown() { calculator = nil super.tearDown() }
func testAddition() { let result = calculator.add(2, 3) XCTAssertEqual(result, 5, "كان متوقعاً 5، تم الحصول على \\(result)") }
func testDivisionByZero() { XCTAssertThrowsError(try calculator.divide(10, 0)) { error in XCTAssertEqual(error as? CalculatorError, CalculatorError.divisionByZero) } }
func testPerformanceExample() { measure { for _ in 0..<1000 { _ = calculator.add(Int.random(in: 0...100), Int.random(in: 0...100)) } } }}الإمكانيات الرئيسية لـ XCTest:
XCTAssertEqual،XCTAssertTrue،XCTAssertNil— تحققّات أساسية.XCTAssertThrowsError— اختبار الاستثناءات.measure— قياس الأداء.- دعم الاختبارات غير المتزامنة عبر
XCTestExpectation.
2. Quick و Nimble — أسلوب اختبار BDD
Quick هو إطار لكتابة الاختبارات بأسلوب التطوير القائم على السلوك (BDD). يسمح بوصف سلوك التطبيق بلغة طبيعية. Nimble هي مكتبة من المطابقات (matchers) التي تجعل التأكيدات أكثر قابلية للقراءة.
مثال باستخدام Quick + Nimble
import Quickimport Nimble@testable import MyApp
class CalculatorSpec: QuickSpec { override func spec() { describe("Calculator") { var calculator: Calculator!
beforeEach { calculator = Calculator() }
context("when adding two numbers") { it("should return the correct sum") { expect(calculator.add(2, 3)).to(equal(5)) } }
context("when dividing by zero") { it("should throw an error") { expect { try calculator.divide(10, 0) }.to(throwError()) } }
context("performance") { it("should be fast") { expect { for _ in 0..<1000 { _ = calculator.add(Int.random(in: 0...100), Int.random(in: 0...100)) } }.to(beLessThan(0.1)) } } } }}المزايا:
- تسلسلات هرمية قابلة للقراءة:
describe←context←it. - توفر Nimble مجموعة غنية من المطابقات:
equal،beNil،beCloseTo،containوغيرها. - تكامل ممتاز مع Xcode والتقارير.
3. SwiftCheck — اختبار قائم على الخصائص