Subliminal 1.1.0

Subliminal 1.1.0

测试已测试
语言语言 Obj-CObjective C
许可证 Apache 2
发布日期最后发布2014年12月

Jeff Wear 负责。



Subliminal是一个用于编写iOS集成测试的框架。Subliminal提供了OCUnit/XCTest类似的接口,用于Apple的UIAutomation框架,测试完全用Objective-C编写。Subliminal还提供了一种强大的机制,使得你的测试可以直接操作应用。

[ 特性入门要求用法持续集成贡献联系版权与许可证 ]

特性

无缝集成

使用Objective-C编写测试,并通过Xcode运行它们。在Instruments中查看丰富的日志和截图。使用UIAutomation来模拟用户交互。Subliminal允许你使用熟悉的工具,无需任何依赖。

完全控制

通过使用UIAutomation,Subliminal可以模拟几乎任何交互——而不必借助于私有API。从导航应用内购买对话框,到将应用休眠,Subliminal让你能够模拟像用户一样的复杂交互。而且当你想要直接操作你的应用时,Subliminal也会帮助你实现这一点。

可扩展测试

定义Objective-C方法以帮助设置和拆解测试。利用原生的持续集成支持。相信Subliminal的完整文档和全面测试覆盖率。Subliminal是测试的完美基础。

如何入门

运行示例应用

  1. 克隆Subliminal仓库: git clone https://github.com/inkling/Subliminal.git
  2. 切换到目录: cd Subliminal
  3. 如果你还没有设置Subliminal,则进行设置: rake install
  4. 打开示例项目: open Example/SubliminalTest.xcodeproj
  5. 切换到“集成测试”方案。您也可能看到一个名为“潜意识集成测试”的方案——请确保您选择“集成测试”。
  6. 选择“产品”>“配置”(⌘+I)。
  7. 在用户模板下,选择潜意识。

安装潜意识

有关安装说明,请参阅潜意识的Wiki

要求

潜意识支持使用Xcode 5.1和iOS 7.x SDKs构建的项目,以及运行iOS 6.1到7.1的部署目标。

对于iOS 5.1的支持,请使用Subliminal 1.1.0(在发布部分或CocoaPods上找到)。要在iOS 5.1仿真器中测试,您需要运行OS X 10.8并手动将iOS 5.1仿真器添加到Xcode 5.1,详情请参阅此处

用法

潜意识旨在让OCUnit/XCTest的用户感到熟悉。在潜意识中,SLTest的子类将测试定义为基础以test开头的方法。在运行时,潜意识会发现并运行这些测试。

测试可以操作用户界面,甚至可以直接操作应用程序。以下是一个示例测试用例的外观

@implementation STLoginTest

- (void)testLogInSucceedsWithUsernameAndPassword {
    SLTextField *usernameField = [SLTextField elementWithAccessibilityLabel:@"username field"];
    SLTextField *passwordField = [SLTextField elementWithAccessibilityLabel:@"password field" isSecure:YES];
    SLElement *submitButton = [SLElement elementWithAccessibilityLabel:@"Submit"];
    SLElement *loginSpinner = [SLElement elementWithAccessibilityLabel:@"Logging in..."];

    NSString *username = @"Jeff", *password = @"foo";
    [usernameField setText:username];
    [passwordField setText:password];

    [submitButton tap];

    // wait for the login spinner to disappear
    SLAssertTrueWithTimeout([loginSpinner isInvalidOrInvisible], 
                            3.0, @"Log-in was not successful.");

    NSString *successMessage = [NSString stringWithFormat:@"Hello, %@!", username];
    SLAssertTrue([[SLElement elementWithAccessibilityLabel:successMessage] isValid], 
                @"Log-in did not succeed.");

    // Check the internal state of the app.         
    SLAssertTrue(SLAskAppYesNo(isUserLoggedIn), @"User is not logged in.")
}

@end

有关更多信息,请参阅潜意识的Wiki

持续集成

潜意识包括端到端CI支持来构建您的项目,在适当的仿真器或设备上运行其测试,并以多种格式输出结果。

有关用于与Travis和Jenkins等流行CI服务集成的示例脚本和指南,请参阅潜意识的Wiki

与其他集成测试框架的比较

  • 潜意识与其他集成测试框架有什么不同?

    大多数其他集成测试框架分为两大类:完全是Objective-C基础的,或者是完全是UIAutomation基础的。

    完全是Objective-C基础的框架,如KIFFrank等,必须通过使用私有API来篡改应用程序的触摸处理系统来模拟用户交互。因此,它们无法保证准确地模拟用户的输入。此外,这些框架只能模拟与应用程序的交互,而不是与设备或其他过程(如应用内购买提示)的交互。

    完全是基于苹果的UIAutomation框架的框架需要繁琐的工作流程——在Instruments中使用JavaScript编写测试,这些工作流程并不利用开发人员现有的工具链。此外,它们提供给开发人员没有直接操作应用程序的手段——对UIAutomation测试来说,应用程序是一个完全的黑盒子。

    只有潜意识同时结合了在Objective-C中编写测试的方便性和UIAutomation的强大功能。

  • 潜意识与UIAutomation有什么不同?

    除了上述UIAutomation的限制,编写UIAutomation测试非常困难。这是因为UIAutomation需要通过用户界面元素在“元素层次结构”中的位置来确定它们的ID,如

    var cell = UIATarget.localTarget().frontMostApp().mainWindow().tableViews()[0].cells()["foo"];

    这些引用不仅难以阅读,也难以编写。要引用任何特定元素,您必须描述其整个继承结构,同时只包括UIAutomation认为必要(是图像;可访问的元素,也许;私有的UIWebView子视图,当然!)的视图。

    基于UIAutomation的测试不是用来编写的,而是使用Instruments进行“录制”。这迫使测试依赖于Instruments,并使得测试在之后难以修改。

    Subliminal允许开发者根据元素的属性识别元素,而与其在元素层次结构中的位置无关。

    SLElement *fooCell = [SLElement elementWithAccessibilityLabel:@"foo"];

    Subliminal隐藏UIAutomation脚本的复杂性,使开发人员可以专注于编写测试。

    Subliminal还修复了UIAutomation和instruments CLI工具中的一些错误,例如instruments真实设备支持的缺乏。而且,最重要的是,Subliminal使用人类友好的格式和ANSI颜色重新编写了instruments的输出

贡献

Subliminal欢迎拉取请求!查看贡献指南了解如何设置Subliminal进行开发和如何提交成功的拉取请求。

致谢

Jeff Wear创建,由Inkling的支持并得到了以下人员的帮助:

以及Subliminal不断增加的贡献者列表

联系方式

您还可以关注Subliminal (@subliminaltest) 在Twitter上的动态。

版权和许可

版权所有 2013-2014 Inkling Systems, Inc.

根据Apache License,版本2.0(“许可证”)许可;除非符合许可证的条款,否则您不得使用此文件。您可以在以下地址获取许可证副本文档:

https://apache.ac.cn/licenses/LICENSE-2.0

除非适用法律要求或书面同意,否则在许可证下分发的软件按“原样”分发,不提供任何明示或暗示的保证或条件。请参见许可证了解具体语言管理许可证权限和限制。