AppCode 2023.1 ヘルプ

AppCode の単体テスト

このチュートリアルでは、さまざまなテストフレームワーク(XCTest(英語) および Quick(英語)/ Nimble)(英語)を使用して、AppCode で簡単な単体テストを記述します。テストクラスとターゲットの作成、テストの実行とデバッグ、テストカバレッジ情報の表示などの方法を学習します。

始める前に

このチュートリアルでは、プロジェクトで CocoaPods を使用するチュートリアルで開発した iOSConferences (英語) アプリケーションを使用します。このアプリケーションは、cocoaconferences.com(英語) Web サイトからの今後の会議の最新リストを表示します。

  1. iOSConferences(英語) プロジェクトをダウンロードします。

  2. iOSConferences.xcworkspace ファイルを使用して AppCode でアプリケーションを開き、プロジェクトにすでに追加されている pods を IDE で認識できるようにします。

  3. CocoaPods gem がまだインストールされていない場合は、次のようにインストールします。

    1. メインメニューからツール | CocoaPods | Ruby SDK の選択をクリックします。

    2. 開いた環境設定ダイアログで、Ruby SDK を追加するをクリックし、SDK へのパス(デフォルトでは /usr/bin/ruby)を指定します。

    3. CocoaPods をインストールするをクリックします。

  4. 実行 / デバッグ構成セレクターで、アプリケーションを実行するデバイスまたはシミュレーターを選択し、Shift+F10 を押すか、the Run button をクリックします。

    Select device

    起動したアプリケーションは、会議のリストを表示する必要があります。

    The iOSConferences application

ステップ 1. テストターゲットを追加する

新しいプロジェクトを作成するときに、単体テストを含めるチェックボックスを選択して、テストターゲットと XCTest クラスを追加できます。ただし、既存のプロジェクトで作業している間はいつでも追加できます。

  1. Ctrl+Alt+Shift+S を押して、プロジェクト設定を開きます

  2. the Add button をクリックし、開いたダイアログから iOS | テスト | ユニットテストバンドルを選択して、次へをクリックします。

    Add a test target
  3. 次のページで、製品名フィールドに自動生成されたターゲット名 iOSConferencesTests を含むすべてのフィールドにデフォルト値を残し、完了をクリックします。

    Add a test target

新しいテストターゲットがプロジェクトに追加されます。

Added test target

このターゲットには、いくつかのテストメソッドのスタブコードを含むデフォルトの XCTest クラスが含まれています。

Stub code for an XCTest class

ステップ 2. XCTest テストを作成する

詳細画面に会議の日付が正しく表示されているかどうかを確認するためのテストをいくつか作成してみましょう。

  1. Shift+F6 をリファクタリングする名前変更を使用して、iOSConferencesTests クラスの名前を DateTests に変更します。

    Rename test
  2. YAML ファイルのデコードに使用される Yams ライブラリをインポートします。

    import Yams
  3. import ステートメントの直後に次の行を追加して、アプリケーションコードをテストに使用できるようにします。

    @testable import iOSConferences
  4. DateTests クラス内の既存のスタブコードをすべて削除します。

  5. DateTests クラスで、decoder インスタンス変数を追加します。

    let decoder = YAMLDecoder()
  6. 次のテスト方法を追加します。

    func testSameStartEndDatesShownCorrectly() { let yaml = try! decoder.decode([Conference].self, from: """ - name: mDevCamp link: https://mdevcamp.eu/ start: 2019-05-30 end: 2019-05-30 location: 🇨🇿 Prague, Czech Republic """ ) let conference: Conference = yaml[0] let textDate = conference.textDates() XCTAssertEqual(textDate, "May 30, 2019") } func testDateWithoutEndShownCorrectly() { let yaml = try! decoder.decode([Conference].self, from: """ - name: mDevCamp link: https://mdevcamp.eu/ start: 2019-05-30 location: 🇨🇿 Prague, Czech Republic """ ) let conference: Conference = yaml[0] let textDate = conference.textDates() XCTAssertEqual(textDate, "May 30, 2019") } func testEndEarlierThanStartReplaced() { let yaml = try! decoder.decode([Conference].self, from: """ - name: mDevCamp link: https://mdevcamp.eu/ start: 2019-05-30 end: 2019-05-29 location: 🇨🇿 Prague, Czech Republic """ ) let conference: Conference = yaml[0] let textDate = conference.textDates() XCTAssertEqual(textDate, "May 29, 2019 - May 30, 2019") }

    これらのメソッドは、特定の場合にアプリケーションが会議の日付を正しく表示するかどうかをテストします。

    • testSameStartEndDatesShownCorrectly() : start フィールドと end フィールドの値が同じである場合、アプリケーションは間隔ではなく 1 つの日付のみを表示する必要があります(May 30, 2019 - May 30, 2019 ではなく May 30, 2019)。

    • testDateWithoutEndShownCorrectly() : 会議に end 値が指定されていない場合、アプリケーションは開始日(May 30, 2019)のみを表示する必要があります。

    • testEndEarlierThanStartReplaced() : 開始日が終了日よりも遅い場合は、置き換える必要があります(May 31, 2019 - May 30, 2019 ではなく May 30, 2019 - May 31, 2019)。

