当输出重定向到文件时,xcodebuild会破坏测试结果输出

时间:2013-09-25 02:24:49

标签: xcode unit-testing pipe xcode5 xcodebuild

我让Jenkins使用Xcode插件配置为通过将测试构建操作添加到Custom xcodebuild参数设置来运行单元测试。有关让Jenkins使用Xcode 5运行单元测试的更多信息,请参阅此question

现在我已经运行了,它似乎将NSLog语句或最终** TEST SUCCEEDED **消息的控制台输出与测试结果混合在一起,因此偶尔会将解码器绊倒,将单元测试结果转换为所需的JUnit格式詹金斯。

例如,Jenkins日志显示如下输出:

Test Case '-[Redacted_Conversion_Tests testConvertTo_ShouldSetamount_WhenamountIsNotZero]' passed (** TEST SUCCEEDED **

0.000 seconds).
Test Case '-[Redacted_Conversion_Tests testConvertTo_ShouldSetamount_WhenamountIsZero]' started.

实际应该是:

Test Case '-[Redacted_Conversion_Tests testConvertTo_ShouldSetamount_WhenamountIsNotZero]' passed (0.000 seconds).
Test Case '-[Redacted_Conversion_Tests testConvertTo_ShouldSetamount_WhenamountIsZero]' started.
** TEST SUCCEEDED **

我进一步调查了这一点,并把詹金斯拉出了画面。如果我在命令提示符下直接运行xcodebuild命令:

xcodebuild \
    -workspace project.xcworkspace \
    -scheme Tests \
    -configuration Release \
    -sdk iphonesimulator7.0 \
    -destination "platform=iOS Simulator,name=iPhone Retina (4-inch),OS=latest" \
    test

输出总是很好,有序。

但是,如果我将输出传输到另一个程序或重定向到文件:

xcodebuild \
    -workspace project.xcworkspace \
    -scheme Tests \
    -configuration Release \
    -sdk iphonesimulator7.0 \
    -destination "platform=iOS Simulator,name=iPhone Retina (4-inch),OS=latest" \
    test > xcodebuild.out
cat xcodebuild.out

如上所述,输出无序。

这可能是因为没有直接写入stdout而导致缓冲或缺少缓冲?有谁知道为什么会发生这种情况以及我可以执行哪些解决方法来修复它?

2 个答案:

答案 0 :(得分:11)

如上面评论中的Malte所述,更清晰的解决方案可能是

    env NSUnbufferedIO=YES xcodebuild ...

答案 1 :(得分:9)

感谢这个answer,我发现了一种基本上使用script命令禁用缓冲的方法。

script -q -t 0 xcodebuild.out \
    xcodebuild \
        -workspace project.xcworkspace \
        -scheme Tests \
        -configuration Release \
        -sdk iphonesimulator7.0 \
        -destination "platform=iOS Simulator,name=iPhone Retina (4-inch),OS=latest" \
        test
cat xcodebuild.out