GRUnit 1.1.3

GRUnit 1.1.3

测试已测试
Lang语言 Obj-CObjective C
许可证 MIT
发布最新发布2015年1月

Gabriel Handford维护。



GRUnit 1.1.3

  • Gabriel Handford

GRUnit是一个面向iOS和MacOS的测试框架,以测试(应用程序)目标的形式在您的项目中运行。它旨在与XCTest非常相似,并支持带有超时的时间测试。默认情况下,它旨在在测试失败时抛出异常,因此您可以使用异常断点,并在Xcode中在失败点进行调试。

GRUnit-1.0.1a GRUnit-1.0.1b

使用GRUnit的项目

安装

安装GRUnit宝石

这个宝石使得设置测试应用程序目标变得容易。

$ gem install grunit

安装测试目标

这将对您的ProjectName.xcodeproj文件进行编辑并创建一个测试目标、方案和样本测试文件。您可以多次运行此命令,它不会重复任何文件、目标或方案。

$ grunit install -n ProjectName

将测试目标添加到您的Podfile中

设置您的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

GRTestCase

#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最佳配合异常断点使用。所以当测试运行中发生错误时,会中断,让您可以与调试器交互。

https://developer.apple.com/library/ios/recipes/xcode_help-breakpoint_navigator/articles/adding_an_exception_breakpoint.html

当添加异常断点时,您需要将操作更改为调试器命令,例如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

从GHUnit转换

  1. #import <GHUnit/GHUnit.h>替换为#import <GRUnit/GRUnit.h>
  2. GHTestCase替换为GRTestCase
  3. GHAssert...替换为GRAssert...并删除描述参数(通常是nil)。
  4. GHTestLog替换为GRTestLog
  5. GHUnitIOSAppDelegate替换为GRUnitIOSAppDelegate