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

GBe*_*gen 12 xcode unit-testing pipe xcodebuild xcode5

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

现在我已经运行了,它似乎将NSLog语句的控制台输出或最终** TEST SUCCEEDED **消息与测试结果混合在一起,因此偶尔会将解码器绊倒,将单元测试结果转换为Jenkins所需的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.
Run Code Online (Sandbox Code Playgroud)

什么时候它应该是:

Test Case '-[Redacted_Conversion_Tests testConvertTo_ShouldSetamount_WhenamountIsNotZero]' passed (0.000 seconds).
Test Case '-[Redacted_Conversion_Tests testConvertTo_ShouldSetamount_WhenamountIsZero]' started.
** TEST SUCCEEDED **
Run Code Online (Sandbox Code Playgroud)

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

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

输出总是很好,有序.

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

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
Run Code Online (Sandbox Code Playgroud)

如上所述,输出是无序的.

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

小智 12

正如Malte在上面的评论中指出的那样,更清洁的解决方案可能是

    env NSUnbufferedIO=YES xcodebuild ...
Run Code Online (Sandbox Code Playgroud)


GBe*_*gen 9

由于这个答案,我发现了一种基本上使用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
Run Code Online (Sandbox Code Playgroud)

  • 游戏的后期,但另一种方法是使用`env NSUnbufferedIO = YES xcodebuild ...`.在Yosemite和Xcode 7上测试过. (6认同)