作成したテストは後で実行してデバッグします。それでは、Quick および Nimble フレームワークを使用してテストを作成する方法を見てみましょう。

ステップ 3. クイック / 軽快なテストを作成する

アプリケーションが会議データを適切にロードして解析するかどうかを確認するテストをいくつか作成しましょう。

1. Quick および Nimble フレームワークをインストールする

  1. メインメニューのツール | CocoaPods | ポッドファイルを編集をクリックして、既存のポッドファイルを開きます。

  2. iOSConferencesTests ターゲットに Quickand Nimble pods を追加します。

    target 'iOSConferences' do use_frameworks! pod 'Yams' target 'iOSConferencesTests' do inherit! :search_paths pod 'Quick' pod 'Nimble' end end
  3. エディターの右上隅に表示される pods をインストールするリンクをクリックし、2 つの新しい pods がインストールされるまで待ちます。

    The Install pods link

2. 新しいテストクラスを作成する

  1. プロジェクトツールウィンドウ Alt+1 で、iOSConferencesTests フォルダーを右クリックし、新規 | Xcode テンプレートからファイルを選択します。

  2. 開いたダイアログで iOS | ソース | ユニットテストケースクラスを選択し、次へをクリックします。

  3. 次のページで、以下を指定します。

    • ファイル名 : ApiTests

    • 言語 : Swift

    • サブクラス : QuickSpec

    • ターゲット : iOSConferencesTests

    New test class
  4. 新しく作成された Swift ファイルで、Yams、Quick、Nimble インポートステートメントを追加し、ApiTests クラスのすべてのデフォルトメソッドを削除します。

    import XCTest import Yams import Quick import Nimble class ApiTests: QuickSpec { }
  5. import ステートメントの直後に次の行を追加して、アプリケーションコードをテストで使用できるようにします。

    @testable import iOSConferences

3. テストの作成

  1. QuickSpec クラスの spec() メソッドをオーバーライドします: キャレットを ApiTests クラス内に配置した状態で、Ctrl+O を押し、開いたダイアログで spec() を選択します。

    Override methods
  2. spec() メソッド内に、describe ブロックを追加し、そこに decoder 変数と loader 変数を作成します。

    override func spec() { describe("Application") { let decoder = YAMLDecoder() let loader = ConferencesLoader() } }
  3. describe ブロック内で、it ブロックに次のテストメソッドを追加します。

    it("should load conferences") { waitUntil(timeout: 5) { done in loader.loadConferences { conferences in done() } } } it("should parse conference") { let yaml = try! decoder.decode([Conference].self, from: """ - name: mDevCamp link: https://mdevcamp.eu/ start: 2019-05-30 end: 2019-05-30 location: 🇨🇿 Prague, Czech Republic """ ) let conference: Conference = yaml[0] expect(conference.end).toNot(beNil()) expect(conference.name).to(equal("mDevCamp")) expect(conference.start).toNot(beNil()) expect(conference.location).to(equal("🇨🇿 Prague, Czech Republic")) expect(conference.link).to(equal("https://mdevcamp.eu/")) } it("should ignore unused fields") { let yaml = try! decoder.decode([Conference].self, from: """ - name: mDevCamp link: https://mdevcamp.eu/ start: 2019-05-30 end: 2019-05-30 location: 🇨🇿 Prague, Czech Republic cocoa-only: true cfp: link: https://www.papercall.io/swift-to-2020 deadline: 2020-06-16 """ ) let conference: Conference = yaml[0] expect(conference.end).toNot(beNil()) expect(conference.name).to(equal("mDevCamp")) expect(conference.start).toNot(beNil()) expect(conference.location).to(equal("🇨🇿 Prague, Czech Republic")) expect(conference.link).to(equal("https://mdevcamp.eu/")) }

    これらのメソッドは、以下をテストします。

    • it("should load conferences") : loadConferences() メソッドで実行されたネットワーク要求は、空の応答を返しません。

    • it("should parse conference") : 会議データは正しく解析されます。

    • it("should ignore unused fields") : アプリケーションによって処理されないフィールド(cocoa-onlycfp など)を持つ会議は正しく解析されます。

