测试时禁用断言

Posted

技术标签:

【中文标题】测试时禁用断言【英文标题】:Disable assertions while testing 【发布时间】:2015-05-06 14:59:36 【问题描述】:

我想测试我的 API 的契约,例如,如果使用nil 的某个参数创建了一个对象,则会引发一个断言,但如果禁用了断言(发布配置),它只会返回 nil。

我的测试方案具有调试的构建配置,因此在我的 API 合同测试中,我检查创建带有一些参数为 nil 的对象是否返回一个 nil 对象。但是构造函数的断言是在XCTAssertNil执行之前提出的,所以我的测试总是失败。

我可以在吗?我尝试将NS_BLOCK_ASSERTIONS 添加到启动时传递的方案参数中,但这不起作用。

【问题讨论】:

您是否尝试过在启动时添加要传递的参数,但也在您的代码中检查它。所以在启动时通过 TESTS=1... 在您的代码中围绕 if 语句中的断言和检查 if(TESTS)... @Jay,谢谢,我没想到,但我宁愿不做这种事情,如果可以通过其他方式更好地实现。 【参考方案1】:

已解决,我添加了一个从 Debug 复制的新配置,名为 Test

然后在构建设置预处理器宏中添加NS_BLOCK_ASSERTIONS=1

最后,更改测试方案中的测试动作。

现在可以了:)

【讨论】:

您还可以覆盖测试的断言宏,例如,让它们抛出异常,然后测试是否引发了异常。 如果您遇到问题:无法加载文件列表的内容:'Test-input-files.xcfilelist' 我们开始:***.com/questions/55505991/…【参考方案2】:

我在对 Swift 包进行单元测试时遇到了这个问题,但上面的答案对我不起作用。

首先,我利用以下方法在 Xcode 中运行的单元测试中成功处理断言:

var isUnitTest: Bool 
    ProcessInfo.processInfo.environment["XCTestConfigurationFilePath"] != nil

assert(isUnitTest, "Only called when `isUnitTest == false`")

现在,我的问题是,当我从命令行运行单元测试时,XCTestConfigurationFilePath 将是 nil,而我的断言仍然会触发。

对此的快速解决方法是修改我的命令行测试以构建 release

swift test -c release

现在,无论我在哪里运行测试,我都可以使用断言而不调用它们,但这仍然很糟糕,因为它依赖于两个不相关的项目来使事情正常工作。

但是,当您从命令行运行时,您确实会注入一些有用的环境变量。

修改了我之前的 isUnitTest 属性,然后我到达了:

var isUnitTest: Bool 
    ProcessInfo.processInfo.environment["XCTestConfigurationFilePath"] != nil || 
        ProcessInfo.processInfo.environment["TERM_PROGRAM"] != nil

现在,无论环境如何,我都有一个计算属性可以确定是否正在运行单元测试。

您还可以进一步修改断言条件逻辑以满足您的特定需求:

assert(isUnitTest && isBadThing, "The bad thing happened")

【讨论】:

以上是关于测试时禁用断言的主要内容,如果未能解决你的问题,请参考以下文章

Assert断言测试

断言(编程术语)

断言(assert)

什么时候用assert

课后作业-阅读任务-阅读提问-4

Assert.assertEquals是啥含义