Objective-C是否有任何基于非Xcode的命令行单元测试工具?
邮报说: 要在OSX上编译Objective-C,您必须获得XCode,该代码可以从应用程序存储中免费获得。获得XCODER将确保您获得必要的框架(头),如Foundation、COCOA等。但是,这将不提供必要的命令行工具来从命令行编译ObjtoC。打开XCode,转到首选项>下载>组件并安装命令行工具。这将安装gcc、clang、make等 我正在寻找一个基于非Xcode的工具来解决我的问题,我刚刚打开: 该工具应满足以下要求:Objective-C是否有任何基于非Xcode的命令行单元测试工具?,objective-c,Objective C,邮报说: 要在OSX上编译Objective-C,您必须获得XCode,该代码可以从应用程序存储中免费获得。获得XCODER将确保您获得必要的框架(头),如Foundation、COCOA等。但是,这将不提供必要的命令行工具来从命令行编译ObjtoC。打开XCode,转到首选项>下载>组件并安装命令行工具。这将安装gcc、clang、make等 我正在寻找一个基于非Xcode的工具来解决我的问题,我刚刚打开: 该工具应满足以下要求: 它不应该以任何方式与Xcode相关 下面的简单程度已经足够了
- 它不应该以任何方式与Xcode相关
- 下面的简单程度已经足够了:只需一些
代码,收集附近的所有测试用例文件,并对我要测试的代码运行测试断言(如SetTestingKit中的intmain{}
或GHUnit中的ST-
)GH-
- 我不需要UI、GUI、Xcode和模拟器
- 如果它能同时在Mac和Ubuntu(是的,Travis)上运行,可能使用 就像引用的帖子描述的那样
#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分钟,我自己就发现了。再次感谢。谢谢你的回答。在我看来,您提出的问题与我在这里提出的问题不同:我的目标是找到单元测试工具!,不是