非同期テストとパフォーマンス計測
async/awaitで非同期関数をテストし、XCTMeasureOptionsで計測します。
「非同期テストとパフォーマンス計測」はCoddyKit上の無料Swift Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これは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()
}コールバック API 用の XCTestExpectation
async/await ではなくコールバックを使用する API には、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)
}期待値の反転
反転した期待値は、期待値が満たされると失敗します。コールバックが呼び出されないことをアサートする場合に役立ちます。
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
反復回数と測定する指標(時間、メモリ、CPU)を設定します。
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アクター分離されたコードのテスト
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 には、XCTest の最新の代替となる新しい Testing フレームワークが含まれています。@Test、#expect、@Suite を使用します。
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 API はどれですか。
学習内容のまとめ
テストメソッドに async throws を付けると、await を直接使用できます。コールバックAPIには XCTestExpectation を使用します。measure {} で計測し、リグレッション検出用のベースラインを設定します。アクターは await を使ってテストします。最新のテストには、Swift Testingの @Test と #expect も活用できます。
よくある質問
「非同期テストとパフォーマンス計測」レッスンは無料ですか?
はい。「非同期テストとパフォーマンス計測」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Swift Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Swift Academyコースには全4レッスンが含まれています。
「非同期テストとパフォーマンス計測」で何を学びますか?
async/awaitで非同期関数をテストし、XCTMeasureOptionsで計測します。 ブラウザで直接実行するハンズオンコードでSwift Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Swift Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのSwift Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。
「非同期テストとパフォーマンス計測」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このSwift Academyレッスンでコードを書いて実行できますか?
はい。すべてのSwift Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。