Xcodebuild повреждает результат результата теста при перенаправлении вывода в файл

У меня есть Jenkins с плагином Xcode, настроенным для запуска модульных тестов, добавив действие тестовой сборки в настройку параметров Custom xcodebuild. Для получения дополнительной информации о том, как заставить Jenkins запускать модульные тесты вообще с помощью Xcode 5, см. Этот вопрос .

Теперь, когда я его запускаю, кажется, что смешивает консольный вывод из инструкций NSLog или окончательное сообщение ** TEST SUCCEEDED ** с результатами теста, из-за чего время от времени отключается парсер, который преобразует результаты unit test в формат JUnit, необходимый для Jenkins.

Например, журнал 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? Кто-нибудь знает, почему это происходит, и какое-либо обходное решение, которое я мог бы выполнить, чтобы исправить это?

Ответ 1

Благодаря этому 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

Ответ 2

Как отмечено Malte в комментарии выше, более чистым решением может быть

    env NSUnbufferedIO=YES xcodebuild ...