12

カスタムの xcodebuild 引数設定にテスト ビルド アクションを追加することで、単体テストを実行するように Xcode プラグインを構成した Jenkins があります。Xcode 5 で Jenkins に単体テストを実行させる方法の詳細については、この質問を参照してください。

実行したところ、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

上記のように、出力は順不同です。

これは、stdout に直接書き込んでいない場合のバッファリングまたはバッファリングの欠如が原因でしょうか? これがなぜ起こっているのか、そしてそれを修正するために私が実行できる可能性のある回避策を誰かが知っていますか?

4

2 に答える 2

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 に答える