ステップ 4. テストの実行とデバッグ

AppCode では、エディター the Run All button / the Run button または Ctrl+Shift+F10/^ ⇧ D ショートカットのガターアイコンを使用して、テストクラスのすべてのメソッドと単一のメソッド(XCTest の場合)をすばやく実行およびデバッグできます。この場合、一時的な実行 / デバッグ構成が作成され、必要に応じて保存および編集できます。

XCTest フレームワークの場合、実行ツールウィンドウから Alt+Shift+R を選択して実行するか、これらのメソッドがリストされている別の実行 / デバッグ構成を作成することにより、1 つのクラスの任意のメソッドセットを実行することもできます。詳細については、テスト用の実行 / デバッグ構成を作成するを参照してください。

このチュートリアルでは、プロジェクトで使用可能なすべてのテストクラスを実行するための実行 / デバッグ構成を作成し、失敗したテストをデバッグおよび修正し、テストがカバーするアプリケーションコードの量を確認します。

1. プロジェクト内のすべてのテストを実行する

テストターゲットですべてのテストクラスを実行するには、特別な実行 / デバッグ構成を作成する必要があります。

  1. 実行 / デバッグ構成セレクターで、実行構成の編集をクリックします。

    Create a test run/debug configuration
  2. 開いたダイアログで、the Add button をクリックし、XCTest を選択します。

    Add a new XCTest configuration
  3. デフォルトでは、AppCode はテストターゲット内のすべてのクラスの実行 / デバッグ構成を作成します。

    All tests configurations

    OK をクリックして、この構成を保存します。これで、実行 / デバッグ構成セレクターで事前に選択されています。

    All Test configuration selected

  4. Shift+F10 を押して、すべてのテストクラスを実行します。実行ツールウィンドウには、プロジェクトで使用可能なすべてのテストクラスの結果が表示され、2 つのテストが失敗したことがわかります。

    All tests passed

2. 失敗したテストをデバッグして修正する

  1. ツリーの DateTests ノードをクリックします。右側のペインに、テストが失敗した理由を理解するのに役立つエラーメッセージを含むスタックトレースが表示されます。この場合、期待値は textDate() メソッドによって返される実際の値と一致しません。

    The test log
  2. ツリーで testEndEarlierThanStartReplaced テストをクリックして、エディターでそのコードに移動します。

  3. 次の行のブレークポイントを設定する Ctrl+F8 :

    The breakpoint in the test method
  4. キャレットを testEndEarlierThanStartReplaced() メソッド内に配置した状態で、^ ⇧ D を押して、デバッグモードでテストを実行します。プログラムの実行はブレークポイントで停止し、デバッグツールウィンドウが開きます。

  5. F7 を押すか、the Step Into button をクリックして textDate() メソッドの実装に移動し、F8 を押すか Step Over button をクリックしてコード行をステップオーバーします。デバッグツールウィンドウの変数タブとエディターに、このメソッドが返す値が表示されます。

    Debugging method

    ご覧のとおり、ソースファイルで終了日と開始日が混同された場合に交換するためのコードはありません。textDates() メソッドのコードを次のように置き換えます。

    func textDates() -> String { var result = start.dateToString() if let end = self.end { if start < end { result = "\(result) - \(end.dateToString())" } else if start > end { result = "\(end.dateToString()) - \(result)" } } return result }
  6. デバッグツールウィンドウで、the Rerun Failed Tests button を押して失敗したテストを再実行し、コンソールタブに移動します。

    Paused test

    現在、ブレークポイントで実行が一時停止されています。F9 を押すか、App actions resume をクリックしてプログラムを再開します。すべてのテストに合格しました。

    All tests fixed

3. カバレッジを使用してテストを実行する

