7
8

More than 3 years have passed since last update.

初めてswiftでユニットテストを書いてみた

Posted at

お久しぶりの投稿になってしまいました。

今までは

と細々したものにチャレンジしてきたのですがここらで少し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のファイルがあるのでそこにテスト用のコードを書いていきます。

スクリーンショット 2020-03-09 21.03.49.png

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 21.07.20.png

またコンソールにはテスト結果などが表示されます。

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」と異なっているのでエラーになります。ちなみにエラーは以下のようになります。

スクリーンショット 2020-03-09 21.16.19.png

スクリーンショット 2020-03-09 21.16.26.png

エラーの文言は

XCTAssertEqual failed: ("Hi. He is Taro.") is not equal to ("Hi. I'm Taro.")

「Hi. He is Taro.」と「Hi. I'm Taro.」は同じではないよ。とエラーが出ていますのでその部分を修正すればOKです。

まとめ

やはりテストは難しいイメージがありましたが、簡単なものから書いていくのを心がけることでテストが書きやすいコードを書くようになるかと思います。

テストが書きやすいコード良いコードと言っていたので信じて頑張ります。終わり。

参考

7
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
8