xcmonkey 0.1.1 → 0.1.2
Sign up to get free protection for your applications and to get access to all the features.
- 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
|