[Xcode/Swift] XCTestを学ぶ① (基本編)

XCTestはiOSアプリケーションをテストするためのフレームワークで、アプリが意図した通りに動作するかどうかを確認するために使われます。この記事では、XCTestの基本的なアサーション(Assertion)を学び、テストの基本的な構造や役割を紹介します。

まだ理解が浅いので間違ったことを言ったりコードがおかしかったりするかもですが許してください。

XCTestとは?

XCTestは、XcodeでユニットテストやUIテストを行うためのフレームワークです。テストを実行することで、コードが期待通りに動作しているか、バグや問題がないかを確認できます。アサーション(Assertion)は、特定の条件が満たされているかどうかを確認するためのメソッドで、これによりテストの成否が判断されます。

XCTestの基本的な構成

XCTestのテストケースは、XCTestCaseクラスを継承したクラスの中に記述します。各テストはfunc testSomething()のようにtestというプレフィックスがついたメソッドで行います。

import XCTest

struct Dog: Equatable {
    var name: String
    var age: Int
}

class BasicAssertionTest: XCTestCase {

    private let string = "Hello"
    private let notNumber = Int("Hello")
    private let number = Int("334")
    private let dog1 = Dog(name: "一郎", age: 51)
    private let dog2 = Dog(name: "翔平", age: 30)

    override func setUp() {
        super.setUp()
    }

    override func tearDown() {
        super.tearDown()
    }

    // Boolを判定する
    func testHasPrefix() {
        XCTAssertTrue(string.hasPrefix("He"), "stringがHeから始まることを確認します。")
        XCTAssertFalse(string.isEmpty, "stringが空でないことを確認します。")
    }

    // nilを判定する
    func testNumberValidation() {
        XCTAssertNil(notNumber, "notNumberがnilであることを確認します。")
        XCTAssertNotNil(number, "numberがnilでないことを確認します。")
    }

    // 等値性を判定する
    func testEqual() {
        XCTAssertEqual(string, "Hello", "stringがHelloであることを確認します。")
        XCTAssertNotEqual(string, "Goodbye", "stringがGoodbyeでないことを確認します。")
    }

    // Equatableプロトコルの比較を行う
    func testEquatable() {
        XCTAssertNotEqual(dog1, dog2, "それぞれ違うDogオブジェクトであることを確認します。")
    }

    // 数値の比較を行う
    func testCompareNumber() {
        XCTAssertGreaterThan(20, 10, "20が10より大きいことを確認します。")
        XCTAssertGreaterThanOrEqual(334, 334, "334が334以上であることを確認します。")
        XCTAssertLessThan(10, 20, "10が20より小さいことを確認します。")
    }
}

各種Assertionの解説

以下に、上記コードで使用した主なアサーションを説明します。

XCTAssertTrueXCTAssertFalse

  • XCTAssertTrue:条件がtrueかどうかを確認します。例えば、文字列が特定のプレフィックスを持っているかなどを確認できます。
  • XCTAssertFalse:条件がfalseであるかを確認します。

例:

XCTAssertTrue(string.hasPrefix("He"), "stringがHeで始まることを確認します。")
XCTAssertFalse(string.isEmpty, "stringが空でないことを確認します。")

XCTAssertNilXCTAssertNotNil

  • XCTAssertNil:オブジェクトがnilであるかを確認します。
  • XCTAssertNotNil:オブジェクトがnilでないことを確認します。

例:

XCTAssertNil(notNumber, "notNumberがnilであることを確認します。")
XCTAssertNotNil(number, "numberがnilでないことを確認します。")

XCTAssertEqualXCTAssertNotEqual

  • XCTAssertEqual:2つの値が等しいかどうかを確認します。
  • XCTAssertNotEqual:2つの値が等しくないことを確認します。

例 :

XCTAssertEqual(string, "Hello", "stringがHelloであることを確認します。")
XCTAssertNotEqual(string, "Goodbye", "stringがGoodbyeでないことを確認します。")

XCTAssertGreaterThanXCTAssertLessThan

  • XCTAssertGreaterThan:左側の値が右側の値より大きいことを確認します。
  • XCTAssertLessThan:左側の値が右側の値より小さいことを確認します。

例 :

XCTAssertGreaterThan(20, 10, "20が10より大きいことを確認します。")
XCTAssertLessThan(10, 20, "10が20より小さいことを確認します。")

まとめ

XCTestを使用したユニットテストは、アプリの安定性を向上させ、バグを早期に発見するために非常に有効です。今回紹介したアサーションを活用することで、簡単にテストを記述することができます。