SwiftMonkeyPaws 2.2.0

SwiftMonkeyPaws 2.2.0

Dag ÅgrenWojciech Czerski 维护。



SwiftMonkey

此项目是一个用于在 iOS 应用中生成随机用户输入的框架。这种类似的猴子测试对于压力测试应用和查找罕见崩溃很有用。

它还包含一个相关的框架 SwiftMonkeyPaws,它提供对生成的事件的可视化。这大大提高了您随机测试的有用性,因为您可以查看哪些触摸触发了您可能遇到的任何崩溃。

为什么使用 SwiftMonkey?

  • 当测试您的 UI 时,您很容易想到如何测试东西应该如何工作,但您是否发愁于想出可能不工作的东西的类型?
  • 是否曾经向某人展示过您的应用,他们随后开始猛击屏幕,立即通过做您从未想过的事情使您的应用崩溃?
  • 您是否想对您应用的稳定性更有信心?
  • 您是否遇到了您无法复现的罕见崩溃?
  • 您是否有需要很长时间才能显现并且需要大量 UI 动作的记忆泄漏?

随机测试将帮助您解决所有这些问题!

SwiftMonkey 受到 UI AutoMonkey 的启发,并且有着类似的目标,但它是与 Xcode UI 测试框架集成的,这为调试提供了更好的机会。

而且,它看起来也很有趣

快速入门

要亲自体验这个框架是如何工作的,只需抓取代码并打开 SwiftMonkeyExample/SwiftMonkeyExample.xcodeproj。然后按 Cmd-U 运行 UI 测试。

安装

从高层次概述,将 SwiftMonkey.framework 添加到您的 UI 测试目标中。然后添加一个创建 Monkey 对象并使用它来生成事件的测试。

可选地,您还可以将 SwiftMonkeyPaws.framework 添加到您的主应用程序中,并创建一个 MonkeyPaws 对象以启用可视化。您可能只想在调试构建时或使用特定的命令行标志时这样做。

要求

SwiftMonkey 使用 Swift 4.0。除了 iOS 本身(支持 8.0 及以上版本)外,没有其他依赖项。SwiftMonkeyPaws 也没有任何依赖项;您甚至可以在不使用 SwiftMonkey 的情况下独立使用它。

使用 CocoaPods 安装

您可以使用 CocoaPods 来安装框架。假设您的应用程序和测试目标名称分别为 "App" 和 "Tests",您可以在您的 Podfile 中使用类似以下内容:

target 'App' do
    pod 'SwiftMonkeyPaws', '~> 2.1.0'
end

target 'Tests' do
    pod 'SwiftMonkey', '~> 2.1.0'
end

手动安装

SwiftMonkeySwiftMonkeyPaws 文件夹复制到您的项目中。接下来,将 xcodeproj 文件拖放到您的项目中。

然后,对于 SwiftMonkey,将 SwiftMonkey.framework 添加到您的测试目标的依赖项中,并添加一个 Copy Files 构建阶段将其复制到 Frameworks 目录。

对于 SwiftMonkeyPaws,将 SwiftMonkeyPaws.framework 添加到您的应用程序目标的嵌入二进制文件部分就足够了。

(如果您不想使用框架,也可以直接链接 Swift 文件。)

Swift 包管理器

截至本文撰写时,Swift 包管理器不支持 iOS 项目。虽然已实验性地创建过 SPM 包文件,但显然它们目前还不能正常工作。

用法

SwiftMonkey

要进行猴子测试,首先导入 import SwiftMonkey,然后创建一个新的测试用例,使用 Monkey 对象来配置和运行输入事件生成。以下是一个简单的示例

func testMonkey() {
        let application = XCUIApplication()

        // Initialise the monkey tester with the current device
        // frame. Giving an explicit seed will make it generate
        // the same sequence of events on each run, and leaving it
        // out will generate a new sequence on each run.
        let monkey = Monkey(frame: application.frame)
        //let monkey = Monkey(seed: 123, frame: application.frame)

        // Add actions for the monkey to perform. We just use a
        // default set of actions for this, which is usually enough.
        // Use either one of these but maybe not both.

        // XCTest private actions seem to work better at the moment.
        // before Xcode 10.1, you can use
        // monkey.addDefaultXCTestPrivateActions()

        // after Xcode 10.1 We can only use public API
        monkey.addDefaultXCTestPublicActions()

        // UIAutomation actions seem to work only on the simulator.
        //monkey.addDefaultUIAutomationActions()

        // Occasionally, use the regular XCTest functionality
        // to check if an alert is shown, and click a random
        // button on it.
        monkey.addXCTestTapAlertAction(interval: 100, application: application)

        // Run the monkey test indefinitely.
        monkey.monkeyAround()
}

