测试时禁用断言
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")
【讨论】:
以上是关于测试时禁用断言的主要内容,如果未能解决你的问题,请参考以下文章