تست با XCTest (Testing with XCTest)
تست یعنی امتحان کد. فریم ورک XCTest ابزار همین کار است. اول منطق را می سنجیم. سپس رابط کاربری را خودکار چک می کنیم. مثل امتحان کلاسی اما دقیق تر.
تست واحد (Unit Test)
تست واحد یعنی سنجش یک تکه کوچک کد. کلاس تست از XCTestCase ارث می برد. سپس با اَسرشن ها نتیجه را می سنجیم.
نمونه: کد ساده برای تست
import Foundation
struct Math {
static func add(_ a: Int, _ b: Int) -> Int {
return a + b
}
}
نمونه: کلاس تست واحد
import XCTest
@testable import MyApp
final class MyTests: XCTestCase {
func testAdd() {
XCTAssertEqual(Math.add(2, 3), 5)
}
}
نکته: از @testable import برای دسترسی داخلی استفاده کن.
نوشتن تست با الگوی AAA
AAA یعنی Arrange، Act، Assert. اول ورودی ها را بچین. سپس کد را اجرا کن. در پایان نتیجه را بسنج.
نمونه: AAA در عمل
import XCTest
@testable import MyApp
final class MyTests: XCTestCase {
func testAdd() {
// Arrange
let a = 2
let b = 3
// Act
let sum = Math.add(a, b)
// Assert
XCTAssertEqual(sum, 5)
}
}
اَسرشن های پرکاربرد
- XCTAssertEqual و XCTAssertNotEqual برای برابری.
- XCTAssertTrue و XCTAssertFalse برای شرط ها.
- XCTAssertNil و XCTAssertNotNil برای تهی بودن.
- XCTAssertThrowsError و XCTAssertNoThrow برای خطاها.
تست های ناهمگام (Async)
گاهی کار زمان می برد. با انتظار، پایان کار را صبر کن. سپس نتیجه را بسنج.
نمونه: انتظار برای کار ناهمگام
import XCTest
final class AsyncTests: XCTestCase {
func testExpectation() {
let exp = expectation(description: "async work")
DispatchQueue.global().async {
exp.fulfill()
}
wait(for: [exp], timeout: 1.0)
}
}
تست عملکرد (Performance)
زمان اجرا مهم است. با measure سرعت را بسنج. سپس بهینه سازی کن.
نمونه: سنجش مرتب سازی
import XCTest
final class PerformanceTests: XCTestCase {
func testSortPerformance() {
let input = Array(0..<10_000).shuffled()
measure {
_ = input.sorted()
}
}
}
تست رابط کاربری (UI Tests)
در UI تست، اپ با XCUIApplication اجرا می شود. سپس با دسترس پذیری عناصر را پیدا کن. در پایان نتیجه را بسنج.
نمونه: اپ ساده برای تست UI
import SwiftUI
struct CounterView: View {
@State private var count = 0
var body: some View {
VStack(spacing: 12) {
Text("Count: \(count)")
Button("Increment") {
count += 1
}
}
.padding()
}
}
import SwiftUI
struct ContentView: View {
var body: some View {
CounterView()
}
}
import SwiftUI
@main
struct MyApp: App {
var body: some Scene {
WindowGroup {
ContentView()
}
}
}
import XCTest
final class MyUITests: XCTestCase {
func testIncrementButtonIncrementsCount() {
let app = XCUIApplication()
app.launch()
let increment = app.buttons["Increment"]
XCTAssertTrue(increment.exists)
increment.tap()
XCTAssertTrue(app.staticTexts["Count: 1"].exists)
}
}
پلن تست و CI
پلن تست یعنی تنظیمات اجرا. در CI با xcodebuild test روی شبیه ساز اجرا کن. تست ها باید قطعی و سریع باشند.
هشدار: به اینترنت وابسته نشو. شبکه را ماک کن. زمان را کنترل کن.
جمع بندی سریع
- تست واحد، ریز و سریع است.
- AAA نظم تست را حفظ می کند.
- Async را با انتظار بسنج.
- UI را با دسترس پذیری هدف گیری کن.
- CI اجرای پایدار می دهد.
مطالب مرتبط: آنالیتیکس و گزارش گیری، حریم خصوصی اپ، تست XCTest.