【问题标题】:How do I use XCTests to test for print statements?如何使用 XCTests 测试打印语句?
【发布时间】:2025-12-13 08:55:02
【问题描述】:

我正在尝试测试一个函数是否打印出一些东西。如何使用 XCTests 做到这一点?如果这是可能的,是否有实际理由这样做而不是这样做?

谢谢!

【问题讨论】:

  • 你的意思是打印到控制台还是函数的返回结果?
  • @AlexBailey 到控制台!
  • 为什么要进行这样的测试?测试的目的是什么?你有你的理由,我正在努力了解背后的原因。

标签: ios swift unit-testing tdd xctest


【解决方案1】:

@Mike Taverne 是对的。如果您确实想针对打印语句进行实际测试,您可以像这样扩展打印功能:

var printWasWrittenTo: Bool = false

public func print(_ items: Any..., separator: String = " ", terminator: String = "\n") {
    var output: String = items.map { "\($0)" }.joined(separator: separator)

    printWasWrittenTo = true //test against this variable being changed

    Swift.print(output, terminator: terminator)
}

【讨论】:

  • 我明白了。好吧,那我就不用打印语句来测试了!谢谢!
【解决方案2】:

我不知道测试print 语句的方法,但我认为这并不重要。 print 语句的输出与您的应用程序实际执行的操作无关。您应该测试您的应用更改了哪些数据、向用户显示了什么等。

【讨论】:

  • 嗯,这很公平。我想这样做,以便我可以跟踪功能何时被触发或执行某些操作。如果我可以测试打印语句,它会更容易。你知道一种方法来测试一个函数是否由 XCTests 触发吗?
  • XCTest 类似于其他语言的单元测试框架。单元测试包括测试功能。你调用你的函数,看看它是否达到了你的预期。您可能想了解如何编写单元测试,因为听起来您可能不确定如何执行此操作。祝你好运!
  • 感谢@Mike Taverne 的建议!会的!
  • 这对于 GUI 应用程序可能是正确的 (-ish),但还有其他类型的程序。如果 OP 正在编写命令行程序,print 很可能是向用户显示所有内容的方式。即使是 GUI 应用程序也可能需要将某些数据写入标准输出。
  • 正如@Caleb 指出的那样,应用程序可能使用打印功能是有充分理由的——例如 CLI 工具。所以,问题仍然存在:如何在 Swift 中使用 XCTest 捕获 print 的输出(以及到 stdout/stderr 的其他输出)?