3

投稿Compiling Objective-C without GUIは次のように述べています。

OSX で Objective-C を簡単にコンパイルするには、アプリケーション ストアから無料で入手できる XCode を入手する必要があります。XCode を取得すると、Foundation、Cocoa などの必要なフレームワーク (ヘッダー) を確実に取得できます。ただし、コマンド ラインから Object-C をコンパイルするために必要なコマンド ライン ツールは提供されません。XCode を開き、[設定] > [ダウンロード] > [コンポーネント] に移動して、コマンド ライン ツールをインストールします。これにより、gcc、clang、make などがインストールされます。

この私の質問に対処するための非 Xcode ベースのツールを探しています。開いたばかりです: Travis でテストする目的の C プロジェクトを作成することは可能ですか?

このツールは、次の要件を満たす必要があります。

  • Xcode とは一切関係ありません。
  • 次のレベルの単純さで十分です。int main {}近くにあるすべてのテスト ケース ファイルを収集し、テストしたいコードでテスト アサーションを実行するコード ( ST-SetTestingKit やGH-GHUnit など) だけで十分です。
  • UI、GUI、Xcode、シミュレーターは必要ありません。
  • Mac と Ubuntu (そう、Travis) の両方で動作し、おそらく引用された投稿で説明されているようにGNUstepを使用できれば 素晴らしいことです。

受け入れられた回答に基づく更新:

受け入れられた回答で Malte Tancred が言ったことに基づいた次の簡単なセットアップは、私の現在のニーズには十分に思えます。

私のプロジェクトの tests ディレクトリにある 3 つのファイル:

octest.m

#import <Foundation/Foundation.h>
#import <SenTestingKit/SenTestingKit.h>

int main() {
    @autoreleasepool {
        SenSelfTestMain();
    }

    return 0;
}

メイクファイル

CC=clang # or gcc

# Trick to get current dir: https://stackoverflow.com/questions/322936/common-gnu-makefile-directory-path
TESTS_DIR:= $(dir $(lastword $(MAKEFILE_LIST)))
PROJECT_DIR:= $(TESTS_DIR)/..

FRAMEWORKS_PATH:= -F/Applications/Xcode.app/Contents/Developer/Library/Frameworks
FRAMEWORKS:= -framework Foundation -framework SenTestingKit
LIBRARIES:= -lobjc
INCLUDE_PATHS:= -I$(PROJECT_DIR)/Projectfiles\
                -I$(TESTS_DIR)/TestHelpers

