SwiftMonkey 2.2.0

SwiftMonkey 2.2.0

测试已测试
Lang语言 SwiftSwift
许可证 MIT
发布最后发布2021 年 2 月
SPM支持 SPM

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 作为依赖项添加到测试目标,并添加一个复制文件构建阶段以将其复制到 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 的某些方法以捕获 UIEvents。如果不想这样做,或者如果您已经有了 UIEvents 的来源,您可以通过传递以下选项到 init 来禁用篡改

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

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

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

贡献

请随意为此项目提交问题和发送拉取请求!它非常新颖,还没有很好地组织,所以大胆尝试,我们会逐步解决细节。

目前代码风格仅为四个空格缩进和常规 Apple Swift 格式。

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

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

感谢

  • Zalando开源工会为启动此项目提供帮助。
  • João Nunes 为文档编写提供帮助。
  • Jakub Mucha 为修复错误提供帮助。

待办事项

SwiftMonkey

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

SwiftMonkeyPaws

  • 为可视化添加更多自定义选项。

SwiftMonkeyExample

  • 添加更多UI元素、视图和控件使示例看起来更有趣。
  • 也许可以添加一些猴子测试可以发现的实际崩溃?

联系

本软件最初由Dag Ågren编写,为Zalando SE。此电子邮件作为此项目的首选联系地址。

如果在GitHub上发布问题,则可能会更优先处理错误报告和功能请求。

许可

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

特此授予任何人无限制地使用本软件及其相关文档文件(“软件”)的权利,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或销售软件副本的权利,并允许将软件提供给其他人以进行此类操作,前提是遵守以下条件

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

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