XCTestを使ってテストを階層化する
2022-06-28
はじめに
皆さん Swift のテスト書いていますか?私は書いています(書けるところは)。時々 Ruby(Rspec)のテストコードが目に入るときがあるのですが、describe
などを使って、テストケースを階層化しているのを見かけます(たまたま目に入る機会が多いだけで階層化が Ruby のデファクトスタンダードなのかはおいといて)。
業務では、Android をメインに時々 iOS をやっているので、Swift の XCTest だけでできるのか気になりました。そこで色々調べてみました。
XCTContext.runActivity を使う
XCTContext.runActivityを使うことでテストを階層化することができます。ただしこれは Ruby(Rspec)で言うdescribe
に該当するかは別ですが…
今回試したソースコードはGitHubにもアップしています。クローンして手元でswift test
で動きます。
テスト対象のクラスです。
import Foundation
public struct Tructuralization {
let a: Int
let b: Int
public init(a: Int, b: Int) {
self.a = a
self.b = b
}
public func add() -> Int {
return a + b
}
public func subtract() -> Int {
return a - b
}
}
Tructuralization を階層化してテストを書いたテストです。
import XCTest
@testable import Tructuralization
final class TructuralizationTests: XCTestCase {
let tructuralization1 = Tructuralization(a: 1, b: 2)
let tructuralization2 = Tructuralization(a: 10, b: 20)
override func setUp() {
// Put setup code here. This method is called before the invocation of each test method in the class.
}
override func tearDown() {
// Put teardown code here. This method is called after the invocation of each test method in the class.
}
func testPractice() {
XCTContext.runActivity(named: "足し算のテスト") { _ in
XCTAssertEqual(tructuralization1.add(), 3)
XCTAssertEqual(tructuralization2.add(), 30)
}
XCTContext.runActivity(named: "引き算のテスト") { _ in
XCTAssertEqual(tructuralization1.subtract(), -1)
XCTAssertEqual(tructuralization2.subtract(), -10)
}
}
}
階層化するメリットはテスト対象のメソッドが nil を許容する場合に、nil を入れた場合と入れない場合を同一の階層に記述することで、見やすくなるメリットがあるのかなと思いました。
最後に
Rspec では他にもcontext
などもあるのでそれに該当するのは XCTest にあるのか少し気になりました。そういったことをしたい場合は、Quick などを使うことが多いんですかね?
今回、iOS アプリ開発自動テストの教科書を参考にさせていただいたのですが、今まで辞書的な使い方をしていたので一度、最初から最後まで読んでみようと思いました。
また時間があったら、Android(Java、Kotlin)の場合ではどうなるか調べたいなとも思いました。