Monkey 对象允许您不仅添加内置的事件生成器,还可以添加您自己的任何代码块,这些代码块可以随机运行或在设定的时间间隔内运行。在这些代码块中,您可以执行任何操作,包括但不限于生成更多输入事件。

目前对该功能的支持有限,因此如果您需要使用更高级的功能,请参阅 Monkey.swift 和其扩展以获取示例。

SwiftMonkeyPaws

要使您的应用程序启用可视化,首先导入 import SwiftMonkeyPaws,然后在程序执行早期进行以下操作

var paws: MonkeyPaws?

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    if CommandLine.arguments.contains("--MonkeyPaws") {
        paws = MonkeyPaws(view: window!)
    }
    return true
}

(此示例使用 application(_, didFinishLaunchingWithOptions),但任何在获得 UIWindow 之后的时机都可以。它还仅在传递了某些命令行标志的情况下实例化可视化,因此只能为测试运行启用。)

使用命令行标志,如果您想在测试用例文件中启用 MonkeyPaws,您可以在您的 testMonkey 函数中添加以下内容

  let application = XCUIApplication()
  application.launchArguments = ["--MonkeyPaws"]

此调用将重写一些 UIApplication 中的方法以捕获 UI 事件。如果您不希望这样做,或者如果您已经有了 UI 事件的来源,您可以向 init 传递以下选项以禁用重写

paws = MonkeyPaws(view: window!, tapUIApplication: false)

然后,您可以通过以下调用传入事件

paws?.append(event: event) // event is UIEvent

贡献

欢迎为此项目提交问题和发送拉取请求!该项目尚处于起步阶段,组织结构不是很完善,因此请勇敢尝试,我们会随项目的发展逐步解决问题。

代码风格目前是使用四个空格缩进和常规的Apple Swift格式。

此外,我们已经采用《贡献者公约》作为本项目的行为准则

http://contributor-covenant.org/version/1/4/

感谢

  • strtolando 开源团队能够帮助项目顺利启动。
  • João Nunes帮助编写文档。
  • Jakub Mucha帮助修复了错误。

待办事项

SwiftMonkey

  • 编写更多文档。
  • 添加更多输入事件动作。
  • 使用公共XCTest API而不是私有API进行随机测试。
    • 查找可点击的视图并直接点击,以补偿事件生成缓慢的问题。
  • 修复滑动动作,避免将顶部和底部面板拉出。(这可能导致猴子逃出应用程序,可能会出现问题!)
  • 通常,找到一种方法来快速查看猴子是否离开了应用程序。
  • 找出如何使用XCTest私有API执行设备旋转。
  • 找出为什么UIAutomation动作在设备上不起作用,只在小模拟器上起作用。
  • 调查其他不依赖于私有API的输入事件生成方法。
  • 一旦Swift Package Manager支持iOS,更新项目以支持它。

SwiftMonkeyPaws

  • 为可视化添加更多定制性。

SwiftMonkeyExample

  • 添加更多UI元素、视图和控件,使示例看起来更有趣。
  • 也许可以添加一些Monkey测试能找到的真实崩溃。

Contact

本软件最初由Dag Ågren ([email protected]) 为Zalando SE编写。此电子邮件地址是本项目的主要联系方式。

将错误报告和功能请求作为GitHub上的问题发布可能更容易得到解决。

License

MIT许可 (MIT) 版权所有 © 2016 Zalando SE, https://tech.zalando.com

以下条件为条件:

上述版权声明和本许可声明应包含在软件的所有副本或主要部分中。

软件按照“原样”提供,不提供任何明示或暗示的保证,包括但不限于适销性、适用于特定用途和非侵权性。在任何情况下,作者或版权持有人不对任何索赔、损害或其他责任承担责任,无论是基于合同、侵权或其他方式,源自、因之或与此软件的使用或其他交易有关。