SOURCE_FILES = $(wildcard $(PROJECT_DIR)/Projectfiles/*.m)

SOURCE_TEST_SUITE = $(wildcard $(TESTS_DIR)/Tests/*.m)

SOURCE_TESTS = $(TESTS_DIR)/TestHelpers/TestHelpers.m\
                 octest.m


CFLAGS=-Wall -Werror -fobjc-arc -g -v $(SOURCE_FILES) $(SOURCE_TEST_SUITE) $(SOURCE_TESTS)
LDFLAGS=$(LIBRARIES) $(FRAMEWORKS)
OUT=-o octest

all:
    $(CC) $(FRAMEWORKS_PATH) $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(OUT)

ランテスト

#!/bin/bash
export DYLD_FRAMEWORK_PATH=/Applications/Xcode.app/Contents/Developer/Library/Frameworks
make
./octest

終了コードを取得するための更新:

この質問をしてから数日後、Travis は Objective-C のサポートを発表しました。

http://about.travis-ci.org/blog/introducing-mac-ios-rubymotion-testing/

ビルドの作成に使用するように提案されているデフォルトのスクリプトがありますが、ここで説明するアプローチを採用し、Travis が使用する xcodebuild のアプローチではなく octest を使用することにしました。

デフォルトでは、travis のセットアップは Justin Spahr-Summers によって書かれたビルド スクリプトに依存しています: https://github.com/jspahrsummers/objc-build-scripts :

彼らはawkを使用して、xcodebuild の出力から終了コードをキャプチャします。これは、テスト スイート全体が失敗した場合でも、終了コードが常に 0 で存在するためです。

OCTest は同じように動作します。常に 0 コードで存在します。上記の方法でビルドする必要がある場合に、 Travis awkスクリプトの簡略化されたバージョンを使用した方法を次に示します。

octest.awk

# Exit statuses:
#
# 0 - No errors found.
# 1 - Build or test failure. Errors will be logged automatically.

BEGIN {
    status = 0;
}

{
    print;
    fflush(stdout);
}

/[0-9]+: (error|warning):/ {
    errors = errors $0 "\n";
}

/with [1-9]+ failures?/ {
    status = 1;
}

END {
    if (length(errors) > 0) {
        print "\n*** All errors:\n" errors;
    }

    fflush(stdout);
    exit status;
}

ランテスト

#!/bin/bash

export DYLD_FRAMEWORK_PATH=/Applications/Xcode.app/Contents/Developer/Library/Frameworks

make

runtests ()
{
  ./octest 2>&1 | awk -f "octest.awk"

  local awkstatus=$?

  if [ "$awkstatus" -eq "1" ]
  then
    echo "Test suite failed"
    return $awkstatus
  else
    echo "Test suite passed"
    return 0
  fi
}

echo "*** Building..."

runtests || exit $?
4

4 に答える 4

2

非 Mac プラットフォーム用の objcunit のポートがあります。GNUstep で動作する MidnightBSDのポートを確認できます。パッチは他の環境でも機能するはずです。pkg-descr にはパッケージの Web サイトがあり、Makefile にはダウンロード URL があります。

于 2013-03-30T02:54:03.183 に答える
1

主な質問への答えはイエスです。Xcode に依存しない Objective-C 用のコマンド ライン テスト ツールがあります。

たとえば、Xcode を使用せずに OCUnit/SenTestingKit を使用できます。必要なのは、コンパイラ/リンカーをフレームワークに向けることだけです。次のファイルを検討してくださいoctest.m

#import <Foundation/Foundation.h>
#import <SenTestingKit/SenTestingKit.h>

int main() {
  @autoreleasepool {
    SenSelfTestMain();
  }
  return 0;
}

@interface MyTest : SenTestCase
@end

@implementation MyTest
- (void)testSomething {
  STAssertEquals(1, 2, @"fail");
}
@end

それをコンパイルします。

clang -o octest octest.m -F/Applications/Xcode.app/Contents/Developer/Library/Frameworks -framework Foundation -framework SenTestingKit

今すぐ実行してください

DYLD_FRAMEWORK_PATH=/Applications/Xcode.app/Contents/Developer/Library/Frameworks ./octest

そして、あなたは次のようなものを見るべきです

Test Suite '/tmp/octest(Tests)' started at 2013-04-04 12:34:49 +0000
Test Suite 'MyTest' started at 2013-04-04 12:34:49 +0000
Test Case '-[MyTest testSomething]' started.
octest.m:16: error: -[MyTest testSomething] : '1' should be equal to '2': fail
Test Case '-[MyTest testSomething]' failed (0.000 seconds).
Test Suite 'MyTest' finished at 2013-04-04 12:34:49 +0000.
Executed 1 test, with 1 failure (0 unexpected) in 0.000 (0.000) seconds
Test Suite '/tmp/octest(Tests)' finished at 2013-04-04 12:34:49 +0000.
Executed 1 test, with 1 failure (0 unexpected) in 0.000 (0.001) seconds
make: *** [default] Error 1

この例は、バンドルされている SenTestingKit フレームワークを使用するという点で Xcode に依存していますが、上記のテストをビルドして実行する一般的なプロセスは Xcode に依存していません。

これを Linux システムで実行するには、SenTestingKit (およびおそらく GNUstep) をインストールする必要がありますが、これらのコンポーネントを配置すると、ビルドとテストのプロセスは本質的に同じになります。

于 2013-04-04T13:32:16.293 に答える
0

Apple の に代わる facebookのxctoolを見てくださいxcodebuild。私たちはMavenを使用してObjective-Cライブラリを構築し、代わりにテストにのみ使用し、xcodebuildうまく機能します. 出力は、 に比べてはるかに読みやすくなっていxcodebuildます。

xctoolページから、

xctool is a replacement for Apple's xcodebuild that makes it easier to build 
and test iOS and Mac products. 

ただし、ビルド ターゲットをサポートしていないことに注意してください。ただし、スキームを使用できます。

于 2016-02-06T23:17:05.723 に答える