ある程度の規模になっているObjective-CベースのiOSアプリで、「よっしゃSwift導入や!」ってなっても、
「開発者が馴染んでいない言語を実戦投入したら、コーディングガイドラインもないし、コード品質が下がってしまう」みたいな懸念があると、きっと思います。
でも、やっぱりSwiftは触ってみたいし、少しずつ触っておきたい、みたいなケースはないでしょうか?
なら、簡単な導入として、単体テストだけSwiftで書いてみればいいんじゃない?と思ってやってみたらすごく簡単だったのでその紹介です。
前提
- Obj-Cで書いているアプリ
- 単体テストは既にある. (フレームワークはXCTest)
Swiftのテストケースを追加
おもむろに "New File..." から Test Case Classesを選んで、新しいテストクラスを追加します。
LanguageはSwiftにします。
ファイルを追加すると、丁寧にBridging-Headerを追加しますか?って言われるので、Yesとして追加しておきます。
すると、こんな感じでテストが追加されます。
//
// 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.
}
}
}
便利ですね。
Obj-Cのクラスをテストする
例えばObj-Cのファイルに以下のようなものがあったとして、それをテストします。
//
// NSString+Split.h
//
#import <Foundation/Foundation.h>
@interface NSString (Split)
- (NSArray *)split:(NSString *)token;
@end
//
// 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のヘッダを追加します。
//
// 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")
}
ということで、まずはSwiftでテストコードを書くところから始めるのはいかがでしょうか?