12

通过将测试构建操作添加到自定义 xcodebuild 参数设置,我将带有 Xcode 插件的 Jenkins 配置为运行单元测试。有关让 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.

实际上应该是什么时候:

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

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

这可能是由于不直接写入标准输出时缓冲或缺乏缓冲造成的吗?有谁知道为什么会发生这种情况以及我可以执行的任何解决方法来解决它?

4

2 回答 2

13

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

    env NSUnbufferedIO=YES xcodebuild ...
于 2016-03-10T19:35:42.710 回答
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
于 2013-10-04T20:29:31.937 回答