AppCode の単体テスト
このチュートリアルでは、さまざまなテストフレームワーク(XCTest(英語) および Quick(英語)/ Nimble)(英語)を使用して、AppCode で簡単な単体テストを記述します。テストクラスとターゲットの作成、テストの実行とデバッグ、テストカバレッジ情報の表示などの方法を学習します。
始める前に
このチュートリアルでは、プロジェクトで CocoaPods を使用するチュートリアルで開発した iOSConferences (英語) アプリケーションを使用します。このアプリケーションは、cocoaconferences.com(英語) Web サイトからの今後の会議の最新リストを表示します。
iOSConferences(英語) プロジェクトをダウンロードします。
iOSConferences.xcworkspace ファイルを使用して AppCode でアプリケーションを開き、プロジェクトにすでに追加されている pods を IDE で認識できるようにします。
CocoaPods gem がまだインストールされていない場合は、次のようにインストールします。
メインメニューからをクリックします。
開いた環境設定ダイアログで、Ruby SDK を追加するをクリックし、SDK へのパス(デフォルトでは /usr/bin/ruby)を指定します。
CocoaPods をインストールするをクリックします。
実行 / デバッグ構成セレクターで、アプリケーションを実行するデバイスまたはシミュレーターを選択し、Shift+F10 を押すか、
をクリックします。

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

ステップ 1. テストターゲットを追加する
新しいプロジェクトを作成するときに、単体テストを含めるチェックボックスを選択して、テストターゲットと XCTest クラスを追加できます。ただし、既存のプロジェクトで作業している間はいつでも追加できます。
Ctrl+Alt+Shift+S を押して、プロジェクト設定を開きます。
をクリックし、開いたダイアログから を選択して、次へをクリックします。

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

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

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

ステップ 2. XCTest テストを作成する
詳細画面に会議の日付が正しく表示されているかどうかを確認するためのテストをいくつか作成してみましょう。
Shift+F6 をリファクタリングする名前変更を使用して、
iOSConferencesTestsクラスの名前をDateTestsに変更します。
YAML ファイルのデコードに使用される Yams ライブラリをインポートします。
import Yamsimport ステートメントの直後に次の行を追加して、アプリケーションコードをテストに使用できるようにします。
@testable import iOSConferencesDateTestsクラス内の既存のスタブコードをすべて削除します。DateTestsクラスで、decoderインスタンス変数を追加します。let decoder = YAMLDecoder()次のテスト方法を追加します。
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 フレームワークをインストールする
メインメニューのをクリックして、既存のポッドファイルを開きます。
iOSConferencesTests ターゲットに Quickand Nimble pods を追加します。
target 'iOSConferences' do use_frameworks! pod 'Yams' target 'iOSConferencesTests' do inherit! :search_paths pod 'Quick' pod 'Nimble' end endエディターの右上隅に表示される pods をインストールするリンクをクリックし、2 つの新しい pods がインストールされるまで待ちます。

2. 新しいテストクラスを作成する
プロジェクトツールウィンドウ Alt+1 で、iOSConferencesTests フォルダーを右クリックし、を選択します。
開いたダイアログで を選択し、次へをクリックします。
次のページで、以下を指定します。
ファイル名 :
ApiTests言語 : Swift
サブクラス :
QuickSpecターゲット : iOSConferencesTests

