XCUITest

أضف التبعية TraceraXCUITest من tracera-swift إلى هدف اختبارات الواجهة في Package.swift (يجلب معه Tracera):

dependencies: [
  .package(url: "https://github.com/tracera-dev/tracera-swift", from: "0.1.0"),
],
targets: [
  .testTarget(
    name: "MyAppUITests",
    dependencies: [
      .product(name: "TraceraXCUITest", package: "tracera-swift"),
    ]
  ),
]

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

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

ورّث TraceraXCTestCase واستدعِ install() مرة واحدة في class func setUp() (الوسائط معطّلة افتراضيًا — انظر لقطات الشاشة):

import XCTest
import Tracera
import TraceraXCUITest

final class CheckoutUITests: TraceraXCTestCase {
  override class func setUp() {
    install()
  }
  // …
}

عند تجاوز instance setUp / tearDown (مرة لكل اختبار — وليس class func setUp)، استدعِ super.setUp() في نهاية setUp وsuper.tearDown() في بداية tearDown حتى تقع الخطوات في الإعداد / الاختبار / التنظيف.

ربط testCaseId وautotestName

اربط بـ Tracera.testCase في بداية كل دالة اختبار:

func testCheckout() {
  Tracera.testCase(42)
  // Tracera.testCase(42, "e2e/checkout")
  // …
}

إذا حُذف name، يأخذ autotestName اسم اختبار XCTest. يمكنك الربط في instance setUp إذا شاركت عدة دوال نفس معرف الحالة.

التخطي

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

func testCheckout() throws {
  Tracera.testCase(42)
  try skip("needs a seeded account")
}

الخطوات

استخدم Tracera.step("…") { } أو await Tracera.step("…") { }. خطوات instance setUp / tearDown تذهب إلى الإعداد / التنظيف في النتيجة؛ خطوات جسم الاختبار إلى الاختبار.

override func setUp() {
  Tracera.step("launch app") { }
  super.setUp()
}

func testCheckout() throws {
  Tracera.testCase(10)
  try Tracera.step("tap checkout") {
    try Tracera.step("nested leaf") { }
  }
}

override func tearDown() {
  super.tearDown()
  Tracera.step("terminate app") { }
}

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

الحدود وأنواع 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") { /* ... */ }
  }
}

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

استخدم Tracera.testCase(id, name) حرفيًا (أو احذف name → اسم اختبار XCTest).

لقطات الشاشة والوسائط

install() مطلوب للتقارير (انظر أعلاه). عبر معاملاته يمكن إرفاق الوسائط في نهاية كل اختبار (الافتراضي .off): screenshots: — .onFailure / .onSuccess / .always (iOS/tvOS: XCUIScreen؛ macOS: ScreenCaptureKit عند السماح بتسجيل الشاشة)؛ hierarchy: → window-hierarchy.txt؛ logs: → device-log.txt (unified log / OSLogStore).

override class func setUp() {
  install(screenshots: .onFailure, hierarchy: .onFailure, logs: .onFailure)
}

لإرفاق لقطة شاشة أو التسلسل الهرمي أو سجل الجهاز في لحظة تختاره (مثلًا بعد نقرة) استدعِ يدويًا:

Tracera.step("after login") {
  screenshot()
  attachHierarchy()
  attachDeviceLog()
}