XCTest
概要
XCTest は、Xcode プロジェクトにおいて、ユニットテストを記述するための Framework。テストメソッドを書くことでテストを追加することができる。テストメソッドはテストケース毎に、XCTestCase のサブクラス内にグルーピングすることができる。
以下の手順でテストを追加する。
XCTestCase のサブクラスを作成する
テストケース毎に1つないし複数のテストメソッドを複数追加する
テストメソッド毎に1つないし複数のテストアサーションを追加する
code:swift
class HogeTests: XCTestCase {
func testFuga() {
let foo = Foo()
XCAssertEqual(foo.isValid, true, "Foo is valid.")
}
}
テストケース及びテストメソッドは、Xcode の Test Navigator 及び Integration Report 内で、テストをグルーピング及び識別するために利用される。適した命名を付与しておくことで、これらのテストサマリーをより見やすくすることができる。テスト失敗時には何が失敗したのか一目でわかるよう、テストメソッドは何をテストしているのかわかる具体的な名前にしておくことが望ましい。
テストアサーションには XCTAssert ファミリーの関数を利用できる。
XCTest - Apple
Defining Test Cases and Test Methods - Apple
命名規則
XCTest は Quick のように条件毎にテストを構造化して記述する API は提供されていない。XCTContext でステップを記述することはできるけど、これはあくまで長いテストの中の 1 ステップを記述するための機能であって、例えばテストへの入力値別にケースを分割するのに用いるのは適当ではない。
XCTest は、TestCase と Test Method というシンプルな 2 段階の構造しか取ることができない。そのため、例えばとあるメソッドを複数の条件でテストしたい場合は、何か命名を工夫してやる必要がある。
「テスト対象」「条件(入力)」「期待する結果(出力)」を記述するのが一番わかりやすく、Quick の出力もこれらを _ で区切るような形式になっているので、そのような形式が良さそうに思う。日本人なら日本語で書くのがわかりやすい。
https://www.keepitswift.com/test-naming-convention/
https://qualitycoding.org/unit-test-naming/
少なくともテストを構造的に記述したいのだけがモチベーションである場合、Quick の導入は大仰な気がする。context のblock で記述するのと Test Method でフラットに書くのとで、対して記述しやすさにも読みやすさにも違いはないように思える。block で記述していると IDE の機能で折り畳みができるが、これが活用できたことはあまりない。入れ子が多いと逆に context 形式の方が見づらくなるし、どちらの場合でも結局テストが長大になると見づらいのはあまり変わらない気がする。
大人数で開発していてある程度書き方を統一したい!といったモチベーションなんかがある場合には役に立つかもしれない。