{"id":20124042,"url":"https://github.com/testableapple/xcmonkey","last_synced_at":"2025-09-07T05:37:27.566Z","repository":{"id":65130745,"uuid":"578770679","full_name":"testableapple/xcmonkey","owner":"testableapple","description":"Challenge your apps on iOS with monkey testing 📱🐒","archived":false,"fork":false,"pushed_at":"2024-10-28T19:37:03.000Z","size":2714,"stargazers_count":113,"open_issues_count":2,"forks_count":5,"subscribers_count":4,"default_branch":"main","last_synced_at":"2025-08-16T07:55:41.952Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://testableapple.com/note-36","language":"Ruby","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/testableapple.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null},"funding":{"github":"testableapple"}},"created_at":"2022-12-15T21:00:45.000Z","updated_at":"2025-07-06T01:31:50.000Z","dependencies_parsed_at":"2024-05-13T10:53:12.622Z","dependency_job_id":"4f0406ff-6475-4af4-9846-e080a83f60c2","html_url":"https://github.com/testableapple/xcmonkey","commit_stats":{"total_commits":55,"total_committers":3,"mean_commits":"18.333333333333332","dds":0.4727272727272728,"last_synced_commit":"5372b82f725ca285a83ed978a5eb1629596d9cbe"},"previous_names":["alteral/xcmonkey"],"tags_count":8,"template":false,"template_full_name":null,"purl":"pkg:github/testableapple/xcmonkey","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/testableapple%2Fxcmonkey","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/testableapple%2Fxcmonkey/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/testableapple%2Fxcmonkey/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/testableapple%2Fxcmonkey/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/testableapple","download_url":"https://codeload.github.com/testableapple/xcmonkey/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/testableapple%2Fxcmonkey/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":273997796,"owners_count":25204625,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-09-07T02:00:09.463Z","response_time":67,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-13T19:47:28.859Z","updated_at":"2025-09-07T05:37:27.528Z","avatar_url":"https://github.com/testableapple.png","language":"Ruby","funding_links":["https://github.com/sponsors/testableapple"],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003cimg src=\"/assets/images/xcmonkey.png\"/\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://github.com/testableapple/xcmonkey/actions\"\u003e\u003cimg src=\"https://github.com/testableapple/xcmonkey/actions/workflows/test.yml/badge.svg\" /\u003e\u003c/a\u003e\n  \u003ca href=\"https://sonarcloud.io/summary/new_code?id=testableapple_xcmonkey\"\u003e\u003cimg src=\"https://sonarcloud.io/api/project_badges/measure?project=testableapple_xcmonkey\u0026metric=coverage\" /\u003e\u003c/a\u003e\n  \u003ca href=\"https://rubygems.org/gems/xcmonkey\"\u003e\u003cimg src=\"https://img.shields.io/gem/v/xcmonkey.svg?style=flat\" /\u003e\u003c/a\u003e\n  \u003ca href=\"/LICENSE\"\u003e\u003cimg src=\"https://img.shields.io/badge/license-MIT-green.svg?style=flat\" /\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n## Description\n\n*xcmonkey* is a tool for doing stress testing of iOS apps. It's inspired by and has similar goals to [*monkey*](https://developer.android.com/studio/test/monkey) on Android.\n\nUnder the hood, *xcmonkey* uses [iOS Development Bridge](https://fbidb.io/) as a driver, that's why it's pretty smart and can do a lot of things, such as taps, swipes and presses. All that comes «pseudo-random» because it has access to the screen hierarchy, and so can either do actions blindly (like tapping on random points) or precisely (like tapping on the existing elements).\n\n## Prerequisites\n\n```bash\nbrew install facebook/fb/idb-companion\npip3.6 install fb-idb\n```\n\n## Installation\n\n```bash\ngem install xcmonkey\n```\n\nIf you prefer to use [*bundler*](https://bundler.io/), add the following line to your `Gemfile`:\n\n```ruby\ngem 'xcmonkey'\n```\n\n## Usage\n\n### To run a stress test\n\n```bash\n$ xcmonkey test --event-count 100 --bundle-id \"com.apple.Maps\" --udid \"413EA256-CFFB-4312-94A6-12592BEE4CBA\"\n\n12:44:19.343: Device info: {\n  \"name\": \"iPhone 14 Pro\",\n  \"udid\": \"413EA256-CFFB-4312-94A6-12592BEE4CBA\",\n  \"state\": \"Booted\",\n  \"type\": \"simulator\",\n  \"os_version\": \"iOS 16.2\",\n  \"architecture\": \"x86_64\",\n  \"path\": \"/tmp/idb/413EA256-CFFB-4312-94A6-12592BEE4CBA_companion.sock\",\n  \"is_local\": true,\n  \"companion\": \"/tmp/idb/413EA256-CFFB-4312-94A6-12592BEE4CBA_companion.sock\"\n}\n\n12:44:22.550: App info: {\n  \"bundle_id\": \"com.apple.Maps\",\n  \"name\": \"Maps\",\n  \"install_type\": \"system\",\n  \"architectures\": [\n    \"x86_64\",\n    \"arm64\"\n  ],\n  \"process_state\": \"Running\",\n  \"debuggable\": false,\n  \"pid\": \"49186\"\n}\n\n12:44:23.203: Tap: {\n  \"x\": 53,\n  \"y\": 749\n}\n\n12:44:23.511: Swipe (0.5s): {\n  \"x\": 196,\n  \"y\": 426\n} =\u003e {\n  \"x\": 143,\n  \"y\": 447\n}\n\n12:44:24.355: Press (1.2s): {\n  \"x\": 143,\n  \"y\": 323\n}\n```\n\n### To repeat the stress test from generated session\n\n```bash\nxcmonkey repeat --session-path \"./xcmonkey-session.json\"\n```\n\n### To describe the required point\n\n```bash\nxcmonkey describe -x 20 -y 625 --udid \"413EA256-CFFB-4312-94A6-12592BEE4CBA\"\n```\n\n### Test options reference\n\nThe table below lists all options you can include on the `xcmonkey test` command line.\n\n| Category | Option | Description | Default |\n| --- | --- | --- | --- |\n| **General** | `-h, --help` | Display help documentation | |\n| | `-v, --version` | Display version information | |\n| | `-t, --trace` | Display backtrace when an error occurs | |\n| **Events** | `-u, --udid \u003cstring\u003e` | Set device UDID | |\n| | `-b, --bundle-id \u003cstring\u003e` | Set target bundle identifier | |\n| | `-s, --session-path \u003cstring\u003e` | Path where test session should be saved | |\n| | `-e, --event-count \u003cinteger\u003e` | Set events count | `60` |\n| | `--exclude-taps` | Exclude taps from gestures list | `false` |\n| | `--exclude-swipes` | Exclude swipes from gestures list | `false` |\n| | `--exclude-presses` | Exclude presses from gestures list | `false` |\n| | `--disable-simulator-keyboard` | Disable simulator keyboard | `false` |\n| **Debugging** | `--ignore-crashes` | Ignore app crashes | `false` |\n| | `--throttle \u003cmilliseconds\u003e` | Fixed delay between events | `0` |\n\n## [fastlane](https://github.com/fastlane/fastlane) integration\n\nTo get started with [xcmonkey fastlane plugin](https://github.com/testableapple/fastlane-plugin-xcmonkey), add it to your project by running:\n\n```bash\nfastlane add_plugin xcmonkey\n```\n\n### Usage\n\n```ruby\nlane :monkey_test do\n  bundle_id = 'com.apple.Maps'\n  device = 'iPhone 14'\n  sim = FastlaneCore::Simulator.all.filter { |d| d.name == device }.max_by(\u0026:os_version)\n  udid = sim.udid\n\n  xcmonkey(udid: udid, bundle_id: bundle_id)\nend\n```\n\n## Code of Conduct\n\nHelp us keep *xcmonkey* open and inclusive. Please read and follow our [Code of Conduct](CODE_OF_CONDUCT.md).\n\n## License\n\nThis project is licensed under the terms of the MIT license. See the [LICENSE](LICENSE) file.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftestableapple%2Fxcmonkey","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftestableapple%2Fxcmonkey","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftestableapple%2Fxcmonkey/lists"}