Objective-C是否有任何基于非Xcode的命令行单元测试工具?

Objective-C是否有任何基于非Xcode的命令行单元测试工具?,objective-c,Objective C,邮报说: 要在OSX上编译Objective-C,您必须获得XCode,该代码可以从应用程序存储中免费获得。获得XCODER将确保您获得必要的框架(头),如Foundation、COCOA等。但是,这将不提供必要的命令行工具来从命令行编译ObjtoC。打开XCode,转到首选项>下载>组件并安装命令行工具。这将安装gcc、clang、make等 我正在寻找一个基于非Xcode的工具来解决我的问题,我刚刚打开: 该工具应满足以下要求: 它不应该以任何方式与Xcode相关 下面的简单程度已经足够了

邮报说:

要在OSX上编译Objective-C,您必须获得XCode,该代码可以从应用程序存储中免费获得。获得XCODER将确保您获得必要的框架(头),如Foundation、COCOA等。但是,这将不提供必要的命令行工具来从命令行编译ObjtoC。打开XCode,转到首选项>下载>组件并安装命令行工具。这将安装gcc、clang、make等

我正在寻找一个基于非Xcode的工具来解决我的问题,我刚刚打开:

该工具应满足以下要求:

  • 它不应该以任何方式与Xcode相关
  • 下面的简单程度已经足够了:只需一些
    intmain{}
    代码,收集附近的所有测试用例文件,并对我要测试的代码运行测试断言(如SetTestingKit中的
    ST-
    或GHUnit中的
    GH-
  • 我不需要UI、GUI、Xcode和模拟器
  • 如果它能同时在Mac和Ubuntu(是的,Travis)上运行,可能使用 就像引用的帖子描述的那样
根据接受的答案更新:

根据Malte Tancred在接受的答案中所说的,以下简单的设置似乎足以满足我当前的需要:

三个文件,都在我的项目的tests目录中:

octest.m

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

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

    return 0;
}
运行测试

#!/bin/bash
export DYLD_FRAMEWORK_PATH=/Applications/Xcode.app/Contents/Developer/Library/Frameworks
make
./octest
#!/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 $?
更新以捕获退出代码:

在我提出这个问题几天后,特拉维斯宣布了Objective-C支持:

尽管他们建议使用默认脚本进行构建,但我决定采用这里描述的方法,仍然使用octest,而不是Travis使用的xcodebuild方法

默认情况下,travis安装程序依赖于Justin Spahr Summers编写的构建脚本:

他们使用awk从xcodebuild的输出中捕获退出代码,因为它总是存在0个退出代码,即使整个测试套件都失败了

OCTest的行为方式相同-它总是以0代码存在,下面是我如何使用Travisawk脚本的简化版本,以满足我按照上面描述的方式构建它的需要:

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
./octest
#!/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 $?

对于非Mac平台,有objcunit的端口。您可以在午夜查看与GNUstep一起工作的bsd。这些补丁也适用于其他环境。pkg descr有软件包网站,Makefile有下载URL。

对于编译objective-C,我知道一种快速而肮脏(但有点有限)的方法——我在上在线完成。这就是说,这个编译器抛出了很多c-99错误,我认为这是因为它是c的一个严格超集,不包括该语言的一些更独特的功能(例如:@synthesis,甚至点表示法),但它完成了任务。我用记事本++输入代码。就像我说的,有限的,但是外科手术。

*此外-它支持命令行样式的输入,这是可靠的。

主要问题的答案是肯定的: Objective-C有一些命令行测试工具 这不依赖于Xcode

比如说,, 您可以在不使用Xcode的情况下使用OCUnit/SenTestingKit。 你所要做的就是 是将编译器/链接器指向框架。 考虑FLLWEN文件,<代码> Octh.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
现在运行它

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
这个例子确实依赖于Xcode 因为它使用捆绑的SenTestingKit框架 但是构建和运行测试的一般过程 如上所述 不依赖于Xcode

现在,, 要让它在linux系统上运行 您必须安装SenTestingKit(很可能是GNUstep), 但有了这些组件 构建和测试过程应该基本相同。

看看facebook,它取代了苹果的
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. 

但需要注意的是,它不支持构建目标。您可以使用一个方案。

在Github上也可以看到::“我正在试验一个新版本的Objective-C单元测试框架,这是我在2001/2002年与我的朋友兼同事Peter Lindberg一起写的。Objective-C单元是jUnit到Objective-C的一个改编(几乎是直接翻译)。”非常感谢您的回答。我不知道“SenSelfTestMain()”。您能否扩展您的回答,告诉我如何使用您的示例“收集附近的所有测试用例.m文件,就像Xcode在测试目标中所做的那样”(例如:如果MyTest在单独的MyTest.m文件中,而不是在同一个octest.m文件中,该怎么办?)。对不起,如果我问一些非常简单的问题-我是以“从上到下”的方式学习C/Objective-C的人,从Xcode级别到底层。啊,最简单的方法是在main()函数上方添加#import“MyTest.m”,对吗?我只是让它这样工作。当使用自动测试发现时,您不必导入任何头文件。只要确保将测试用例链接到可执行文件中,或者在运行时动态加载它们,
SenSelfTestMain()
就会找到测试。这就是Xcode中发生的事情;它运行
otest
可执行文件,然后加载包含测试用例的测试包。多么有用的知识啊!在我读到你的评论之前10到15分钟,我自己就发现了。再次感谢。谢谢你的回答。在我看来,您提出的问题与我在这里提出的问题不同:我的目标是找到单元测试工具!,不是