GRUnit是一个面向iOS和MacOS的测试框架,以测试(应用程序)目标的形式在您的项目中运行。它旨在与XCTest非常相似,并支持带有超时的时间测试。默认情况下,它旨在在测试失败时抛出异常,因此您可以使用异常断点,并在Xcode中在失败点进行调试。
使用GRUnit的项目
这个宝石使得设置测试应用程序目标变得容易。
$ gem install grunit
这将对您的ProjectName.xcodeproj文件进行编辑并创建一个测试目标、方案和样本测试文件。您可以多次运行此命令,它不会重复任何文件、目标或方案。
$ grunit install -n ProjectName
设置您的Podfile以包括GRUnit以供您刚才创建的测试目标使用。
# Podfile
platform :ios, '7.0'
target :Tests do
pod 'GRUnit', '~> 1.0.1'
end
安装您的项目pods。CocoaPods将在您的项目下载和配置所需的库
$ pod install
注意:如果您项目中没有测试目标,您将收到错误:“[!] 无法找到名为 Tests 的目标”。如果您的测试目标名称不同,例如“ProjectTests”,则Podfile目标行应如下所示:target :ProjectTests do
。
您应该使用.xcworkspace
文件来处理您的项目
$ open ProjectName.xcworkspace
要在您的测试目标中生成名为SampleTest的测试
$ grunit add -n ProjectName -f SampleTest
或者阅读以下GRTestCase
示例。
如果您想将主目标中的所有文件链接到项目文件中的测试目标,请运行此同步命令。
$ grunit sync -n ProjectName
#import <GRUnit/GRUnit.h>
@interface MyTest : GRTestCase
@end
@implementation MyTest
- (void)test {
GRAssertEquals(1U, 1U);
GRAssertEqualStrings(@"a string", @"a string");
GRAssertEqualObjects(@[@"test"], expectedArray);
// See more macros below
// To log in a test and have it show in the UI with this test
GHTestLog(@"Log this number: %@", @(123));
}
// Test with completion (async) callback
- (void)testWithCompletion:(dispatch_block_t)completion {
dispatch_queue_t queue = dispatch_queue_create("MyTest", NULL);
dispatch_async(queue, ^{
[NSThread sleepForTimeInterval:2];
GRTestLog(@"Log something and it will show up in the UI and stdout");
// Call completion when the test is done
completion();
});
}
- (void)testRunLoopsWithCompletion:(dispatch_block_t)completion {
// If you are using sockets attached to run loops, you need to
// call wait which will run the default and common run loop modes
[self wait:10]; // Run loops until completion (or timeout after 10 seconds)
}
// For a long test, you can check cancel state and break/return
- (void)testCancel {
for (NSInteger i = 0; i < 123456789; i++) {
if (self.isCancelling) break;
}
}
// Runs before each test
- (void)setUp {
}
// Runs before each test (async)
- (void)setUp:(dispatch_block_t)completion {
completion();
}
// Runs after each test
- (void)tearDown {
}
// Runs after each test (async)
- (void)tearDown:(dispatch_block_t)completion {
completion();
}
@end
为了使所有测试在主线程运行,实现shouldRunOnMainThread
。
@implementation MyTest
- (void)testSomethingOnMainThread {
GRAssertTrue([NSThread isMainThread]);
}
- (BOOL)shouldRunOnMainThread {
return YES;
}
@end
GRUnit最佳配合异常断点使用。所以当测试运行中发生错误时,会中断,让您可以与调试器交互。
当添加异常断点时,您需要将操作更改为调试器命令
,例如po $eax
,以便自动将异常记录到控制台。
GRAssertNil(a1)
GRAssertNotNil(a1)
GRAssertTrue(expr)
GRAssertFalse(expr)
GRAssertNotNULL(a1)
GRAssertNULL(a1)
GRAssertNotEquals(a1, a2)
GRAssertNotEqualObjects(a1, a2, desc, ...)
GRAssertOperation(a1, a2, op)
GRAssertGreaterThan(a1, a2)
GRAssertGreaterThanOrEqual(a1, a2)
GRAssertLessThan(a1, a2)
GRAssertLessThanOrEqual(a1, a2)
GRAssertEqualStrings(a1, a2)
GRAssertNotEqualStrings(a1, a2)
GRAssertEqualCStrings(a1, a2)
GRAssertNotEqualCStrings(a1, a2)
GRAssertEqualObjects(a1, a2)
GRAssertEquals(a1, a2)
GHAbsoluteDifference(left,right) (MAX(left,right)-MIN(left,right))
GRAssertEqualsWithAccuracy(a1, a2, accuracy)
GRFail(description, ...)
GRAssertNoErr(a1)
GRAssertErr(a1, a2)
该项目使用GRUnit。打开GRUnit.xcworkspace
并运行Tests目标。
安装
$ grunit install_cli -n ProjectName
使用Homebrew安装ios-sim(针对iOS)
$ brew install ios-sim
现在您可以从命令行运行测试
这不起作用...
$ grunit run -n ProjectName
#import <GHUnit/GHUnit.h>
替换为#import <GRUnit/GRUnit.h>
GHTestCase
替换为GRTestCase
GHAssert...
替换为GRAssert...
并删除描述参数(通常是nil)。GHTestLog
替换为GRTestLog
。GHUnitIOSAppDelegate
替换为GRUnitIOSAppDelegate
。