XCode 16.3 日本語化計画
あなたの関数内のロジックをテストし、統合の問題をチェックし、UI ワークフローを自動化し、パフォーマンスを測定するためのコードをビルドするテストターゲットを追加します。
Xcode 16 以降で新規プロジェクトを作成する際は、オプションダイアログのポップアップメニューからテストシステムを選択し、Xcode にテストバンドルを構成させてあなたのプロジェクトを構成してもらいます。
Xcode には 2 つのテストフレームワークが含まれています。
Swift Testing (Swift のテスト)
Swift プログラミング言語の強力で表現力豊かな言語機能を活用した、より新しくモダンなテストフレームワークです。テスト作成にかかるコード量を削減し、より実用的なフィードバックを提供します。あなたのコードを直接呼び出すユニットテストや統合テストにご利用ください。
XCTest
ユニットテスト、統合テスト、UI テスト、パフォーマンステストの作成をサポートする、広く使用され、確立されたテストフレームワークです。
テストシステムのオプションは、「Swift Test with XCTest UI Tests」と「XCTests for Unit and UI Tests」です。選択すると、Xcode によってあなたのプロジェクトに 2 種類のテストターゲットが追加されます。1 つは名前が「Tests」で終わるユニットテスト用、もう 1 つは名前が「UITests」で終わる UI テスト用です。プロジェクトナビゲータには、これらのターゲットに一致する名前と、あなたの最初のテストを書き始められるテンプレートファイルをあなたは見つけられるでしょう。あなたのテストシステムの選択は、ユニットテストのファイルテンプレートに含まれる主要なフレームワーク Xcode に影響します。以前のバージョンの Xcode では、新規プロジェクトの作成時に「Include Tests」オプションを有効にするとこれらのターゲットが含まれ、XCTest を使用するファイルテンプレートが含まれていました。
追加のターゲットにテストを追加する必要がある場合、または既存のターゲットにテストを追加したい場合は、以下の手順を実行します。
テストを記述するには、あなたのテストターゲットからテストファイルを選択し、ユニットテストを記述する型または関数を選択します。 あなたのターゲットに新しいテストファイルを追加する必要がある場合は、"File (ファイル)" > "New(新規)"" > "New File From Template (テンプレートから新規ファイルを作成)" を選択し、"Swift Testing Unit Test" または "XCTest Unit Test" を選択して、適切な構造のテストファイルを追加します。ユニットテストを実装するテスト関数は、以下の 3 つのステップを順に実行します。
Swift Testing において、テスト関数は Test 属性を追加した通常の Swift 関数です。グローバル関数や型メソッドとして使用できます。また、Suite 属性でマークしてテスト関数を含む型スイートを識別することもオプションでできます。スイートを async や throws としてマークしたり、グローバル actor に分離したりすることも可能です。
XCTest で作成するテストでは、テストメソッドを格納するための XCTestCase のサブクラスを作成します。あなたの XCTestCase のサブクラスに、引数を取らずに Void を返すメソッドを追加し、そのメソッドに "test" で始まる名前を付けます。
Swift Testing | XCTest |
struct MyAPITests {
@Test func myAPIWorks() {
// Arrange: Create the necessary dependencies.
// Act: Call myAPIWorks, using the dependencies created above.
#expect(/* … */, "The function didn't return the expected result")
}
}
class MyAPITests : XCTestCase {
func testMyAPIWorks() {
// Arrange: create the necessary dependencies.
// Act: call my API, using the dependencies created above.
XCTAssertTrue(/* … */, "The function didn't return the expected result")
}
}
複数のパスをカバーし、各シナリオでテストを実施します。例えば、関数がオプションのパラメータを受け取る場合、パラメータが nil としてテストされ、nil 以外の値をテストします。あなたのコード内の境界ケースと論理分岐を特定し、これらのケースの各組み合わせをカバーするユニットテストを記述します。Swift Testing を使用して、あなたのプロジェクト内の関数またはメソッドを通る複数のパスをテストするには、パラメータ化されたテスト関数を実装します。詳細については、パラメータ化されたテストの実装 (Implementing parameterized tests) を参照してください。XCTest では、各ユニットテストで、あなたのプロジェクト内のメソッドまたは関数を通る単一のパスの期待される動作をアサート (断言) する必要があります。複数のパスをカバーするには、シナリオごとに 1 つのテストを記述します。
Swift Testing を使用したテストの定義の詳細については、テスト関数の定義 (Defining test functions) を参照してください。XCTest を使用したテストの定義の詳細については、テストケースとテストメソッドの定義 (Defining Test Cases and Test Methods) を参照してください。
統合テストはユニットテストと非常によく似ており、同じ API を使用し、同じ Arrange-Act-Assert (配置ー実行ーアサート) パターンに従います。ユニットテストと統合テストの違いの一つは、その規模です。ユニットテストはあなたのアプリのロジックのごく一部をカバーしますが、統合テストはより大きなサブシステム、つまりクラスと関数の組み合わせの動作を検証します。統合テストの Arrange (配置) ステップでは、スタブ オブジェクトを少なくすることで、テスト対象となる実際のプロジェクトコードの範囲を広げます。
ユニットテストのようにあらゆる条件や境界条件を網羅しようとするのではなく、統合テストは、重要な状況においてコンポーネントが連携してアプリの目的を達成することを検証するために使用します。例では、コントローラーから受信した値がモデルに正しく保存されるか、ネットワークの要求によって生成されたエラーがユーザーインターフェースに渡され、表示されるかといったテストが含まれます。
UI テストは、ユニットテストや統合テストとは異なる方法で動作します。新規ファイル用の XCTest UI Test テンプレートには、UI テストの一般的な開始点が含まれています。あなたのアプリの UI テストは、XCTestCase のサブクラスである XCTest を使用して実装します。あなたのアプリのコードを直接実行するのではなく、アプリのユーザーインターフェースコントロールを使用して、ユーザーがアプリを使用して特定のタスクを完了できるかどうかを判断します。
UI テストを作成して、アプリがユーザーの操作に応じてタスクを実行できること、そして UI コントロールの動作を阻害するバグが発生していないことを確認します。実際のユーザーアクティビティを再現する UI テストは、アプリが意図したタスクに使用できるという確信をもたらします。ドキュメントを基礎としたのアプリの UI テストでは、ユーザーが新しいドキュメントを作成し、そのコンテンツを編集し、そしてドキュメントを削除できることを検証できます。
XCTestCase サブクラスのメソッドで UI テストを作成するには、Xcode の Record UI Test (UI テストの記録) 機能を使用して、あなたのアプリの操作を記録します。UI テストは、不具合が発生した場合にユーザーに影響を与える最も重要なワークフローを再現し、報告されたバグを再生して逆行を回避するように設計します。
あなたがテストする機能を実行するワークフローを記録する場合は、テストアサーション関数を使用して、記録された操作中に実行されたアクションを考慮して、UI の最終状態が期待どおりであることを確認します。
class MyUITests: XCTestCase { let app = XCUIApplication() // MARK: - Setup and Teardown override func setUp() { super.setUp() // In UI tests, it's prudent to stop the test immediately if a failure occurs. continueAfterFailure = false // UI tests must launch the app that they test. Do this in setup to ensure that it the app //launches for each test method. XCUIApplication().launch() } override func tearDown() { // Put teardown code here. The test runner calls this method after the invocation of each //test method in the class. super.tearDown() } func testAddition() { // Perform UI actions to accomplish a task. // Check the expected state UI value. if let value = app.<ui_type>[<ui_identifier>].value as? String { XCTAssertTrue(value = /* … */, "The function didn't return the expected result") } } }
UI テストが複数の異なるステップを含む複雑なワークフローを模倣する場合、XCTActivity を使用して共有ステップを整理し、名前を付けます。複数のテストであなたが使用するアクティビティの実装を共有するためのヘルパーメソッドを作成します。
コード領域の実行中に、所要時間、メモリ使用量、または書き込みデータに関する情報を収集するパフォーマンステストを記述します。XCTest はあなたのコードを複数回実行し、要求された指標を測定します。指標のベースライン期待値を設定することができ、測定値がベースラインよりも大幅に悪い場合、XCTest はテスト失敗を報告します。
あなたのコードの実行時間をテストするには、テストメソッド内で measure(_:) を呼び出し、あなたのアプリのコードを measure(_:) のブロック引数内で実行します。メモリ使用量やディスクに書き込まれるデータ量など、他の指標を使用してパフォーマンスを測定するには、measure(metrics:block:) を呼び出します。
class PerformanceTests : XCTestCase {
func testCodeIsFastEnough() {
self.measure() {
// Place performance-sensitive code here.
}
}
}
あなたの既存のコードベースを更新してユニットテストに対応する
コンポーネント間の結合を排除することで、テストの適用範囲と信頼性を向上させます。
あなたのテストでカバーするコードの範囲を決定する (Determining how much code your tests cover)
コードカバレッジを使用して、十分なテストが不足している領域に新しいテスト開発を集中させます。
テストをテスト計画に整理することでコード評価を改善します (Improving code assessment by organizing tests into test plans)
テスト計画を作成および構成することで、ソフトウェアエンジニアリングプロセスのさまざまな段階であなたがテストから取得する情報を制御します。