新しく作成された Swift ファイルで、Yams、Quick、Nimble インポートステートメントを追加し、
ApiTestsクラスのすべてのデフォルトメソッドを削除します。import XCTest import Yams import Quick import Nimble class ApiTests: QuickSpec { }import ステートメントの直後に次の行を追加して、アプリケーションコードをテストで使用できるようにします。
@testable import iOSConferences
3. テストの作成
QuickSpecクラスのspec()メソッドをオーバーライドします: キャレットをApiTestsクラス内に配置した状態で、Ctrl+O を押し、開いたダイアログでspec()を選択します。
spec()メソッド内に、describeブロックを追加し、そこにdecoder変数とloader変数を作成します。override func spec() { describe("Application") { let decoder = YAMLDecoder() let loader = ConferencesLoader() } }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-onlyやcfpなど)を持つ会議は正しく解析されます。
ステップ 4. テストの実行とデバッグ
AppCode では、エディター /
または Ctrl+Shift+F10/^ ⇧ D ショートカットのガターアイコンを使用して、テストクラスのすべてのメソッドと単一のメソッド(XCTest の場合)をすばやく実行およびデバッグできます。この場合、一時的な実行 / デバッグ構成が作成され、必要に応じて保存および編集できます。
XCTest フレームワークの場合、実行ツールウィンドウから Alt+Shift+R を選択して実行するか、これらのメソッドがリストされている別の実行 / デバッグ構成を作成することにより、1 つのクラスの任意のメソッドセットを実行することもできます。詳細については、テスト用の実行 / デバッグ構成を作成するを参照してください。
このチュートリアルでは、プロジェクトで使用可能なすべてのテストクラスを実行するための実行 / デバッグ構成を作成し、失敗したテストをデバッグおよび修正し、テストがカバーするアプリケーションコードの量を確認します。
1. プロジェクト内のすべてのテストを実行する
テストターゲットですべてのテストクラスを実行するには、特別な実行 / デバッグ構成を作成する必要があります。
実行 / デバッグ構成セレクターで、実行構成の編集をクリックします。

開いたダイアログで、
をクリックし、XCTest を選択します。

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

OK をクリックして、この構成を保存します。これで、実行 / デバッグ構成セレクターで事前に選択されています。
Shift+F10 を押して、すべてのテストクラスを実行します。実行ツールウィンドウには、プロジェクトで使用可能なすべてのテストクラスの結果が表示され、2 つのテストが失敗したことがわかります。

2. 失敗したテストをデバッグして修正する
ツリーの DateTests ノードをクリックします。右側のペインに、テストが失敗した理由を理解するのに役立つエラーメッセージを含むスタックトレースが表示されます。この場合、期待値は
textDate()メソッドによって返される実際の値と一致しません。
ツリーで testEndEarlierThanStartReplaced テストをクリックして、エディターでそのコードに移動します。
次の行のブレークポイントを設定する Ctrl+F8 :

キャレットを
testEndEarlierThanStartReplaced()メソッド内に配置した状態で、^ ⇧ D を押して、デバッグモードでテストを実行します。プログラムの実行はブレークポイントで停止し、デバッグツールウィンドウが開きます。F7 を押すか、
をクリックして
textDate()メソッドの実装に移動し、F8 を押すかをクリックしてコード行をステップオーバーします。デバッグツールウィンドウの変数タブとエディターに、このメソッドが返す値が表示されます。

ご覧のとおり、ソースファイルで終了日と開始日が混同された場合に交換するためのコードはありません。
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 }デバッグツールウィンドウで、
を押して失敗したテストを再実行し、コンソールタブに移動します。

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

3. カバレッジを使用してテストを実行する
最後に、単体テストでカバーされているアプリケーションコードの量を確認しましょう。
すべてのテストの実行 / デバッグ構成が選択されていることを確認してください。
ツールバーの
をクリックします。
カバレッジツールウィンドウが開きます。

フォルダーをダブルクリックしてその内容に移動するか、 ボタンをクリックして上位レベルに移動します。
さらに、プロジェクトツールウィンドウで、テストの対象となるファイルと行の割合を確認できます。

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

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

ここでは、テスト中に回線が実行された回数を確認し、カバレッジを非表示をクリックしてカバレッジデータを非表示にできます。再度表示するには、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。開いたダイアログで、次の構成を変更できます。名前フィールドで、実行 / デバッグ構成の名前を変更します。デフォルト名には、選択したクラス / メソッドとテストターゲットが含まれます...