branch10480’s blog

Topics that I've learned.

iOSアプリ開発自動テストの教科書 を読んでいく 〜 24 〜

テスト実行時の成果物を保存する

XCTAttachment によって、文字列、画像、XCUITestでのスクリーンショットなどを成果物として保存できる。

テスト実行時の追加情報(APIレスポンスなど)を保存するとテスト失敗時の調査が捗る。

■ 使用例

import XCTest
import UIKit

class SampleTestCases: XCTestCase {
    func testAttachment() {
        // 'Hello'という文字列を保存する対象として指定
        let attachment = XCTAttachment(string: "Hello!")
        // name プロパティに値をセット(設定は任意)
        // 省略した場合、public.plain-text など自動で命名される
        attachment.name = "実行時のログ"
        add(attachment)

        // デフォルト設定では、失敗したときのみ XCTAttachment は保存される!
        XCTFail()
    }
}

テスト成功時も成果物が保存されるようにするには?

方法は2種類ある。

宣言 用途
XCTAttachment.Lifetime に .keepAlways を設定する 個別の設定
テストのスキーム設定で挙動を変更 全体的な設定

XCTAttachment.LifeType を指定する場合

XCTAttachment.LifeTime(enum)には以下のうちいずれかを設定できる。

種類 説明
.deleteOnSuccess テスト成功時に成果物を破棄(デフォルト設定)
.keepAlways 常に成果物を保存

■ 使用例

import XCTest
import UIKit

class SampleTestCases: XCTestCase {
    func testAttachment() {
        let attachment = XCTAttachment(string: "Hello!")
        attachment.name = "実行時のログ"
        // 常に成果物を保存するように設定を変更
        attachment.lifetime = .keepAlways
        add(attachment)
    }
}

テストのスキーム設定で変更する場合

  1. ⌘ + > でスキームの設定画面を開く
  2. 左側の「Test」を選択
  3. Option タブを選択し、 「Delete when each test succeeds」のチェックを切り替える

注意点!

この設定はデフォルト設定を変更するものであるため、個別で設定されているものがあればそちらが優先される。

import XCTest
import UIKit

class SampleTestCases: XCTestCase {
    func testAttachment() {
        let attachment = XCTAttachment(string: "Hello!")
        attachment.name = "実行時のログ"
        // この設定が優先される
        attachment.lifetime = .keepAlways
        add(attachment)
    }
}

> 次回に続く