xcmonkey 0.1.1 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.github/FUNDING.yml +1 -3
- data/.github/workflows/test.yml +38 -0
- data/README.md +64 -11
- data/assets/images/xcmonkey.png +0 -0
- data/fastlane/Fastfile +28 -0
- data/lib/xcmonkey/driver.rb +15 -0
- data/lib/xcmonkey/version.rb +1 -1
- data/requirements.txt +1 -0
- data/sonar-project.properties +11 -0
- data/spec/driver_spec.rb +8 -0
- metadata +6 -3
- data/.github/workflows/Test.yml +0 -29
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7a6aa190c1c4cfa28f97b20524c907da488aad2d78f2c1dda8f827899f6ee53f
|
4
|
+
data.tar.gz: 534245a695ed0f030df459986c326fb356b3593baec3bc6750eb1cc622d32390
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 41415c8c576a3b6887ee87d44f4c4e571f1e7abda3a96f23abff52cebe77438be70ee76ab18f83a92b78cca2da429cf0c12305b2d3a8ca59b0b2e7e26405ec23
|
7
|
+
data.tar.gz: 93d86451b2b7b8d2a755744ea47be375d042763ea550ddbdef5faff530bbf775e46ab24ede0f6d9dfe424f02ef4c2a923ccd3f342d1872cd6f4d82dcefae7cef
|
data/.github/FUNDING.yml
CHANGED
@@ -0,0 +1,38 @@
|
|
1
|
+
name: Test
|
2
|
+
|
3
|
+
on:
|
4
|
+
push:
|
5
|
+
branches:
|
6
|
+
- main
|
7
|
+
- develop
|
8
|
+
|
9
|
+
pull_request:
|
10
|
+
types: [opened, synchronize]
|
11
|
+
|
12
|
+
jobs:
|
13
|
+
chat:
|
14
|
+
name: Automated Code Review
|
15
|
+
runs-on: macos-12
|
16
|
+
timeout-minutes: 15
|
17
|
+
env:
|
18
|
+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
19
|
+
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
|
20
|
+
steps:
|
21
|
+
- uses: actions/checkout@v3.2.0
|
22
|
+
|
23
|
+
- uses: actions/setup-python@v4.4.0
|
24
|
+
with:
|
25
|
+
python-version: 3.11
|
26
|
+
cache: 'pip'
|
27
|
+
|
28
|
+
- run: bundle install
|
29
|
+
|
30
|
+
- run: brew install sonar-scanner
|
31
|
+
|
32
|
+
- run: brew install facebook/fb/idb-companion
|
33
|
+
|
34
|
+
- run: pip install -r requirements.txt
|
35
|
+
|
36
|
+
- run: bundle exec fastlane code_review
|
37
|
+
|
38
|
+
- run: bundle exec fastlane sonar_upload
|
data/README.md
CHANGED
@@ -1,19 +1,24 @@
|
|
1
|
-
|
1
|
+
<p align="center">
|
2
|
+
<img src="/assets/images/xcmonkey.png"/>
|
3
|
+
</p>
|
2
4
|
|
3
|
-
|
5
|
+
<p align="center">
|
6
|
+
<a href="https://github.com/alteral/xcmonkey/actions"><img src="https://github.com/alteral/xcmonkey/actions/workflows/test.yml/badge.svg" /></a>
|
7
|
+
<a href="https://sonarcloud.io/summary/new_code?id=alteral_xcmonkey"><img src="https://sonarcloud.io/api/project_badges/measure?project=alteral_xcmonkey&metric=coverage" /></a>
|
8
|
+
<a href="https://rubygems.org/gems/xcmonkey"><img src="https://img.shields.io/gem/v/xcmonkey.svg?style=flat" /></a>
|
9
|
+
<a href="/LICENSE"><img src="https://img.shields.io/badge/license-MIT-green.svg?style=flat" /></a>
|
10
|
+
</p>
|
4
11
|
|
5
|
-
|
6
|
-
brew tap facebook/fb
|
7
|
-
brew install idb-companion
|
8
|
-
```
|
12
|
+
*xcmonkey* is a tool for doing randomised UI testing of iOS apps.
|
9
13
|
|
10
|
-
##
|
14
|
+
## Requirements
|
11
15
|
|
12
16
|
```bash
|
13
|
-
brew install
|
17
|
+
brew install facebook/fb/idb-companion
|
18
|
+
pip3.6 install fb-idb
|
14
19
|
```
|
15
20
|
|
16
|
-
|
21
|
+
## Installation
|
17
22
|
|
18
23
|
```bash
|
19
24
|
gem install xcmonkey
|
@@ -24,13 +29,61 @@ gem install xcmonkey
|
|
24
29
|
### Test
|
25
30
|
|
26
31
|
```bash
|
27
|
-
xcmonkey test --udid "
|
32
|
+
$ xcmonkey test --udid "413EA256-CFFB-4312-94A6-12592BEE4CBA" --bundle-id "com.apple.mobilesafari"
|
33
|
+
12:44:19.343: Device info: iPhone 14 Pro | 413EA256-CFFB-4312-94A6-12592BEE4CBA | Booted | simulator | iOS 16.2 | x86_64 | /tmp/idb/413EA256-CFFB-4312-94A6-12592BEE4CBA_companion.sock
|
34
|
+
|
35
|
+
12:44:22.550: App info: com.apple.mobilesafari | MobileSafari | system | x86_64, arm64 | Running | Not Debuggable | pid=43398
|
36
|
+
|
37
|
+
12:44:23.203: Tap: {
|
38
|
+
"x": 53,
|
39
|
+
"y": 749
|
40
|
+
}
|
41
|
+
|
42
|
+
12:44:23.511: Swipe: {
|
43
|
+
"x": 196,
|
44
|
+
"y": 426
|
45
|
+
} => {
|
46
|
+
"x": 143,
|
47
|
+
"y": 447
|
48
|
+
}
|
49
|
+
|
50
|
+
12:44:24.355: Tap: {
|
51
|
+
"x": 143,
|
52
|
+
"y": 323
|
53
|
+
}
|
28
54
|
```
|
29
55
|
|
30
56
|
### Describe point
|
31
57
|
|
32
58
|
```bash
|
33
|
-
xcmonkey describe -x
|
59
|
+
$ xcmonkey describe -x 125 -y 760 --udid "413EA256-CFFB-4312-94A6-12592BEE4CBA"
|
60
|
+
12:41:03.840: Device info: iPhone 14 Pro | 413EA256-CFFB-4312-94A6-12592BEE4CBA | Booted | simulator | iOS 16.2 | x86_64 | /tmp/idb/413EA256-CFFB-4312-94A6-12592BEE4CBA_companion.sock
|
61
|
+
|
62
|
+
12:41:05.342: x:125 y:760 point info: {
|
63
|
+
"AXFrame": "{{120, 759}, {64, 64}}",
|
64
|
+
"AXUniqueId": "Safari",
|
65
|
+
"frame": {
|
66
|
+
"y": 759,
|
67
|
+
"x": 120,
|
68
|
+
"width": 64,
|
69
|
+
"height": 64
|
70
|
+
},
|
71
|
+
"role_description": "button",
|
72
|
+
"AXLabel": "Safari",
|
73
|
+
"content_required": false,
|
74
|
+
"type": "Button",
|
75
|
+
"title": null,
|
76
|
+
"help": "Double tap to open",
|
77
|
+
"custom_actions": [
|
78
|
+
"Edit mode",
|
79
|
+
"Today",
|
80
|
+
"App Library"
|
81
|
+
],
|
82
|
+
"AXValue": "",
|
83
|
+
"enabled": true,
|
84
|
+
"role": "AXButton",
|
85
|
+
"subrole": null
|
86
|
+
}
|
34
87
|
```
|
35
88
|
|
36
89
|
## Code of Conduct
|
Binary file
|
data/fastlane/Fastfile
CHANGED
@@ -20,6 +20,34 @@ lane :code_review do
|
|
20
20
|
sh('bundle exec rake')
|
21
21
|
end
|
22
22
|
|
23
|
+
lane :sonar_upload do
|
24
|
+
update_simplecov_report
|
25
|
+
sonar_options =
|
26
|
+
if ENV['GITHUB_EVENT_NAME'] == 'pull_request'
|
27
|
+
{
|
28
|
+
sonar_login: ENV.fetch('SONAR_TOKEN', nil),
|
29
|
+
pull_request_branch: ENV.fetch('GITHUB_HEAD_REF', nil),
|
30
|
+
pull_request_base: ENV.fetch('GITHUB_BASE_REF', nil),
|
31
|
+
pull_request_key: ENV.fetch('PR_NUMBER', nil)
|
32
|
+
}
|
33
|
+
else
|
34
|
+
{
|
35
|
+
sonar_login: ENV.fetch('SONAR_TOKEN', nil),
|
36
|
+
branch_name: ENV['BRANCH_NAME'] || git_branch,
|
37
|
+
project_version: version
|
38
|
+
}
|
39
|
+
end
|
40
|
+
|
41
|
+
sonar(sonar_options)
|
42
|
+
end
|
43
|
+
|
44
|
+
private_lane :update_simplecov_report do
|
45
|
+
coverage = JSON.parse(File.read('../coverage/.resultset.json'))["RSpec"]["coverage"]
|
46
|
+
transformed_values = coverage.transform_values { |l| l["lines"] }
|
47
|
+
new_format = { "RSpec" => { "coverage" => transformed_values, "timestamp" => Time.now.to_i } }
|
48
|
+
File.write('../coverage/.sonar.json', JSON.pretty_generate(new_format))
|
49
|
+
end
|
50
|
+
|
23
51
|
def version
|
24
52
|
version_path = '../lib/xcmonkey/version.rb'
|
25
53
|
File.read(version_path).scan(/\d+/).join('.')
|
data/lib/xcmonkey/driver.rb
CHANGED
@@ -23,6 +23,8 @@ class Driver
|
|
23
23
|
tap(coordinates: { x: x, y: y })
|
24
24
|
when :swipe
|
25
25
|
swipe(start_coordinates: el1_coordinates, end_coordinates: el2_coordinates)
|
26
|
+
else
|
27
|
+
next
|
26
28
|
end
|
27
29
|
app_elements = describe_ui.shuffle
|
28
30
|
Logger.error('App lost') if app_elements.include?(@home_tracker)
|
@@ -46,6 +48,7 @@ class Driver
|
|
46
48
|
|
47
49
|
def launch_app
|
48
50
|
`idb launch --udid #{udid} #{bundle_id}`
|
51
|
+
wait_until_app_launched
|
49
52
|
end
|
50
53
|
|
51
54
|
def terminate_app
|
@@ -122,4 +125,16 @@ class Driver
|
|
122
125
|
end
|
123
126
|
@home_tracker
|
124
127
|
end
|
128
|
+
|
129
|
+
def wait_until_app_launched
|
130
|
+
app_info = nil
|
131
|
+
current_time = Time.now
|
132
|
+
while app_info.nil? && Time.now < current_time + 5
|
133
|
+
app_info = list_apps.split("\n").detect do |app|
|
134
|
+
app =~ /#{bundle_id}.*Running/
|
135
|
+
end
|
136
|
+
end
|
137
|
+
Logger.error("Can't run the app #{bundle_id}") if app_info.nil?
|
138
|
+
Logger.info('App info:', payload: app_info)
|
139
|
+
end
|
125
140
|
end
|
data/lib/xcmonkey/version.rb
CHANGED
data/requirements.txt
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
fb-idb
|
@@ -0,0 +1,11 @@
|
|
1
|
+
sonar.projectKey=alteral_xcmonkey
|
2
|
+
sonar.projectName=xcmonkey
|
3
|
+
sonar.host.url=https://sonarcloud.io
|
4
|
+
sonar.organization=alteral
|
5
|
+
sonar.ruby.coverage.reportPaths=coverage/.sonar.json
|
6
|
+
sonar.ruby.coverage.framework=RSpec
|
7
|
+
sonar.sources=lib/
|
8
|
+
sonar.inclusions=lib/**/*.rb
|
9
|
+
sonar.exclusions=lib/**/version.rb
|
10
|
+
sonar.tests=spec/
|
11
|
+
sonar.test.inclusions=spec/*_spec.rb
|
data/spec/driver_spec.rb
CHANGED
@@ -85,6 +85,14 @@ describe Driver do
|
|
85
85
|
expect(actual_coordinates).to eq(expected_coordinates)
|
86
86
|
end
|
87
87
|
|
88
|
+
it 'verifies that app can be launched' do
|
89
|
+
expect(Logger).not_to receive(:error)
|
90
|
+
expect(Logger).to receive(:info)
|
91
|
+
driver.boot_simulator
|
92
|
+
driver.terminate_app
|
93
|
+
expect { driver.launch_app }.not_to raise_error
|
94
|
+
end
|
95
|
+
|
88
96
|
it 'verifies that simulator was not booted' do
|
89
97
|
driver.shutdown_simulator
|
90
98
|
error_message = "Failed to boot #{udid}"
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: xcmonkey
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- alteral
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-12-
|
11
|
+
date: 2022-12-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -218,7 +218,7 @@ files:
|
|
218
218
|
- ".github/FUNDING.yml"
|
219
219
|
- ".github/dependabot.yml"
|
220
220
|
- ".github/pull_request_template.md"
|
221
|
-
- ".github/workflows/
|
221
|
+
- ".github/workflows/test.yml"
|
222
222
|
- ".gitignore"
|
223
223
|
- ".rspec"
|
224
224
|
- ".rubocop.yml"
|
@@ -227,6 +227,7 @@ files:
|
|
227
227
|
- LICENSE
|
228
228
|
- README.md
|
229
229
|
- Rakefile
|
230
|
+
- assets/images/xcmonkey.png
|
230
231
|
- bin/console
|
231
232
|
- bin/setup
|
232
233
|
- bin/xcmonkey
|
@@ -236,6 +237,8 @@ files:
|
|
236
237
|
- lib/xcmonkey/driver.rb
|
237
238
|
- lib/xcmonkey/logger.rb
|
238
239
|
- lib/xcmonkey/version.rb
|
240
|
+
- requirements.txt
|
241
|
+
- sonar-project.properties
|
239
242
|
- spec/describer_spec.rb
|
240
243
|
- spec/driver_spec.rb
|
241
244
|
- spec/logger_spec.rb
|
data/.github/workflows/Test.yml
DELETED
@@ -1,29 +0,0 @@
|
|
1
|
-
name: Test
|
2
|
-
|
3
|
-
on:
|
4
|
-
pull_request:
|
5
|
-
types: [opened, synchronize]
|
6
|
-
|
7
|
-
jobs:
|
8
|
-
chat:
|
9
|
-
name: Checks
|
10
|
-
timeout-minutes: 15
|
11
|
-
runs-on: macos-12
|
12
|
-
steps:
|
13
|
-
- uses: actions/checkout@v3.1.0
|
14
|
-
with:
|
15
|
-
fetch-depth: '0'
|
16
|
-
- uses: actions/cache@v3
|
17
|
-
id: bundler-cache
|
18
|
-
with:
|
19
|
-
path: vendor/bundle
|
20
|
-
key: ${{ runner.os }}-gems-${{ hashFiles('**/Gemfile.lock') }}
|
21
|
-
restore-keys: |
|
22
|
-
${{ runner.os }}-gems-
|
23
|
-
- name: Bundler
|
24
|
-
run: |
|
25
|
-
gem install bundler
|
26
|
-
bundle config path vendor/bundle
|
27
|
-
bundle check || bundle install --jobs 4 --retry 3
|
28
|
-
- name: Rubocop
|
29
|
-
run: bundle exec rake
|