Swift,Objective-Cプログラミング ~ iOS ~

Objective-C,Swift,Apple Watchなどのプログラミング

【iOS Swift入門 #246】Xcode7から使えるUITest(XCTest)の使い方サンプル

はじめに

Xcode7からXCTestにUIテストの機能が追加されたので試してみる。

テスト用に作成したアプリがこちら。 f:id:fjswkun:20150823114607p:plain

どんなUIテストする?

UITestで↓の操作を指示する。

テキストフィールドに数字を入力
計算ボタンを押す
ラベルに結果文字列が表示

その結果、

ラベルに表示された文字列がテキストフィールドに
入力した数字の3倍の数字であるかどうか

をテストする。

テストアプリのコード

XcodeでSingle View Applicationでプロジェクト作成し、
ViewController.swiftを下記のようにした。

import UIKit

class ViewController: UIViewController {
    let resultLabel = UILabel(frame: CGRect(x: 60, y: 50, width: 200, height: 60))
    let inputTextField = UITextField(frame: CGRect(x: 60, y: 200, width: 200, height: 60))
    let calculateButton = UIButton(frame: CGRect(x: 130, y: 350, width: 60, height: 40))

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        setupIdentifiers()

        resultLabel.backgroundColor = UIColor.lightGrayColor()
        resultLabel.textAlignment = .Right
        view.addSubview(resultLabel)

        inputTextField.backgroundColor = UIColor.yellowColor()
        inputTextField.textAlignment = .Right
        view.addSubview(inputTextField)

        calculateButton.setTitle("計算", forState: .Normal)
        calculateButton.setTitleColor(UIColor.blueColor(), forState: .Normal)
        view.addSubview(calculateButton)

        // action
        calculateButton.addTarget(self, action: "pressBtn:", forControlEvents: .TouchUpInside)
    }

    /// UIパーツにIDをつける
    private func setupIdentifiers(){
        resultLabel.accessibilityIdentifier = "resultLabel"
        inputTextField.accessibilityIdentifier = "inputTextField"
        calculateButton.accessibilityIdentifier = "calculateButton"
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    /// ボタンタップ処理
    func pressBtn(sender: UIButton){
        resultLabel.text = multiplyByThree(inputTextField.text)
    }

    /// 数字を3倍にして返す
    private func multiplyByThree(numberText:String?) -> String{
        guard numberText != nil, let result = Int(numberText!) else{
            return "計算できませんでした"
        }
        return "\(result * 3)"
    }
}

UITestのコード

デフォルトで追加されているUITestのファイルを下記のように編集。
テスト用のメソッド「testCalculateButton」を追加した。

import XCTest

class SampleUITestUITests: XCTestCase {
    let app = XCUIApplication()

    override func setUp() {
        super.setUp()

        // Put setup code here. This method is called before the invocation of each test method in the class.

        // In UI tests it is usually best to stop immediately when a failure occurs.
        continueAfterFailure = false
        // UI tests must launch the application that they test. Doing this in setup will make sure it happens for each test method.
        XCUIApplication().launch()
    }

    override func tearDown() {
        // Put teardown code here. This method is called after the invocation of each test method in the class.
        super.tearDown()
    }

    func testExample() {
        // Use recording to get started writing UI tests.
        // Use XCTAssert and related functions to verify your tests produce the correct results.
    }

    func testCalculateButton(){
        // テストデータ
        let testData = (input:"3", expect:"9")

        // テストケースの出演者たちを呼び出し
        let inputTextFieldText = app.textFields["inputTextField"]
        let calculateButton = app.buttons["calculateButton"]
        let resultLabel = app.staticTexts["resultLabel"]

        // 1.テキストフィールドをタップし、フォーカスする
        inputTextFieldText.tap()

        // 2.テキストフィールドに入力
        inputTextFieldText.typeText(testData.input)

        // 3.ボタンを押す
        calculateButton.tap()

        // テスト テキストフィールドに入力した数字×3の数字がラベルに表示されること
        XCTAssertEqual(resultLabel.label, testData.expect, "テキストフィールドに入力した数字×3の数字がラベルに表示されること")
    }

}

UIテスト実行

f:id:fjswkun:20150823114728p:plain

おわりに

作成したアプリをコチラにおいてます。

ちなみにUIテストではないほうのテスト自動化の参考書

iOSアプリテスト自動化入門

iOSアプリテスト自動化入門


【参考情報】
iOSアプリ開発未経験の人向け
iOSアプリ開発をはじめたとき最初に買った書籍
【アプリ作成未経験の人向け】
Storyboardを使って画面を作成していく。
手順にしたがって操作していくと、ボタンの作成やWebViewの作成などができる。
アプリって、こんな感じで作るんだというのを体験できる。

Swiftではじめる iPhoneアプリ開発の教科書 【iOS 8&Xcode 6対応】

Swiftではじめる iPhoneアプリ開発の教科書 【iOS 8&Xcode 6対応】


・わかりやすくていい、と聞いた本
立ち読みした感じだと【アプリ作成未経験の人向け】

絶対に挫折しない iPhoneアプリ開発「超」入門【Swift & iOS8.1以降 完全対応】

絶対に挫折しない iPhoneアプリ開発「超」入門【Swift & iOS8.1以降 完全対応】


②を終えたくらいの知識の方向け
・アプリ開発独学中に2冊めに購入した書籍
プログラミング知識はなくても、若干理解するのに時間がかかる程度で、
読み進められるわかりやすさがある。

iPhoneアプリ開発塾

iPhoneアプリ開発塾


③中級者、上級者向け

詳解 Swift

詳解 Swift