是否可以在iOS应用程序中运行XCTest测试?

时间:2017-05-01 06:27:12

标签: ios testing xctest

我们有一个用XCTest编写的后端测试套件。该套件在Xcode中运行良好,但由于各种原因,如果我们也可以在iOS应用程序中运行该套件,那将对我们很好。那可能吗?我不介意为它编写一些粘合代码,但因为它甚至无法在非测试目标中导入XCTest框架:

SomeController.swift:2:8: Cannot load underlying module for 'XCTest'

1 个答案:

答案 0 :(得分:9)

有可能!关键是获取XCTest框架链接的副本,然后使用公共XCTest API来运行测试。这将为您提供在通过Xcode运行测试时看到的相同控制台输出。 (使用公共API连接自己的自定义记者看起来可行,但是询问如何这样做本身就会产生一个好问题 - 没有多少人使用XCTest API,因为Xcode为我们做了肮脏的工作。)

复制XCTest.framework

您可以从目标平台的平台框架将XCTest.framework包复制到您的项目中,而不是解开任何破坏模块加载的内容:

mkdir Frameworks && mkdir Frameworks/iphonesimulator
PLATFORMS=/Applications/Xcode.app/Contents/Developer/Platforms
FRAMEWORKS=Developer/Library/Frameworks
cp -Rp \
    "$PLATFORMS/iPhoneSimulator.platform/$FRAMEWORKS/XCTest.framework" \
    Frameworks/iphonesimulator/

链接自己的XCTest

然后,弹出打开主应用目标的目标编辑器,然后将您的副本从Finder拖放到"链接的框架和库的列表中。

将您的测试构建到主应用目标

现在,转到测试文件,弹出文件检查器,然后勾选主应用程序目标旁边的框以获取这些文件。现在,您将构建测试文件作为主应用程序的一部分,将所有XCTestCase子类放入二进制文件中。

运行那些测试

最后,将按钮连接到"运行测试"这样的行动:

import UIKit
import XCTest

class ViewController: UIViewController {
    @IBAction func runTestsAction() {
        print("running tests!")
        let suite = XCTestSuite.default()
        for test in suite.tests {
            test.run()
        }
    }
}

点击按钮后,您将在控制台中看到此内容:

running tests!
Test Suite 'RunTestsInApp.app' started at 2017-05-15 11:42:57.823
Test Suite 'RunTestsInAppTests' started at 2017-05-15 11:42:57.825
Test Case '-[RunTestsInApp.RunTestsInAppTests testExample]' started.
2017-05-15 11:42:57.825 RunTestsInApp[2956:8530580] testExample()
Test Case '-[RunTestsInApp.RunTestsInAppTests testExample]' passed (0.001 seconds).
Test Case '-[RunTestsInApp.RunTestsInAppTests testPerformanceExample]' started.
/Users/jeremy/Workpad/RunTestsInApp/RunTestsInAppTests/RunTestsInAppTests.swift:34: Test Case '-[RunTestsInApp.RunTestsInAppTests testPerformanceExample]' measured [Time, seconds] average: 0.000, relative standard deviation: 122.966%, values: [0.000002, 0.000001, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000], performanceMetricID:com.apple.XCTPerformanceMetric_WallClockTime, baselineName: "", baselineAverage: , maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.100, maxStandardDeviation: 0.100
Test Case '-[RunTestsInApp.RunTestsInAppTests testPerformanceExample]' passed (0.255 seconds).
Test Suite 'RunTestsInAppTests' passed at 2017-05-15 11:42:58.081.
     Executed 2 tests, with 0 failures (0 unexpected) in 0.256 (0.257) seconds
Test Suite 'RunTestsInApp.app' passed at 2017-05-15 11:42:58.081.
     Executed 2 tests, with 0 failures (0 unexpected) in 0.256 (0.258) seconds