お久しぶりの投稿になってしまいました。
今までは
と細々したものにチャレンジしてきたのですがここらで少しSNSのようなものを作成したいなと思い2月はInstagramのようなものを作っておりました。
Firebaseで作成しましたので知見はまた別の機会にシェアします。
今回は!
今回は1月末に行ったゆめみさんのテストの勉強会でテストについてお話を聞き、少し書いてみようと思った次第です。期間が少し空いてしまったが致し方がない。
今回はユニットテストについて。です。
始めていきます
まずはモデルを作成していきます。
簡単で分かりやすいよう「人」をベースにしていきます。
class Person {
var name = ""
var height: Double = 0
var weight: Double = 0
init(_ name: String, _ height: Double, _ weight: Double) {
self.name = name
self.height = height
self.weight = weight
}
func hi() -> String {
return "Hi. I'm \(self.name)."
}
func bmi() -> Double {
//小数2桁目で切り上げ
let val = self.weight / (self.height / 100 * self.height / 100) * 100
return val.rounded() / 100
}
}
上記をテストしていきます。
テスト
Unit Testのファイルがあるのでそこにテスト用のコードを書いていきます。
class MyUnitTestTests: XCTestCase {
// 特に何も書いていない(初めからあった)
override func setUp() {
}
// 特に何も書いていない(初めからあった)
override func tearDown() {
}
func testHi() {
let p = Person("Taro", 160, 50)
let ret = p.hi()
XCTAssertEqual(ret, "Hi. I'm \(p.name).")
}
func testBmi() {
let p = Person("Hanako", 140, 40)
let ret = p.bmi()
XCTAssertEqual(ret, 20.41)
}
}
testHiとtestBmiを追加しました。
ここで使っている「XCTAssertEqual」がわからなかったのですが、雰囲気
「第一引数と第二引数を比較しているのかな」と推測していたのですが、当たっていました。
テストが完了すると
テストが完了すると以下の画像のようにチェックが付きます。
またコンソールにはテスト結果などが表示されます。
2020-03-09 20:54:35.351648+0900 MyUnitTestUITests-Runner[59405:4487750] Running tests...
Test Suite 'All tests' started at 2020-03-09 20:54:35.867
Test Suite 'MyUnitTestUITests.xctest' started at 2020-03-09 20:54:35.870
Test Suite 'MyUnitTestUITests' started at 2020-03-09 20:54:35.870
Test Case '-[MyUnitTestUITests.MyUnitTestUITests testExample]' started.
t = 0.00s Start Test at 2020-03-09 20:54:35.872
t = 0.12s Set Up
t = 0.14s Open com.higuchiryunosuke.MyUnitTest
t = 0.22s Launch com.higuchiryunosuke.MyUnitTest
t = 3.59s Setting up automation session
t = 9.09s Wait for com.higuchiryunosuke.MyUnitTest to idle
t = 11.03s Tear Down
Test Case '-[MyUnitTestUITests.MyUnitTestUITests testExample]' passed (11.241 seconds).
Test Case '-[MyUnitTestUITests.MyUnitTestUITests testLaunchPerformance]' started.
t = 0.00s Start Test at 2020-03-09 20:54:47.113
t = 0.05s Set Up
t = 0.05s Open com.higuchiryunosuke.MyUnitTest
t = 0.11s Launch com.higuchiryunosuke.MyUnitTest
t = 0.12s Terminate com.higuchiryunosuke.MyUnitTest:59408
t = 2.53s Setting up automation session
t = 8.48s Wait for com.higuchiryunosuke.MyUnitTest to idle
t = 11.77s Open com.higuchiryunosuke.MyUnitTest
t = 11.82s Launch com.higuchiryunosuke.MyUnitTest
t = 11.82s Terminate com.higuchiryunosuke.MyUnitTest:59410
t = 14.20s Setting up automation session
t = 19.77s Wait for com.higuchiryunosuke.MyUnitTest to idle
2020-03-09 20:55:08.831473+0900 MyUnitTestUITests-Runner[59405:4488965] [Default] Bad date range to search archive. Start date is (null). Stop date is Mon Mar 9 20:55:09 2020.
t = 21.83s Open com.higuchiryunosuke.MyUnitTest
t = 21.88s Launch com.higuchiryunosuke.MyUnitTest
t = 21.88s Terminate com.higuchiryunosuke.MyUnitTest:59413
t = 24.55s Setting up automation session
t = 30.12s Wait for com.higuchiryunosuke.MyUnitTest to idle
t = 32.11s Open com.higuchiryunosuke.MyUnitTest
t = 32.16s Launch com.higuchiryunosuke.MyUnitTest
t = 32.16s Terminate com.higuchiryunosuke.MyUnitTest:59415
t = 34.74s Setting up automation session
t = 40.02s Wait for com.higuchiryunosuke.MyUnitTest to idle
t = 42.00s Open com.higuchiryunosuke.MyUnitTest
t = 42.05s Launch com.higuchiryunosuke.MyUnitTest
t = 42.05s Terminate com.higuchiryunosuke.MyUnitTest:59418
t = 44.53s Setting up automation session
t = 49.84s Wait for com.higuchiryunosuke.MyUnitTest to idle
t = 51.75s Open com.higuchiryunosuke.MyUnitTest
t = 51.79s Launch com.higuchiryunosuke.MyUnitTest
t = 51.79s Terminate com.higuchiryunosuke.MyUnitTest:59420
t = 54.42s Setting up automation session
t = 59.56s Wait for com.higuchiryunosuke.MyUnitTest to idle
2020-03-09 20:55:48.678550+0900 MyUnitTestUITests-Runner[59405:4487750] [Default] Extractor called processingCompletionBlock but self is nil!
2020-03-09 20:55:48.678945+0900 MyUnitTestUITests-Runner[59405:4487750] [Default] Extractor called processingCompletionBlock but self is nil!
2020-03-09 20:55:48.679297+0900 MyUnitTestUITests-Runner[59405:4487750] [Default] Extractor called processingCompletionBlock but self is nil!
2020-03-09 20:55:48.679649+0900 MyUnitTestUITests-Runner[59405:4487750] [Default] Extractor called processingCompletionBlock but self is nil!
2020-03-09 20:55:48.679993+0900 MyUnitTestUITests-Runner[59405:4487750] [Default] Extractor called processingCompletionBlock but self is nil!
2020-03-09 20:55:48.680518+0900 MyUnitTestUITests-Runner[59405:4487750] [Default] Extractor called processingCompletionBlock but self is nil!
/Users/Ryu/Documents/ios/mySeries/MyUnitTest/MyUnitTestUITests/MyUnitTestUITests.swift:38: Test Case '-[MyUnitTestUITests.MyUnitTestUITests testLaunchPerformance]' measured [OS Signpost Duration (AppLaunch), s] average: 6.655, relative standard deviation: 3.398%, values: [6.769056, 7.035864, 6.563110, 6.388960, 6.519057], performanceMetricID:com.apple.dt.XCTMetric_OSSignpost-AppLaunch.duration, baselineName: "", baselineAverage: , maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.000, maxStandardDeviation: 0.000
t = 61.61s Tear Down
Test Case '-[MyUnitTestUITests.MyUnitTestUITests testLaunchPerformance]' passed (61.813 seconds).
Test Suite 'MyUnitTestUITests' passed at 2020-03-09 20:55:48.927.
Executed 2 tests, with 0 failures (0 unexpected) in 73.054 (73.057) seconds
Test Suite 'MyUnitTestUITests.xctest' passed at 2020-03-09 20:55:48.929.
Executed 2 tests, with 0 failures (0 unexpected) in 73.054 (73.059) seconds
Test Suite 'All tests' passed at 2020-03-09 20:55:48.930.
Executed 2 tests, with 0 failures (0 unexpected) in 73.054 (73.063) seconds
テストが失敗すると?
テストが失敗するとエラーになります。
例えばテストで
XCTAssertEqual(ret, "Hi. I'm \(p.name).")
と書きます。しかし、モデルで
return "Hi. He is \(self.name)."
と書いてしまうと、第一引数と第二引数で「I'm」と「He is」と異なっているのでエラーになります。ちなみにエラーは以下のようになります。
エラーの文言は
XCTAssertEqual failed: ("Hi. He is Taro.") is not equal to ("Hi. I'm Taro.")
「Hi. He is Taro.」と「Hi. I'm Taro.」は同じではないよ。とエラーが出ていますのでその部分を修正すればOKです。
まとめ
やはりテストは難しいイメージがありましたが、簡単なものから書いていくのを心がけることでテストが書きやすいコードを書くようになるかと思います。
テストが書きやすいコード良いコードと言っていたので信じて頑張ります。終わり。