الاختبارات غير المتزامنة وقياس الأداء
اختبروا الدوال غير المتزامنة باستخدام async/await وقيسوا الأداء باستخدام XCTMeasureOptions.
الاختبارات غير المتزامنة وقياس الأداء درس مجاني في Swift Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Swift Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Swift Academy 4 دروس في المجموع.
اختبار الدوال غير المتزامنة
عرّف دوال الاختبار على أنها async throws لاستخدام await مباشرةً داخل أجسام الاختبارات دون شيفرة إضافية.
final class FetcherTests: XCTestCase {
func testFetchReturnsUser() async throws {
let user = try await UserService().fetchUser(id: 1)
XCTAssertEqual(user.name, "Alice")
}
}setUp وtearDown غير المتزامنين
تجاوز setUp() async throws لتنفيذ التهيئة غير المتزامنة قبل كل اختبار.
override func setUp() async throws {
try await super.setUp()
sut = await AsyncService.make()
}XCTestExpectation لواجهات API المعتمدة على الاستدعاءات
مع واجهات API التي تستخدم الاستدعاءات بدلًا من async/await، استخدم XCTestExpectation وwait(for:timeout:).
func testCallback() {
let exp = expectation(description: "data received")
service.fetchWithCallback { data in
XCTAssertNotNil(data)
exp.fulfill()
}
wait(for: [exp], timeout: 5.0)
}عكس التوقعات
يفشل التوقع المعكوس إذا تحقق، وهو مفيد للتأكد من عدم استدعاء callback.
let noCall = expectation(description: "should not fire")
noCall.isInverted = true
cancelledTask.onComplete { noCall.fulfill() }
wait(for: [noCall], timeout: 1.0)XCTMeasure لقياس الأداء
تشغّل measure {} كتلتها 10 مرات وتعرض متوسط الزمن والانحراف المعياري ومقارنة بخط الأساس.
func testSortPerformance() {
let data = Array(0..<10_000).shuffled()
measure {
_ = data.sorted()
}
}XCTMeasureOptions
اضبط عدد التكرارات والمقياس المراد قياسه، مثل الزمن أو الذاكرة أو وحدة المعالجة المركزية.
func testParsePerformance() {
let options = XCTMeasureOptions()
options.iterationCount = 5
measure(options: options) {
_ = try? JSONDecoder().decode([Item].self, from: largeJSON)
}
}قياس الأداء غير المتزامن
استخدم measure(metrics:options:block:) مع كتلة غير متزامنة لقياس العمليات غير المتزامنة.
func testAsyncFetchPerformance() {
measure {
let exp = expectation(description: "done")
Task {
_ = try? await service.fetchAll()
exp.fulfill()
}
wait(for: [exp], timeout: 10)
}
}خطوط الأساس
بعد تشغيل اختبار القياس، عيّن خط أساس في Xcode. تفشل عمليات التشغيل المستقبلية إذا تراجع الأداء بما يتجاوز الحد المسموح.
// Xcode: click the grey icon next to the measure test
// → "Set Baseline" to record the current average
// Subsequent runs compare against the baselineاختبار الشيفرة المعزولة ضمن Actor
يمكنك الوصول إلى الحالة المعزولة ضمن Actor من الاختبارات باستخدام await.
actor Counter { var value = 0; func increment() { value += 1 } }
final class CounterTests: XCTestCase {
func testIncrement() async {
let counter = Counter()
await counter.increment()
let val = await counter.value
XCTAssertEqual(val, 1)
}
}إطار Swift Testing (Swift 6)
يأتي Swift 6 بإطار Testing جديد يتضمن @Test و#expect و@Suite كبديل حديث لـ XCTest.
import Testing
@Suite struct MathTests {
@Test func addition() {
#expect(2 + 2 == 4)
}
}دمج XCTest مع Swift Testing
يمكن أن يتعايش الإطاران في هدف الاختبار نفسه أثناء الانتقال من XCTest إلى Swift Testing.
import XCTest
import Testing
// Legacy XCTestCase tests alongside @Test functions
// Both run when the test target is executedتحقق سريع
ما واجهة XCTest التي تقيس أداء كتلة من الشيفرة وتقارنه بخط أساس مخزن؟
مراجعة الدرس
ضع علامة async throws على أساليب الاختبار لاستخدام await مباشرةً. استخدم XCTestExpectation مع واجهات برمجة التطبيقات القائمة على الاستدعاءات الراجعة. قِس الأداء باستخدام measure {} وحدد خطوطًا أساسية لاكتشاف التراجعات. اختبر actors باستخدام await. استكشف @Test و#expect في Swift Testing لإجراء اختبارات حديثة.
الأسئلة الشائعة
هل درس «الاختبارات غير المتزامنة وقياس الأداء» مجاني؟
نعم — نص درس «الاختبارات غير المتزامنة وقياس الأداء» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Swift Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Swift Academy 4 دروس في المجموع.
ماذا ستتعلم في «الاختبارات غير المتزامنة وقياس الأداء»؟
اختبروا الدوال غير المتزامنة باستخدام async/await وقيسوا الأداء باستخدام XCTMeasureOptions. تتمرن على Swift Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Swift Academy؟
لا تُشترط خبرة سابقة. Swift Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.
كم من الوقت يستغرق درس «الاختبارات غير المتزامنة وقياس الأداء»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Swift Academy هذا؟
نعم. كل درس في Swift Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- إعداد XCTestCase والتنظيف وطرائق الاختبار
- عائلة XCTAssert والتأكيدات التي تطلق الأخطاء
- المحاكاة المعتمدة على البروتوكولات وحقن التبعيات
- الاختبارات غير المتزامنة وقياس الأداء