最後に、単体テストでカバーされているアプリケーションコードの量を確認しましょう。

  1. すべてのテストの実行 / デバッグ構成が選択されていることを確認してください。

  2. ツールバーの the Run with Coverage button をクリックします。

カバレッジツールウィンドウが開きます。

The Coverage tool window

フォルダーをダブルクリックしてその内容に移動するか、the Go Up button ボタンをクリックして上位レベルに移動します。

さらに、プロジェクトツールウィンドウで、テストの対象となるファイルと行の割合を確認できます。

Coverage in the Project tool window

エディターでは、色付きのストライプがガターに表示されます。緑は、線がテストで完全に覆われていることを意味し、黄色(部分的に覆われている、赤)は覆われていないことを意味します。

Coverage indicators in the editor

カバレッジインジケータをクリックすると、ポップアップが表示されます。

Coverage indicators

ここでは、テスト中に回線が実行された回数を確認し、カバレッジを非表示をクリックしてカバレッジデータを非表示にできます。再度表示するには、Ctrl+Alt+F6 を押して、開いたダイアログから必要なカバレッジスイートを選択します。

AppCode のテストカバレッジの詳細については、カバレッジ付きで実行するを参照してください。

関連ページ:

プロジェクトで CocoaPods を使用する

このチュートリアルでは、cocoaconferences.comWeb サイトで使用されているリモート YAML ファイルから最新の会議リストをロードすることにより、iOSConferences アプリケーション(AppCode で SwiftUI アプリケーションを作成するを参照)について詳しく説明します。YAML ファイルを解析するには、CocoaPods 依存関係マネージャーを使用してプロジェクトに追加される Yams ライブラリを使用します。ステップ 1. CocoaPods をインストールする...

プロジェクトの作成と管理

プロジェクトは、完全なソフトウェアソリューションを表す組織単位です。これは、コーディング支援、一括リファクタリング、コーディングスタイルの一貫性などの基盤として機能します。AppCode は Xcode プロジェクトフォーマットを使用します。これにより、AppCode で既存の Xcode プロジェクトを開き、Xcode と互換性のある新しいプロジェクトを作成できます。すべての Xcode プロジェクトテンプレートは AppCode で利用可能です。新規プロジェクトを作成する:現在 AppCod...

アプリケーションを実行する

AppCode を使用すると、実際のデバイスだけでなく、シミュレートされたデバイスでも iOS および tvOS アプリケーションを実行できます。macOS のアプリケーションは、AppCode がインストールされている現在の Mac で実行されます。実行 / デバッグ構成を選択する:AppCode では、Xcode スキームの類似物であり、それらと同期される実行 / デバッグ構成を使用してアプリケーションを実行します。AppCode で作成されたすべてのプロジェクトには、アプリケーションと同...

Xcode プロジェクトの設定

Xcode 互換プロジェクトの設定を表示および編集するには、メインメニューからを選択します。AppCode は、ほぼすべての Xcode 互換のプロジェクト設定をカバーしています。AppCode を安全に使用して、ビルド設定、ビルドフェーズなどを構成できます。設定を検索するには、検索したいものを入力し始めます(フォーカスがビルド設定タブ内にある間)。ただし、一部の設定(資格、プロビジョニングプロファイルなど)では、Xcode プロジェクトエディターがより便利な設定オプションを提供しています。Xc...

実行 / デバッグ構成

AppCode は、実行 / デバッグ構成を使用して、コードを実行、デバッグ、テストします。各構成は、何を実行し、どのパラメーターと環境を使用するかを定義する、名前付きのスタートアッププロパティのセットです。AppCode の実行 / デバッグ構成は Xcode スキームと同等であり、それらとの同期が維持されます。実行 / デバッグ構成には 2 つのタイプがあります。一時的 — テストクラスまたはメソッドを実行するたびに作成され、ガターアイコン / を使用します。永続的 — テンプレートから明示的に作成さ...

テスト用の実行 / デバッグ構成を作成する

実行 / デバッグ構成を使用して、通常のアプリケーションを実行するのと同様の方法でテストを実行できます。テスト設定を作成するメインメニューからを選択します。ツールバーのをクリックして、利用可能なテストフレームワークのいずれかを選択します: Boost.Test、Catch、Google Test、または XCTest。開いたダイアログで、次の構成を変更できます。名前フィールドで、実行 / デバッグ構成の名前を変更します。デフォルト名には、選択したクラス / メソッドとテストターゲットが含まれます...