اختبار الشيفرة غير المتزامنة (XCTest)
اكتب اختبارات غير متزامنة باستخدام XCTest: اجعل الاختبارات async ، واستخدم await و throws ، واختبر الإخفاقات والمهل الزمنية، وتحقّق من نتائج التزامن المنظّم.
اختبار الشيفرة غير المتزامنة (XCTest) درس مجاني في Swift Academy على CoddyKit. هذا هو الدرس 3 من أصل 3. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Swift Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Swift Academy 3 دروس في المجموع.
أساسيات الاختبارات غير المتزامنة
يدعم XCTest الاختبارات async. اجعل الاختبارات صغيرة وحتمية:
- صرّح عن اختبارات
asyncواستخدم await - استخدم throws و
do/catchلمعالجة حالات الفشل - استبدل عمليات السكون ببدائل وهمية/بدائل اختبار صغيرة
حالة النجاح غير المتزامنة
حدّد الاختبار على أنه async واستدعِ SUT باستخدام await. واكتب تأكيدات عادية مثل XCTAssertEqual.
import XCTest
import Foundation
// System Under Test (SUT)
func fetchValue() async -> Int {
try? await Task.sleep(nanoseconds: 50_000_000)
return 42
}
final class AsyncBasicsTests: XCTestCase {
func testFetchValue_returns42() async {
let v = await fetchValue()
XCTAssertEqual(v, 42)
}
}الإطلاقات والتأكيدات غير المتزامنة
استخدم اختبارات من نوع async throws. وبالنسبة إلى أخطاء محددة، التقط الخطأ وأجرِ مطابقة للأنماط للحفاظ على وضوح القصد.
import XCTest
enum NetError: Error { case offline }
func loadNumber(online: Bool) async throws -> Int {
try await Task.sleep(nanoseconds: 30_000_000)
if !online { throw NetError.offline }
return 7
}
final class AsyncThrowingTests: XCTestCase {
func testLoadNumber_success() async throws {
let n = try await loadNumber(online: true)
XCTAssertEqual(n, 7)
}
func testLoadNumber_offline_throws() async {
do {
_ = try await loadNumber(online: false)
XCTFail("Expected error")
} catch NetError.offline {
// expected
} catch {
XCTFail("Unexpected error: \\(error)")
}
}
}النتائج المتوازية
من السهل اختبار التزامن المنظم: استخدم async let وتحقق من النتيجة النهائية. اجعل التأخيرات قصيرة جدًا لتجنب الاختبارات المتذبذبة.
import XCTest
func compute(_ x: Int) async -> Int {
try? await Task.sleep(nanoseconds: 10_000_000)
return x * x
}
final class ParallelTests: XCTestCase {
func testParallel_asyncLet_sumsSquares() async {
async let a = compute(2)
async let b = compute(3)
let sum = await (a + b)
XCTAssertEqual(sum, 13) // 4 + 9
}
}اختبار المهلات الزمنية
اختبر المهلات الزمنية عبر تسابق العملية مع فترة سكون قصيرة. استخدم فترات قصيرة جدًا للحفاظ على سرعة الاختبارات واستقرارها.
import XCTest
enum TimeoutError: Error { case timedOut }
func withTimeout<T>(
seconds: Double,
operation: @escaping () async throws -> T
) async throws -> T {
try await withThrowingTaskGroup(of: T.self) { group in
group.addTask { try await operation() }
group.addTask {
try await Task.sleep(nanoseconds: UInt64(seconds * 1_000_000_000))
throw TimeoutError.timedOut
}
let first = try await group.next()!
group.cancelAll()
return first
}
}
final class TimeoutTests: XCTestCase {
func testTimeout_timesOutFast() async {
do {
_ = try await withTimeout(seconds: 0.01) {
try await Task.sleep(nanoseconds: 50_000_000) // slower than timeout
return "OK"
}
XCTFail("Expected timeout")
} catch TimeoutError.timedOut {
// expected
} catch {
XCTFail("Unexpected error: \\(error)")
}
}
}التوقعات (الأسلوب القديم)
بالنسبة إلى دوال الاستدعاء الأقدم، استمر في استخدام expectation/wait. وفضّل الاختبارات غير المتزامنة في الشيفرة الجديدة.
import XCTest
// Legacy API with a completion handler
func legacyFetch(_ completion: @escaping (String) -> Void) {
Task { try? await Task.sleep(nanoseconds: 20_000_000); completion("done") }
}
final class ExpectationTests: XCTestCase {
func testLegacy_withExpectation() {
let exp = expectation(description: "legacy finishes")
legacyFetch { value in
XCTAssertEqual(value, "done")
exp.fulfill()
}
wait(for: [exp], timeout: 1.0)
}
}أسلوب الاختبار غير المتزامن الحديث
تحقق سريع: ما أفضل ممارسة لاختبار دالة غير متزامنة؟
مراجعة
مراجعة: استخدم أساليب XCTest من نوع async مع await، وتحقق من مساري النجاح والفشل، واجعل التأخيرات قصيرة جدًا، وخصّص expectations لدوال الاستدعاء القديمة.
الأسئلة الشائعة
هل درس «اختبار الشيفرة غير المتزامنة (XCTest)» مجاني؟
نعم — نص درس «اختبار الشيفرة غير المتزامنة (XCTest)» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Swift Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Swift Academy 3 دروس في المجموع.
ماذا ستتعلم في «اختبار الشيفرة غير المتزامنة (XCTest)»؟
اكتب اختبارات غير متزامنة باستخدام XCTest: اجعل الاختبارات async ، واستخدم await و throws ، واختبر الإخفاقات والمهل الزمنية، وتحقّق من نتائج التزامن المنظّم. تتمرن على Swift Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Swift Academy؟
لا تُشترط خبرة سابقة. Swift Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 3.
كم من الوقت يستغرق درس «اختبار الشيفرة غير المتزامنة (XCTest)»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Swift Academy هذا؟
نعم. كل درس في Swift Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- المنتِج والمستهلك وخطوط المعالجة والمهل الزمنية
- الربط بين الاستدعاءات القديمة وCombine وasync/await
- اختبار الشيفرة غير المتزامنة (XCTest)