🔰Swiftでテストコードを書いたこと無い人へ

**実務で使ってないし...**
**どれほど便利か分からないし...**

**そう思ってテストコード書いたことない方へ！**

# 改めて基礎を学んだら意外とスムーズに理解できるので、Swiftのテストコード基本知識をまとめてみました！


:::note info
**Swiftのテストコード　＝　XCTest(フレームワーク)**
:::

と思ってもらってOKらしいです。

`🤭Swift6.0からTestingという新たなフレームワークも出ましたがまずはXCTestをサクッと学ぼう！`
[Testing](https://swiftpackageindex.com/swiftlang/swift-testing/main/documentation/testing)


XCTestを使うと、手動で動作確認しなくても、自動でコードの動作をチェックできる ようになります。

本記事では、XCTestの基本を解説しながら、実際のコード例も交えて紹介します。

# XCTestとは？

XCTestは、Appleが提供する単体テストのためのフレームワークです。

✅ アプリのバグを早く見つける → 手動で動かさなくてもチェックできる
✅ 修正による影響を防ぐ → 変更した部分が他に影響を与えていないか確認できる
✅ 安心して開発できる → 自動テストがあれば、新しい機能を追加するときも安心！

では、早速 XCTestの基本的な使い方を見ていきましょ！

# XCTestの基本構成

Swiftのテストを書くには、XCTestCase を継承したクラスを作ります。

基本の流れは次の通り：

1\. **テストクラスを作成する**
2\. **初期化テストメソッドを書く**
3\. **XCTAssertで結果をチェックする**

## 1.テストクラスを作成する
Swift(UI)アプリを作ると、自動でテスト用のファイルを生成できます。例えば、MyAppTests.swift というファイルがあった場合、こんな感じのコードが入っています。

:::note info
自動で作成せずとも後から自分で作成することもできますよ！
:::

``` swift
import XCTest
@testable import MyApp  // 自分のアプリのコードをテストできるようにする

final class MyAppTests: XCTestCase {
    override func setUp() {
        // 各テストの前に呼ばれる
        super.setUp()
    }

    override func tearDown() {
        // 各テストの後に呼ばれる
        super.tearDown()
    }

    func testExample() {
        // ここにテストを書く
    }
}
```
## 2.初期化テストメソッドを書く
基本的にoverrideメソッドは以下２つ。
### setUp
``` swift
override func setUp() {
    super.setUp()
    // 各テストが実行される前に呼ばれる
}
```
テストの前に準備をするメソッドです。
例えば、データを初期化したり、テスト用のオブジェクトを作成するのに使います。

### tearDown
``` swift
override func tearDown() {
    // 各テストが終わった後に呼ばれる
    super.tearDown()
}
```
テストが終わった後に後片付けをするメソッドです。
例えば、一時ファイルを削除したり、メモリを開放する処理を入れます。



## 3.XCTAssertで結果をチェックする

テストでは、XCTAssert を使って値をチェックします。
基本は`XCTAssert◯◯◯`メソッドで判定します。(XCTFailは例外！)

### 1.XCTAssertEqual（値が等しいかチェック）
``` swift
XCTAssertEqual(2 + 3, 5)  // OK
XCTAssertEqual("Hello", "hello")  // NG（大文字・小文字が違う）
```
「左と右の値が等しいか？」 をチェックします。

### 2.XCTAssertNotEqual（値が異なるかチェック）
``` swift
XCTAssertNotEqual(2 + 3, 6)  // OK（5と6は違う）
```
「左と右の値が違うか？」 を確認します。

### 3.XCTAssertTrue（条件がtrueか？）
``` swift
let isUserLoggedIn = true
XCTAssertTrue(isUserLoggedIn)  // OK
```
「この値はtrueか？」 をチェックします。

### 4.XCTAssertFalse（条件がfalseか？）
``` swift
let isUserLoggedIn = false
XCTAssertFalse(isUserLoggedIn)  // OK
```
「この値はfalseか？」 をチェックします。

### 5.XCTAssertNil（値がnilか？）
``` swift
let value: String? = nil
XCTAssertNil(value)  // OK
```
「この値はnilか？」 を確認します。

### 6.XCTAssertNotNil（値がnilでないか？）
``` swift
let value: String? = "Hello"
XCTAssertNotNil(value)  // OK
```
「この値はnilでないか？」 を確認します。

### 7.XCTFail（失敗を強制する）
``` swift
XCTFail("このテストは失敗する")
```
このメソッドを実行すると、必ずテストが失敗 します。
「ここに来るべきではない」といったケースをチェックするのに使います。

# 実際にテストを書いてみよう！

例として、「文字列を逆にする関数」を作って、それをテストしてみます。

まず、StringReverser というクラスを作ります。
``` swift
class StringReverser {
    func reverse(_ input: String) -> String {
        return String(input.reversed())
    }
}
```

次に、この関数が 正しく動くかチェックする XCTestを書きます。
``` swift
import XCTest
@testable import MyApp  // 自分のアプリのコードをテストできるようにする

final class StringReverserTests: XCTestCase {
    var reverser: StringReverser!
    
    override func setUp() {
        super.setUp()
        reverser = StringReverser()
    }
    
    override func tearDown() {
        reverser = nil
        super.tearDown()
    }
    
    func testReverse() {
        let result = reverser.reverse("Hello")
        XCTAssertEqual(result, "olleH", "Hello を逆にすると olleH にな！")
    }
}
```
これを実行すると…
✅ Hello を逆にすると olleH になるかチェックしてくれます！

# まとめ

**XCTest**を使うと、Swiftのコードを自動でテストできる！

✅ setUp はテストの前に準備する
✅ tearDown はテストの後に後片付けをする
✅ XCTAssertを使って、値をチェックできる

# Future Work
新しいApple純正テストフレームワークを使ってみたい未来の自分用メモ
[Apple Document - Testing](https://swiftpackageindex.com/swiftlang/swift-testing/main/documentation/testing)

Quiita記事

https://qiita.com/_asa08_/items/b36fdbbfd95cb44c9922