10
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

UIButtonのUnitTestを書く

Posted at

iOSアプリで、UIButtonが期待通りの挙動になっているかを確認するテストの書き方です。

実装

中央にボタンが配置された、簡単なViewControllerがあるとします。

スクリーンショット 2018-05-23 11.45.12.png
// ViewController.swift

import UIKit

class ViewController: UIViewController {

    let button = UIButton(type: .custom)
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        view.backgroundColor = .white
        
        view.addSubview(button)
        
        button.setTitle("タップしてください", for: .normal)
        button.setTitleColor(.blue, for: .normal)
        button.addTarget(self, action: #selector(buttonTouched), for: .touchUpInside)
        
        // UIButtonを画面の中央に貼る
        button.translatesAutoresizingMaskIntoConstraints = false
        NSLayoutConstraint.activate([
            button.widthAnchor.constraint(equalToConstant: 240),
            button.heightAnchor.constraint(equalToConstant: 60),
            button.centerXAnchor.constraint(equalTo: view.centerXAnchor),
            button.centerYAnchor.constraint(equalTo: view.centerYAnchor)
            ])
    }
    
    @objc func buttonTouched() {
        button.setTitle("タップされました!", for: .normal)
    }
}

ボタンをタップすると、タイトルが「タップされました!」に変化します。
このUIButtonのふるまいについて、テストを書いていきます。

テストコード

準備

UnitTest Bundleに ViewControllerTests.swift というファイルを追加して、ここにテストを追加していきます。

まず、@testable import ButtonTestSample を宣言します。
これにより UnitTest から実装のコードを参照できるようになり、上記で準備して ViewController にアクセスできるようになります。

// ViewControllerTests.swift

import XCTest
@testable import ButtonTestSample

class ViewControllerTests: XCTestCase { ... }

UIButtonが表示されていることを確認するテスト

インスタンスが生成されていること、addSubviewされていることを確認します。

class ViewControllerTests: XCTestCase {

    func test_ボタンが表示されること() {
        let vc = ViewController()
        
        XCTAssertNotNil(vc.button)
        XCTAssertTrue(vc.view.subviews.contains(vc.button))
    }
}

UIButtonのタイトルを確認するテスト

タイトルが「タップしてください」になっていることを確認します。

class ViewControllerTests: XCTestCase {
    // ...

    func test_ボタンのタイトルが期待通りであること() {
        let vc = ViewController()
        
        // ボタンのタイトルの設定はviewDidLoadで行なっています
        // テストでは何も記述がなければ画面が表示されないため、ここでは明示的に呼び出します
        vc.viewDidLoad()
        
        XCTAssertEqual(vc.button.title(for: .normal), "タップしてください")
    }
}

テスト名は test から始まっていれば自由に名付けられます。
最近は意味が分かりやすいよう、テスト名を日本語にしています。

タップした際の挙動のテスト

ボタンをタップするとタイトルが変更されることを確認します。

class ViewControllerTests: XCTestCase {
    // ...
    
    func test_ボタンをタップするとタイトルが変更されること() {
        let vc = ViewController()
        vc.viewDidLoad()
        
        vc.button.sendActions(for: .touchUpInside)
        
        XCTAssertEqual(vc.button.title(for: .normal), "タップされました!")
    }
}

ボタンタップのイベントを発生させるのには、sendActions(for:)メソッドを使います。
引数に発生させたいイベント(.touchUpInside.valueChangedなど)を指定します。

まとめ

UIButton をテストするユニットテストの書き方をいくつか紹介しました。

サンプルコードはこちらに貼っておきます。

関連

10
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
10
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?