LoginSignup
24
25

More than 5 years have passed since last update.

Swiftの導入としてObjective-Cのクラスの単体テストを書く

Last updated at Posted at 2015-04-14

ある程度の規模になっているObjective-CベースのiOSアプリで、「よっしゃSwift導入や!」ってなっても、
「開発者が馴染んでいない言語を実戦投入したら、コーディングガイドラインもないし、コード品質が下がってしまう」みたいな懸念があると、きっと思います。
でも、やっぱりSwiftは触ってみたいし、少しずつ触っておきたい、みたいなケースはないでしょうか?

なら、簡単な導入として、単体テストだけSwiftで書いてみればいいんじゃない?と思ってやってみたらすごく簡単だったのでその紹介です。

前提

  • Obj-Cで書いているアプリ
  • 単体テストは既にある. (フレームワークはXCTest)

Swiftのテストケースを追加

おもむろに "New File..." から Test Case Classesを選んで、新しいテストクラスを追加します。
LanguageはSwiftにします。

スクリーンショット 2015-04-14 6.41.17 PM.png

ファイルを追加すると、丁寧にBridging-Headerを追加しますか?って言われるので、Yesとして追加しておきます。

スクリーンショット 2015-04-14 6.41.36 PM.png

すると、こんな感じでテストが追加されます。

//
//  MyFirstSwiftTestCase.swift
//

import UIKit
import XCTest

class MyFirstSwiftTestCase: XCTestCase {

    override func setUp() {
        super.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.
        super.tearDown()
    }

    func testExample() {
        // This is an example of a functional test case.
        XCTAssert(true, "Pass")
    }

    func testPerformanceExample() {
        // This is an example of a performance test case.
        self.measureBlock() {
            // Put the code you want to measure the time of here.
        }
    }

}

これを実行すると、このテストも実行されます。
スクリーンショット 2015-04-14 6.55.41 PM2.png

便利ですね。

Obj-Cのクラスをテストする

例えばObj-Cのファイルに以下のようなものがあったとして、それをテストします。

NSString+Split.h
//
//  NSString+Split.h
//

#import <Foundation/Foundation.h>

@interface NSString (Split)
- (NSArray *)split:(NSString *)token;
@end

NSString+Split.m
//
//  NSString+Split.m
//

#import "NSString+Split.h"

@implementation NSString (Split)
- (NSArray *)split:(NSString *)token
{
    return [self componentsSeparatedByString:token];
}
@end
Bridging-Header に追加

MyFirstSwiftTestCase.swiftを作るときに自動で作られたBridging-HeaderにこのObj-Cのヘッダを追加します。

Tests-XCTest-Bridging-Header.h
//
//  Use this file to import your target's public headers that you would like to expose to Swift.
//

#import "NSString+Split.h"
テストコードの修正

MyFirstSwiftTestCase.swiftでNSString+Splitをテストします。
Swiftで書いたテストコードからObj-Cのメソッドを呼び出します。

func testSplit() {
    let split = "hoge/fuga/piyo".split("/") as [String]
    XCTAssertEqual(split.count, 3, "3つに分割されるはず")
    XCTAssertEqual(split[0], "hoge", "最初はhoge")
    XCTAssertEqual(split[1], "fuga", "二つ目はfuga")
    XCTAssertEqual(split[2], "piyo", "三つ目はpiyo")
}

実行すると無事テストできます。
スクリーンショット 2015-04-14 7.10.11 PM.png

もちろん、おかしいテストを実行するとこけます。
スクリーンショット 2015-04-14 7.12.32 PM.png

ということで、まずはSwiftでテストコードを書くところから始めるのはいかがでしょうか?

24
25
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
24
25