如何在Swift Playground中调用XCTest?

20

我在查看Bendyworks关于使用Swift进行单元测试的文章:http://bendyworks.com/unit-testing-in-swift/

正如您使用Swift一样,我将代码放入Playground中并进行了尝试。

import Cocoa

class Firewood {
    var charred: Bool
    init()  {
        println("initializing our firewood")
        charred = false
    }
    func burn() {
        charred = true
    }
}

import XCTest
class SimpleFirewoodTests: XCTestCase {
    func testBurningActuallyChars() {
        let firewood = Firewood()
        firewood.burn()
        assert(firewood.charred, "should be charred after burning")
    }
}

但是当然你也不能按下测试按钮,Playground是一个连续的REPL,所以你需要知道如何调用测试,有人知道XCTest的内部是什么,知道要调用什么来运行测试吗?


3
只需制定一个项目计划... 游乐场并不适合所有事情。 - Bryan Chen
2
没有单元测试意味着游乐场不能用于测试驱动开发,这将是一大问题。我个人期待在游乐场中编写测试。 - Christopher Swasey
4个回答

34

以下是 Swift 3+ 版本的完整示例,展示了如何实现此操作。这样很好,因为现在您可以使用 XCTAssert,一旦解决了一些问题,它们就可以轻松地直接移动到您的真正测试包中。 import XCTest

class MyTestCase: XCTestCase {

   func testExample() {
       print("Test1")
       XCTAssertTrue(true)
   }

   func testAnother() {
       print("Test2")
       XCTAssertFalse(false)
   }
}

MyTestCase.defaultTestSuite().run() // Swift 3
MyTestCase.defaultTestSuite.run() // Swift 4

这是它的外观:

enter image description here

不幸的是,您必须打开日志窗口才能查看测试是否通过。如果您可以看到测试结果的颜色将会更好...


1
谢谢!从Swift 4开始,defaultTestSuite是一个属性,不需要在后面加括号。 - Paul Cantrell

13

1
我查看了你的代码库并确认它运行良好!但是,如果我创建一个新的playground并手动导入你的样板代码,我会得到以下错误:Playground执行失败:/var/folders/r1/n32p3rzd07l50rnj6vjny6zd06mc_r/T/./lldb/516/playground63.swift:1:8: error: cannot load underlying module for 'XCTest' - 我是否遗漏了什么,或者与playground初始化有关的特殊操作? - flochtililoch
4
我已经找到了原因:在使用这种导入 XCTest 的方法时,我可能错过了一些东西。看起来这种方法只适用于 Mac OS X Playground,而不能用于 iOS。在 iOS Playground 中无法导入 XCTest(如果有人能弄清楚为什么,那就太棒了)。 - Stuart Sharpe

5

雷达文件:rdar://24684347 Swift Playgrounds:“import XCTest”会出现“无法加载‘XCTest’的底层模块”的错误。 - Jeremy W. Sherman
从Xcode 8,Swift 3.0.1开始,@Stuart Sharpe的答案在iOS playground中可以使用。 - leanne

5

现在在playground中运行测试可以通过在测试类的defaultTestSuite上调用run()来实现:

let testSuite = SimpleFirewoodTests.defaultTestSuite()
testSuite.run()

注意:你测试中的assert应该替换为XCTAssert。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接