Swift Testing

أضف حزمة SPM واعتمد على TraceraTesting:

.package(url: "https://github.com/tracera-dev/tracera-swift.git", from: "0.1.0"),
// …
.product(name: "TraceraTesting", package: "tracera-swift"),

يتطلب Swift ≥ 6 (macOS 15 / Xcode 16؛ انظر محوّلات الاختبار الآلي).

متغيرات البيئة ووضع التشغيل: محوّلات الاختبار الآلي.

ربط testCaseId وautotestName

الربط التصريحي المفضّل:

@Test("checkout", .traceraId(42))
func checkout() {
  // …
}

@Test("login as {user}", .traceraId(42), arguments: ["alice", "bob"])
func login(user: String) {
  // …
}

عندما لا يكون المعرّف ثابتًا وقت الترجمة، افتح التثبيت بـ .tracera واربط بشكل أمري:

@Test("checkout", .tracera)
func checkout() {
  Tracera.testCase(42)
  // Tracera.testCase(42, "e2e/checkout")
}

التخطي

استخدم skip("reason") ليُضاف السبب إلى النتيجة كـ comment:

@Test("checkout", .traceraId(42))
func checkout() throws {
  try skip("needs a seeded account")
}

الخطوات

استخدم Tracera.step("…") { … } (متزامنة أو async). الخطوات داخل setup / teardown تذهب إلى الإعداد / التنظيف في النتيجة؛ أما بقية الخطوات فتذهب إلى الاختبار.

@Test("checkout", .traceraId(10))
func checkout() throws {
  try setup("open shop") {}
  try Tracera.step("add item") {
    Tracera.step("nested leaf") {}
  }
  try teardown("close shop") {}
}

التعليقات والأخطاء والمرفقات

الحدود وأنواع MIME المسموحة: محوّلات الاختبار الآلي.

تُضاف Tracera.comment وTracera.error والمرفقات إلى الخطوة المفتوحة، أو إلى النتيجة إذا لم تكن هناك خطوة مفتوحة. Tracera.attachmentFile يأخذ مسار ملف؛ وTracera.attachmentBytes يأخذ اسمًا وبايتات (نوع MIME اختياري). تُرفَع المرفقات عند إرسال النتيجة.

Tracera.comment("result-level note")
Tracera.error("result-level error")
Tracera.attachmentFile("Fixtures/screenshot.png")
Tracera.step("open login") {
  Tracera.comment("step note")
  Tracera.attachmentBytes("body.json", data: Data(#"{"ok":true}"#.utf8), mimeType: "application/json")
}

إذا أنشأت Task واستدعيت فيها واجهات Tracera (خطوات وتعليقات وأخطاء ومرفقات)، فاستدعِ getContext() أولًا في الاختبار ثم شغّل العامل بـ runWithContext — وإلا لن تُدرَج هذه الاستدعاءات في التقرير:

let ctx = getContext()
Task {
  await runWithContext(ctx) {
    Tracera.step("worker") { /* ... */ }
  }
}

الاختبارات ذات المعاملات

كل صف في arguments حالة منفصلة. ضع عناصر نائبة مثل {user} أو {0} في عنوان @Test("…") أو في .traceraId(…, name:) ليحصل كل صف على autotestName خاص به:

@Test("login as {user}", .traceraId(7), arguments: ["alice", "bob"])
func login(user: String) {
  Tracera.step("sign in") { /* ... */ }
}