Kea2-python 1.0.2__tar.gz → 1.0.4__tar.gz
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.
- {kea2_python-1.0.2 → kea2_python-1.0.4}/Kea2_python.egg-info/PKG-INFO +61 -21
- {kea2_python-1.0.2 → kea2_python-1.0.4}/Kea2_python.egg-info/SOURCES.txt +3 -1
- {kea2_python-1.0.2 → kea2_python-1.0.4}/PKG-INFO +61 -21
- {kea2_python-1.0.2 → kea2_python-1.0.4}/README.md +60 -20
- kea2_python-1.0.4/kea2/__init__.py +3 -0
- kea2_python-1.0.4/kea2/assets/fastbot_libs/arm64-v8a/libfastbot_native.so +0 -0
- kea2_python-1.0.4/kea2/assets/fastbot_libs/armeabi-v7a/libfastbot_native.so +0 -0
- kea2_python-1.0.4/kea2/assets/fastbot_libs/x86/libfastbot_native.so +0 -0
- kea2_python-1.0.4/kea2/assets/fastbot_libs/x86_64/libfastbot_native.so +0 -0
- kea2_python-1.0.4/kea2/assets/monkeyq.jar +0 -0
- {kea2_python-1.0.2 → kea2_python-1.0.4}/kea2/cli.py +6 -7
- {kea2_python-1.0.2 → kea2_python-1.0.4}/kea2/fastbotManager.py +53 -51
- kea2_python-1.0.4/kea2/kea2_api.py +166 -0
- {kea2_python-1.0.2 → kea2_python-1.0.4}/kea2/keaUtils.py +37 -20
- {kea2_python-1.0.2 → kea2_python-1.0.4}/kea2/logWatcher.py +1 -1
- {kea2_python-1.0.2 → kea2_python-1.0.4}/kea2/report/bug_report_generator.py +1 -1
- {kea2_python-1.0.2 → kea2_python-1.0.4}/kea2/report/report_merger.py +91 -6
- {kea2_python-1.0.2 → kea2_python-1.0.4}/kea2/u2Driver.py +86 -65
- {kea2_python-1.0.2 → kea2_python-1.0.4}/kea2/utils.py +29 -1
- {kea2_python-1.0.2 → kea2_python-1.0.4}/pyproject.toml +1 -1
- kea2_python-1.0.4/tests/test_xpath.py +36 -0
- kea2_python-1.0.2/kea2/__init__.py +0 -1
- kea2_python-1.0.2/kea2/assets/fastbot_libs/arm64-v8a/libfastbot_native.so +0 -0
- kea2_python-1.0.2/kea2/assets/fastbot_libs/armeabi-v7a/libfastbot_native.so +0 -0
- kea2_python-1.0.2/kea2/assets/fastbot_libs/x86/libfastbot_native.so +0 -0
- kea2_python-1.0.2/kea2/assets/fastbot_libs/x86_64/libfastbot_native.so +0 -0
- kea2_python-1.0.2/kea2/assets/monkeyq.jar +0 -0
- {kea2_python-1.0.2 → kea2_python-1.0.4}/Kea2_python.egg-info/dependency_links.txt +0 -0
- {kea2_python-1.0.2 → kea2_python-1.0.4}/Kea2_python.egg-info/entry_points.txt +0 -0
- {kea2_python-1.0.2 → kea2_python-1.0.4}/Kea2_python.egg-info/requires.txt +0 -0
- {kea2_python-1.0.2 → kea2_python-1.0.4}/Kea2_python.egg-info/top_level.txt +0 -0
- {kea2_python-1.0.2 → kea2_python-1.0.4}/LICENSE +0 -0
- {kea2_python-1.0.2 → kea2_python-1.0.4}/kea2/absDriver.py +0 -0
- {kea2_python-1.0.2 → kea2_python-1.0.4}/kea2/adbUtils.py +0 -0
- {kea2_python-1.0.2 → kea2_python-1.0.4}/kea2/assets/config_version.json +0 -0
- {kea2_python-1.0.2 → kea2_python-1.0.4}/kea2/assets/fastbot-thirdpart.jar +0 -0
- {kea2_python-1.0.2 → kea2_python-1.0.4}/kea2/assets/fastbot_configs/abl.strings +0 -0
- {kea2_python-1.0.2 → kea2_python-1.0.4}/kea2/assets/fastbot_configs/awl.strings +0 -0
- {kea2_python-1.0.2 → kea2_python-1.0.4}/kea2/assets/fastbot_configs/max.config +0 -0
- {kea2_python-1.0.2 → kea2_python-1.0.4}/kea2/assets/fastbot_configs/max.fuzzing.strings +0 -0
- {kea2_python-1.0.2 → kea2_python-1.0.4}/kea2/assets/fastbot_configs/max.schema.strings +0 -0
- {kea2_python-1.0.2 → kea2_python-1.0.4}/kea2/assets/fastbot_configs/max.strings +0 -0
- {kea2_python-1.0.2 → kea2_python-1.0.4}/kea2/assets/fastbot_configs/max.tree.pruning +0 -0
- {kea2_python-1.0.2 → kea2_python-1.0.4}/kea2/assets/fastbot_configs/teardown.py +0 -0
- {kea2_python-1.0.2 → kea2_python-1.0.4}/kea2/assets/fastbot_configs/widget.block.py +0 -0
- {kea2_python-1.0.2 → kea2_python-1.0.4}/kea2/assets/framework.jar +0 -0
- {kea2_python-1.0.2 → kea2_python-1.0.4}/kea2/assets/kea2-thirdpart.jar +0 -0
- {kea2_python-1.0.2 → kea2_python-1.0.4}/kea2/assets/quicktest.py +0 -0
- {kea2_python-1.0.2 → kea2_python-1.0.4}/kea2/kea_launcher.py +0 -0
- {kea2_python-1.0.2 → kea2_python-1.0.4}/kea2/mixin.py +0 -0
- {kea2_python-1.0.2 → kea2_python-1.0.4}/kea2/report/__init__.py +0 -0
- {kea2_python-1.0.2 → kea2_python-1.0.4}/kea2/report/mixin.py +0 -0
- {kea2_python-1.0.2 → kea2_python-1.0.4}/kea2/report/templates/bug_report_template.html +0 -0
- {kea2_python-1.0.2 → kea2_python-1.0.4}/kea2/report/templates/merged_bug_report_template.html +0 -0
- {kea2_python-1.0.2 → kea2_python-1.0.4}/kea2/report/utils.py +0 -0
- {kea2_python-1.0.2 → kea2_python-1.0.4}/kea2/resultSyncer.py +0 -0
- {kea2_python-1.0.2 → kea2_python-1.0.4}/kea2/version_manager.py +0 -0
- {kea2_python-1.0.2 → kea2_python-1.0.4}/setup.cfg +0 -0
- {kea2_python-1.0.2 → kea2_python-1.0.4}/tests/test_u2Selector.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: Kea2-python
|
|
3
|
-
Version: 1.0.
|
|
3
|
+
Version: 1.0.4
|
|
4
4
|
Summary: A python library for supporting and customizing automated UI testing for mobile apps
|
|
5
5
|
Author-email: Xixian Liang <xixian@stu.ecnu.edu.cn>
|
|
6
6
|
Requires-Python: >=3.8
|
|
@@ -26,8 +26,11 @@ Dynamic: license-file
|
|
|
26
26
|
|
|
27
27
|
Please contact Xixian Liang at [xixian@stu.ecnu.edu.cn](xixian@stu.ecnu.edu.cn) with your Wechat ID / QR code to be invited to the WeChat discussion group. Of course, we are also ready on GitHub to answer your questions/feedback.
|
|
28
28
|
|
|
29
|
-
|
|
30
|
-
[https://
|
|
29
|
+
#### Github repo [https://github.com/ecnusse/Kea2](https://github.com/ecnusse/Kea2)
|
|
30
|
+
#### Gitee mirror [https://gitee.com/XixianLiang/Kea2](https://gitee.com/XixianLiang/Kea2)
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
|
|
31
34
|
|
|
32
35
|
### [点击此处:查看中文文档](README_cn.md)
|
|
33
36
|
|
|
@@ -43,7 +46,7 @@ Please contact Xixian Liang at [xixian@stu.ecnu.edu.cn](xixian@stu.ecnu.edu.cn)
|
|
|
43
46
|
|
|
44
47
|
Kea2 is an easy-to-use tool for fuzzing mobile apps. Its key *novelty* is able to fuse automated UI testing with scripts (usually written by human), thus empowering automated UI testing with human intelligence for effectively finding *crashing bugs* as well as *non-crashing functional (logic) bugs*.
|
|
45
48
|
|
|
46
|
-
Kea2 is currently built on top of [Fastbot](https://github.com/bytedance/Fastbot_Android), *an industrial-strength automated UI testing tool*, and [uiautomator2](https://github.com/openatx/uiautomator2), *an easy-to-use and stable Android automation library*.
|
|
49
|
+
Kea2 is currently built on top of [Fastbot](https://github.com/ecnusse/Fastbot_Android) 3.0 (a modified/enhanced version of the original [FastBot](https://github.com/bytedance/Fastbot_Android) 2.0), *an industrial-strength automated UI testing tool from ByteDance*, and [uiautomator2](https://github.com/openatx/uiautomator2), *an easy-to-use and stable Android automation library*.
|
|
47
50
|
Kea2 currently targets [Android](https://en.wikipedia.org/wiki/Android_(operating_system)) apps.
|
|
48
51
|
|
|
49
52
|
## Novelty & Important features
|
|
@@ -90,7 +93,7 @@ Please let us know and willing to hear your feedback/questions if you are also u
|
|
|
90
93
|
Kea2 currently works with:
|
|
91
94
|
- [unittest](https://docs.python.org/3/library/unittest.html) as the testing framework to manage the scripts;
|
|
92
95
|
- [uiautomator2](https://github.com/openatx/uiautomator2) as the UI test driver;
|
|
93
|
-
- [Fastbot](https://github.com/bytedance/Fastbot_Android) as the backend automated UI testing tool.
|
|
96
|
+
- [Fastbot](https://github.com/bytedance/Fastbot_Android) as the backend automated UI testing tool.
|
|
94
97
|
|
|
95
98
|
In the future, Kea2 will be extended to support
|
|
96
99
|
- [pytest](https://docs.pytest.org/en/stable/), another popular python testing framework;
|
|
@@ -208,7 +211,7 @@ You can find the full example in script `quicktest.py`, and run this script with
|
|
|
208
211
|
|
|
209
212
|
```bash
|
|
210
213
|
# Launch Kea2 and load one single script quicktest.py.
|
|
211
|
-
kea2 run -p it.feio.android.omninotes.alpha --
|
|
214
|
+
kea2 run -p it.feio.android.omninotes.alpha --running-minutes 10 --throttle 200 --driver-name d propertytest discover -p quicktest.py
|
|
212
215
|
```
|
|
213
216
|
|
|
214
217
|
## Feature 3(运行增强版Fastbot:加入自动断言)
|
|
@@ -243,7 +246,8 @@ For the preceding always-holding property, we can write the following script to
|
|
|
243
246
|
)
|
|
244
247
|
def test_input_box(self):
|
|
245
248
|
|
|
246
|
-
# genenerate a random non-empty string (this is also property-based testing
|
|
249
|
+
# genenerate a random non-empty string (this is also property-based testing
|
|
250
|
+
# by feeding random text inputs!)
|
|
247
251
|
from hypothesis.strategies import text, ascii_letters
|
|
248
252
|
random_str = text(alphabet=ascii_letters).example()
|
|
249
253
|
|
|
@@ -261,9 +265,7 @@ For the preceding always-holding property, we can write the following script to
|
|
|
261
265
|
|
|
262
266
|
You can run this example by using the similar command line in Feature 2.
|
|
263
267
|
|
|
264
|
-
## Feature 4
|
|
265
|
-
|
|
266
|
-
> This feature is still under development. We are looking forward to your feedback! Contact us if you're interested in this feature.
|
|
268
|
+
## Feature 4(兼容已有脚本:通过前置脚本步骤到达特定层次)
|
|
267
269
|
|
|
268
270
|
Kea2 supports reusing existing Ui test Scripts. We are inspired by the idea that: *The existing Ui test scripts usually cover important app functionalities and can reach deep app states. Thus, they can be used as good "guiding scripts" to drive Fastbot to explore important and deep app states.*
|
|
269
271
|
|
|
@@ -271,22 +273,54 @@ For example, you may already have some existing Ui test scripts "login and add a
|
|
|
271
273
|
|
|
272
274
|
### Example
|
|
273
275
|
|
|
274
|
-
|
|
276
|
+
Here are four example scripts in hybridetest_examples, each corresponding to different forms of user scripts, showing you how to launch kea2 in the existing code.
|
|
275
277
|
|
|
276
|
-
|
|
278
|
+
Specifically:
|
|
277
279
|
|
|
278
|
-
|
|
280
|
+
* [u2_unittest_example.py](hybridtest_examples\u2_unittest_example.py) is a u2 script organized with unittest.
|
|
281
|
+
* [u2_pytest_example.py](hybridtest_examples\u2_pytest_example.py) is a u2 script organized with pytest.
|
|
282
|
+
* [appium_unittest_example.py](hybridtest_examples\appium_unittest_example.py) is an appium script organized with unittest.
|
|
283
|
+
* [appium_pytest_example.py](hybridtest_examples\appium_pytest_example.py) is an appium script organized with pytest.
|
|
279
284
|
|
|
280
|
-
|
|
285
|
+
Some notes:
|
|
281
286
|
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
287
|
+
1. You can control whether to execute the kea2-related code you have written by modifying the condition of 'if'. This allows you to easily enable or disable kea2 operations in the same script. Here we use environment variable as an example.
|
|
288
|
+
2. Since kea2 is driven by u2, if an appium-written script wants to launch kea2, it is necessary to first close the appium session. Remember to configure the parameter `"noReset": True` in `desired_caps` to avoid resetting the application when closing the session.
|
|
289
|
+
3. You need to insert the following code template into your existing test cases: Here, you can add your own hook logic in the commented sections, including starting or stopping the appium session, cleaning up instances, etc. This depends on how you want to design the setup and teardown. Apart from that, you only need to configure the `option` parameter and `configs_path` parameter(where your directory `configs` located, btw, `configs`'s location dependon where you executed `kea2 init`), then pass it to the `run_kea2_testing` function.
|
|
285
290
|
|
|
286
|
-
|
|
287
|
-
kea2
|
|
291
|
+
```python
|
|
292
|
+
from kea2 import Kea2Tester, Options, U2Driver
|
|
293
|
+
|
|
294
|
+
if os.environ.get('KEA2_HYBRID_MODE', '').lower() == 'true':
|
|
295
|
+
'''
|
|
296
|
+
Note: The if condition here can be modified as needed according to the actual
|
|
297
|
+
situation of the project, the form of environment variables is just an example.
|
|
298
|
+
'''
|
|
299
|
+
|
|
300
|
+
# close your driver session etc. here
|
|
301
|
+
# ...
|
|
302
|
+
|
|
303
|
+
tester = Kea2Tester()
|
|
304
|
+
result = self.tester.run_kea2_testing(
|
|
305
|
+
Options(
|
|
306
|
+
driverName="d",
|
|
307
|
+
packageNames=[PACKAGE_NAME],
|
|
308
|
+
propertytest_args=["discover", "-p", "Omninotes_Sample.py"],
|
|
309
|
+
serial=DEVICE_SERIAL,
|
|
310
|
+
running_mins=2,
|
|
311
|
+
maxStep=20
|
|
312
|
+
),
|
|
313
|
+
configs_path = None # Default, if your configs folder is located in the root directory, miss this.
|
|
314
|
+
)
|
|
315
|
+
|
|
316
|
+
# restart your driver session or clean instance here
|
|
317
|
+
# ...
|
|
318
|
+
|
|
319
|
+
return # this make your following steps of this testcase not work
|
|
288
320
|
```
|
|
289
321
|
|
|
322
|
+
|
|
323
|
+
|
|
290
324
|
## Test Reports(测试报告)
|
|
291
325
|
|
|
292
326
|
Kea2 automatically generates a HTML test report after each testing session. You can find the report in `output/` under your working directory.
|
|
@@ -379,7 +413,7 @@ kea2做了什么:
|
|
|
379
413
|
|
|
380
414
|
> Guided, Stochastic Model-Based GUI Testing of Android Apps. ESEC/FSE 2017. [pdf](https://dl.acm.org/doi/10.1145/3106237.3106298)
|
|
381
415
|
|
|
382
|
-
|
|
416
|
+
## Maintainers/Contributors
|
|
383
417
|
|
|
384
418
|
Kea2 has been actively developed and maintained by the people in [ecnusse](https://github.com/ecnusse):
|
|
385
419
|
|
|
@@ -397,7 +431,13 @@ Kea2 has been actively developed and maintained by the people in [ecnusse](https
|
|
|
397
431
|
|
|
398
432
|
Kea2 has also received many valuable insights, advices, feedbacks and lessons shared by several industrial people from Bytedance ([Zhao Zhang](https://github.com/zhangzhao4444), Yuhui Su from the Fastbot team), OPay (Tiesong Liu), WeChat (Haochuan Lu, Yuetang Deng), Huawei, Xiaomi and etc. Kudos!
|
|
399
433
|
|
|
400
|
-
###
|
|
434
|
+
### Become a Contributor!
|
|
435
|
+
|
|
436
|
+
Kea2 is an open-source project and we are calling for more contributors to join us!
|
|
437
|
+
|
|
438
|
+
See [Developer guide](DEVELOP.md) for more details.
|
|
439
|
+
|
|
440
|
+
## Star History
|
|
401
441
|
|
|
402
442
|
[](https://www.star-history.com/#ecnusse/Kea2&Date)
|
|
403
443
|
|
|
@@ -12,6 +12,7 @@ kea2/absDriver.py
|
|
|
12
12
|
kea2/adbUtils.py
|
|
13
13
|
kea2/cli.py
|
|
14
14
|
kea2/fastbotManager.py
|
|
15
|
+
kea2/kea2_api.py
|
|
15
16
|
kea2/keaUtils.py
|
|
16
17
|
kea2/kea_launcher.py
|
|
17
18
|
kea2/logWatcher.py
|
|
@@ -46,4 +47,5 @@ kea2/report/report_merger.py
|
|
|
46
47
|
kea2/report/utils.py
|
|
47
48
|
kea2/report/templates/bug_report_template.html
|
|
48
49
|
kea2/report/templates/merged_bug_report_template.html
|
|
49
|
-
tests/test_u2Selector.py
|
|
50
|
+
tests/test_u2Selector.py
|
|
51
|
+
tests/test_xpath.py
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: Kea2-python
|
|
3
|
-
Version: 1.0.
|
|
3
|
+
Version: 1.0.4
|
|
4
4
|
Summary: A python library for supporting and customizing automated UI testing for mobile apps
|
|
5
5
|
Author-email: Xixian Liang <xixian@stu.ecnu.edu.cn>
|
|
6
6
|
Requires-Python: >=3.8
|
|
@@ -26,8 +26,11 @@ Dynamic: license-file
|
|
|
26
26
|
|
|
27
27
|
Please contact Xixian Liang at [xixian@stu.ecnu.edu.cn](xixian@stu.ecnu.edu.cn) with your Wechat ID / QR code to be invited to the WeChat discussion group. Of course, we are also ready on GitHub to answer your questions/feedback.
|
|
28
28
|
|
|
29
|
-
|
|
30
|
-
[https://
|
|
29
|
+
#### Github repo [https://github.com/ecnusse/Kea2](https://github.com/ecnusse/Kea2)
|
|
30
|
+
#### Gitee mirror [https://gitee.com/XixianLiang/Kea2](https://gitee.com/XixianLiang/Kea2)
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
|
|
31
34
|
|
|
32
35
|
### [点击此处:查看中文文档](README_cn.md)
|
|
33
36
|
|
|
@@ -43,7 +46,7 @@ Please contact Xixian Liang at [xixian@stu.ecnu.edu.cn](xixian@stu.ecnu.edu.cn)
|
|
|
43
46
|
|
|
44
47
|
Kea2 is an easy-to-use tool for fuzzing mobile apps. Its key *novelty* is able to fuse automated UI testing with scripts (usually written by human), thus empowering automated UI testing with human intelligence for effectively finding *crashing bugs* as well as *non-crashing functional (logic) bugs*.
|
|
45
48
|
|
|
46
|
-
Kea2 is currently built on top of [Fastbot](https://github.com/bytedance/Fastbot_Android), *an industrial-strength automated UI testing tool*, and [uiautomator2](https://github.com/openatx/uiautomator2), *an easy-to-use and stable Android automation library*.
|
|
49
|
+
Kea2 is currently built on top of [Fastbot](https://github.com/ecnusse/Fastbot_Android) 3.0 (a modified/enhanced version of the original [FastBot](https://github.com/bytedance/Fastbot_Android) 2.0), *an industrial-strength automated UI testing tool from ByteDance*, and [uiautomator2](https://github.com/openatx/uiautomator2), *an easy-to-use and stable Android automation library*.
|
|
47
50
|
Kea2 currently targets [Android](https://en.wikipedia.org/wiki/Android_(operating_system)) apps.
|
|
48
51
|
|
|
49
52
|
## Novelty & Important features
|
|
@@ -90,7 +93,7 @@ Please let us know and willing to hear your feedback/questions if you are also u
|
|
|
90
93
|
Kea2 currently works with:
|
|
91
94
|
- [unittest](https://docs.python.org/3/library/unittest.html) as the testing framework to manage the scripts;
|
|
92
95
|
- [uiautomator2](https://github.com/openatx/uiautomator2) as the UI test driver;
|
|
93
|
-
- [Fastbot](https://github.com/bytedance/Fastbot_Android) as the backend automated UI testing tool.
|
|
96
|
+
- [Fastbot](https://github.com/bytedance/Fastbot_Android) as the backend automated UI testing tool.
|
|
94
97
|
|
|
95
98
|
In the future, Kea2 will be extended to support
|
|
96
99
|
- [pytest](https://docs.pytest.org/en/stable/), another popular python testing framework;
|
|
@@ -208,7 +211,7 @@ You can find the full example in script `quicktest.py`, and run this script with
|
|
|
208
211
|
|
|
209
212
|
```bash
|
|
210
213
|
# Launch Kea2 and load one single script quicktest.py.
|
|
211
|
-
kea2 run -p it.feio.android.omninotes.alpha --
|
|
214
|
+
kea2 run -p it.feio.android.omninotes.alpha --running-minutes 10 --throttle 200 --driver-name d propertytest discover -p quicktest.py
|
|
212
215
|
```
|
|
213
216
|
|
|
214
217
|
## Feature 3(运行增强版Fastbot:加入自动断言)
|
|
@@ -243,7 +246,8 @@ For the preceding always-holding property, we can write the following script to
|
|
|
243
246
|
)
|
|
244
247
|
def test_input_box(self):
|
|
245
248
|
|
|
246
|
-
# genenerate a random non-empty string (this is also property-based testing
|
|
249
|
+
# genenerate a random non-empty string (this is also property-based testing
|
|
250
|
+
# by feeding random text inputs!)
|
|
247
251
|
from hypothesis.strategies import text, ascii_letters
|
|
248
252
|
random_str = text(alphabet=ascii_letters).example()
|
|
249
253
|
|
|
@@ -261,9 +265,7 @@ For the preceding always-holding property, we can write the following script to
|
|
|
261
265
|
|
|
262
266
|
You can run this example by using the similar command line in Feature 2.
|
|
263
267
|
|
|
264
|
-
## Feature 4
|
|
265
|
-
|
|
266
|
-
> This feature is still under development. We are looking forward to your feedback! Contact us if you're interested in this feature.
|
|
268
|
+
## Feature 4(兼容已有脚本:通过前置脚本步骤到达特定层次)
|
|
267
269
|
|
|
268
270
|
Kea2 supports reusing existing Ui test Scripts. We are inspired by the idea that: *The existing Ui test scripts usually cover important app functionalities and can reach deep app states. Thus, they can be used as good "guiding scripts" to drive Fastbot to explore important and deep app states.*
|
|
269
271
|
|
|
@@ -271,22 +273,54 @@ For example, you may already have some existing Ui test scripts "login and add a
|
|
|
271
273
|
|
|
272
274
|
### Example
|
|
273
275
|
|
|
274
|
-
|
|
276
|
+
Here are four example scripts in hybridetest_examples, each corresponding to different forms of user scripts, showing you how to launch kea2 in the existing code.
|
|
275
277
|
|
|
276
|
-
|
|
278
|
+
Specifically:
|
|
277
279
|
|
|
278
|
-
|
|
280
|
+
* [u2_unittest_example.py](hybridtest_examples\u2_unittest_example.py) is a u2 script organized with unittest.
|
|
281
|
+
* [u2_pytest_example.py](hybridtest_examples\u2_pytest_example.py) is a u2 script organized with pytest.
|
|
282
|
+
* [appium_unittest_example.py](hybridtest_examples\appium_unittest_example.py) is an appium script organized with unittest.
|
|
283
|
+
* [appium_pytest_example.py](hybridtest_examples\appium_pytest_example.py) is an appium script organized with pytest.
|
|
279
284
|
|
|
280
|
-
|
|
285
|
+
Some notes:
|
|
281
286
|
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
287
|
+
1. You can control whether to execute the kea2-related code you have written by modifying the condition of 'if'. This allows you to easily enable or disable kea2 operations in the same script. Here we use environment variable as an example.
|
|
288
|
+
2. Since kea2 is driven by u2, if an appium-written script wants to launch kea2, it is necessary to first close the appium session. Remember to configure the parameter `"noReset": True` in `desired_caps` to avoid resetting the application when closing the session.
|
|
289
|
+
3. You need to insert the following code template into your existing test cases: Here, you can add your own hook logic in the commented sections, including starting or stopping the appium session, cleaning up instances, etc. This depends on how you want to design the setup and teardown. Apart from that, you only need to configure the `option` parameter and `configs_path` parameter(where your directory `configs` located, btw, `configs`'s location dependon where you executed `kea2 init`), then pass it to the `run_kea2_testing` function.
|
|
285
290
|
|
|
286
|
-
|
|
287
|
-
kea2
|
|
291
|
+
```python
|
|
292
|
+
from kea2 import Kea2Tester, Options, U2Driver
|
|
293
|
+
|
|
294
|
+
if os.environ.get('KEA2_HYBRID_MODE', '').lower() == 'true':
|
|
295
|
+
'''
|
|
296
|
+
Note: The if condition here can be modified as needed according to the actual
|
|
297
|
+
situation of the project, the form of environment variables is just an example.
|
|
298
|
+
'''
|
|
299
|
+
|
|
300
|
+
# close your driver session etc. here
|
|
301
|
+
# ...
|
|
302
|
+
|
|
303
|
+
tester = Kea2Tester()
|
|
304
|
+
result = self.tester.run_kea2_testing(
|
|
305
|
+
Options(
|
|
306
|
+
driverName="d",
|
|
307
|
+
packageNames=[PACKAGE_NAME],
|
|
308
|
+
propertytest_args=["discover", "-p", "Omninotes_Sample.py"],
|
|
309
|
+
serial=DEVICE_SERIAL,
|
|
310
|
+
running_mins=2,
|
|
311
|
+
maxStep=20
|
|
312
|
+
),
|
|
313
|
+
configs_path = None # Default, if your configs folder is located in the root directory, miss this.
|
|
314
|
+
)
|
|
315
|
+
|
|
316
|
+
# restart your driver session or clean instance here
|
|
317
|
+
# ...
|
|
318
|
+
|
|
319
|
+
return # this make your following steps of this testcase not work
|
|
288
320
|
```
|
|
289
321
|
|
|
322
|
+
|
|
323
|
+
|
|
290
324
|
## Test Reports(测试报告)
|
|
291
325
|
|
|
292
326
|
Kea2 automatically generates a HTML test report after each testing session. You can find the report in `output/` under your working directory.
|
|
@@ -379,7 +413,7 @@ kea2做了什么:
|
|
|
379
413
|
|
|
380
414
|
> Guided, Stochastic Model-Based GUI Testing of Android Apps. ESEC/FSE 2017. [pdf](https://dl.acm.org/doi/10.1145/3106237.3106298)
|
|
381
415
|
|
|
382
|
-
|
|
416
|
+
## Maintainers/Contributors
|
|
383
417
|
|
|
384
418
|
Kea2 has been actively developed and maintained by the people in [ecnusse](https://github.com/ecnusse):
|
|
385
419
|
|
|
@@ -397,7 +431,13 @@ Kea2 has been actively developed and maintained by the people in [ecnusse](https
|
|
|
397
431
|
|
|
398
432
|
Kea2 has also received many valuable insights, advices, feedbacks and lessons shared by several industrial people from Bytedance ([Zhao Zhang](https://github.com/zhangzhao4444), Yuhui Su from the Fastbot team), OPay (Tiesong Liu), WeChat (Haochuan Lu, Yuetang Deng), Huawei, Xiaomi and etc. Kudos!
|
|
399
433
|
|
|
400
|
-
###
|
|
434
|
+
### Become a Contributor!
|
|
435
|
+
|
|
436
|
+
Kea2 is an open-source project and we are calling for more contributors to join us!
|
|
437
|
+
|
|
438
|
+
See [Developer guide](DEVELOP.md) for more details.
|
|
439
|
+
|
|
440
|
+
## Star History
|
|
401
441
|
|
|
402
442
|
[](https://www.star-history.com/#ecnusse/Kea2&Date)
|
|
403
443
|
|
|
@@ -11,8 +11,11 @@
|
|
|
11
11
|
|
|
12
12
|
Please contact Xixian Liang at [xixian@stu.ecnu.edu.cn](xixian@stu.ecnu.edu.cn) with your Wechat ID / QR code to be invited to the WeChat discussion group. Of course, we are also ready on GitHub to answer your questions/feedback.
|
|
13
13
|
|
|
14
|
-
|
|
15
|
-
[https://
|
|
14
|
+
#### Github repo [https://github.com/ecnusse/Kea2](https://github.com/ecnusse/Kea2)
|
|
15
|
+
#### Gitee mirror [https://gitee.com/XixianLiang/Kea2](https://gitee.com/XixianLiang/Kea2)
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
|
|
16
19
|
|
|
17
20
|
### [点击此处:查看中文文档](README_cn.md)
|
|
18
21
|
|
|
@@ -28,7 +31,7 @@ Please contact Xixian Liang at [xixian@stu.ecnu.edu.cn](xixian@stu.ecnu.edu.cn)
|
|
|
28
31
|
|
|
29
32
|
Kea2 is an easy-to-use tool for fuzzing mobile apps. Its key *novelty* is able to fuse automated UI testing with scripts (usually written by human), thus empowering automated UI testing with human intelligence for effectively finding *crashing bugs* as well as *non-crashing functional (logic) bugs*.
|
|
30
33
|
|
|
31
|
-
Kea2 is currently built on top of [Fastbot](https://github.com/bytedance/Fastbot_Android), *an industrial-strength automated UI testing tool*, and [uiautomator2](https://github.com/openatx/uiautomator2), *an easy-to-use and stable Android automation library*.
|
|
34
|
+
Kea2 is currently built on top of [Fastbot](https://github.com/ecnusse/Fastbot_Android) 3.0 (a modified/enhanced version of the original [FastBot](https://github.com/bytedance/Fastbot_Android) 2.0), *an industrial-strength automated UI testing tool from ByteDance*, and [uiautomator2](https://github.com/openatx/uiautomator2), *an easy-to-use and stable Android automation library*.
|
|
32
35
|
Kea2 currently targets [Android](https://en.wikipedia.org/wiki/Android_(operating_system)) apps.
|
|
33
36
|
|
|
34
37
|
## Novelty & Important features
|
|
@@ -75,7 +78,7 @@ Please let us know and willing to hear your feedback/questions if you are also u
|
|
|
75
78
|
Kea2 currently works with:
|
|
76
79
|
- [unittest](https://docs.python.org/3/library/unittest.html) as the testing framework to manage the scripts;
|
|
77
80
|
- [uiautomator2](https://github.com/openatx/uiautomator2) as the UI test driver;
|
|
78
|
-
- [Fastbot](https://github.com/bytedance/Fastbot_Android) as the backend automated UI testing tool.
|
|
81
|
+
- [Fastbot](https://github.com/bytedance/Fastbot_Android) as the backend automated UI testing tool.
|
|
79
82
|
|
|
80
83
|
In the future, Kea2 will be extended to support
|
|
81
84
|
- [pytest](https://docs.pytest.org/en/stable/), another popular python testing framework;
|
|
@@ -193,7 +196,7 @@ You can find the full example in script `quicktest.py`, and run this script with
|
|
|
193
196
|
|
|
194
197
|
```bash
|
|
195
198
|
# Launch Kea2 and load one single script quicktest.py.
|
|
196
|
-
kea2 run -p it.feio.android.omninotes.alpha --
|
|
199
|
+
kea2 run -p it.feio.android.omninotes.alpha --running-minutes 10 --throttle 200 --driver-name d propertytest discover -p quicktest.py
|
|
197
200
|
```
|
|
198
201
|
|
|
199
202
|
## Feature 3(运行增强版Fastbot:加入自动断言)
|
|
@@ -228,7 +231,8 @@ For the preceding always-holding property, we can write the following script to
|
|
|
228
231
|
)
|
|
229
232
|
def test_input_box(self):
|
|
230
233
|
|
|
231
|
-
# genenerate a random non-empty string (this is also property-based testing
|
|
234
|
+
# genenerate a random non-empty string (this is also property-based testing
|
|
235
|
+
# by feeding random text inputs!)
|
|
232
236
|
from hypothesis.strategies import text, ascii_letters
|
|
233
237
|
random_str = text(alphabet=ascii_letters).example()
|
|
234
238
|
|
|
@@ -246,9 +250,7 @@ For the preceding always-holding property, we can write the following script to
|
|
|
246
250
|
|
|
247
251
|
You can run this example by using the similar command line in Feature 2.
|
|
248
252
|
|
|
249
|
-
## Feature 4
|
|
250
|
-
|
|
251
|
-
> This feature is still under development. We are looking forward to your feedback! Contact us if you're interested in this feature.
|
|
253
|
+
## Feature 4(兼容已有脚本:通过前置脚本步骤到达特定层次)
|
|
252
254
|
|
|
253
255
|
Kea2 supports reusing existing Ui test Scripts. We are inspired by the idea that: *The existing Ui test scripts usually cover important app functionalities and can reach deep app states. Thus, they can be used as good "guiding scripts" to drive Fastbot to explore important and deep app states.*
|
|
254
256
|
|
|
@@ -256,22 +258,54 @@ For example, you may already have some existing Ui test scripts "login and add a
|
|
|
256
258
|
|
|
257
259
|
### Example
|
|
258
260
|
|
|
259
|
-
|
|
261
|
+
Here are four example scripts in hybridetest_examples, each corresponding to different forms of user scripts, showing you how to launch kea2 in the existing code.
|
|
260
262
|
|
|
261
|
-
|
|
263
|
+
Specifically:
|
|
262
264
|
|
|
263
|
-
|
|
265
|
+
* [u2_unittest_example.py](hybridtest_examples\u2_unittest_example.py) is a u2 script organized with unittest.
|
|
266
|
+
* [u2_pytest_example.py](hybridtest_examples\u2_pytest_example.py) is a u2 script organized with pytest.
|
|
267
|
+
* [appium_unittest_example.py](hybridtest_examples\appium_unittest_example.py) is an appium script organized with unittest.
|
|
268
|
+
* [appium_pytest_example.py](hybridtest_examples\appium_pytest_example.py) is an appium script organized with pytest.
|
|
264
269
|
|
|
265
|
-
|
|
270
|
+
Some notes:
|
|
266
271
|
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
272
|
+
1. You can control whether to execute the kea2-related code you have written by modifying the condition of 'if'. This allows you to easily enable or disable kea2 operations in the same script. Here we use environment variable as an example.
|
|
273
|
+
2. Since kea2 is driven by u2, if an appium-written script wants to launch kea2, it is necessary to first close the appium session. Remember to configure the parameter `"noReset": True` in `desired_caps` to avoid resetting the application when closing the session.
|
|
274
|
+
3. You need to insert the following code template into your existing test cases: Here, you can add your own hook logic in the commented sections, including starting or stopping the appium session, cleaning up instances, etc. This depends on how you want to design the setup and teardown. Apart from that, you only need to configure the `option` parameter and `configs_path` parameter(where your directory `configs` located, btw, `configs`'s location dependon where you executed `kea2 init`), then pass it to the `run_kea2_testing` function.
|
|
270
275
|
|
|
271
|
-
|
|
272
|
-
kea2
|
|
276
|
+
```python
|
|
277
|
+
from kea2 import Kea2Tester, Options, U2Driver
|
|
278
|
+
|
|
279
|
+
if os.environ.get('KEA2_HYBRID_MODE', '').lower() == 'true':
|
|
280
|
+
'''
|
|
281
|
+
Note: The if condition here can be modified as needed according to the actual
|
|
282
|
+
situation of the project, the form of environment variables is just an example.
|
|
283
|
+
'''
|
|
284
|
+
|
|
285
|
+
# close your driver session etc. here
|
|
286
|
+
# ...
|
|
287
|
+
|
|
288
|
+
tester = Kea2Tester()
|
|
289
|
+
result = self.tester.run_kea2_testing(
|
|
290
|
+
Options(
|
|
291
|
+
driverName="d",
|
|
292
|
+
packageNames=[PACKAGE_NAME],
|
|
293
|
+
propertytest_args=["discover", "-p", "Omninotes_Sample.py"],
|
|
294
|
+
serial=DEVICE_SERIAL,
|
|
295
|
+
running_mins=2,
|
|
296
|
+
maxStep=20
|
|
297
|
+
),
|
|
298
|
+
configs_path = None # Default, if your configs folder is located in the root directory, miss this.
|
|
299
|
+
)
|
|
300
|
+
|
|
301
|
+
# restart your driver session or clean instance here
|
|
302
|
+
# ...
|
|
303
|
+
|
|
304
|
+
return # this make your following steps of this testcase not work
|
|
273
305
|
```
|
|
274
306
|
|
|
307
|
+
|
|
308
|
+
|
|
275
309
|
## Test Reports(测试报告)
|
|
276
310
|
|
|
277
311
|
Kea2 automatically generates a HTML test report after each testing session. You can find the report in `output/` under your working directory.
|
|
@@ -364,7 +398,7 @@ kea2做了什么:
|
|
|
364
398
|
|
|
365
399
|
> Guided, Stochastic Model-Based GUI Testing of Android Apps. ESEC/FSE 2017. [pdf](https://dl.acm.org/doi/10.1145/3106237.3106298)
|
|
366
400
|
|
|
367
|
-
|
|
401
|
+
## Maintainers/Contributors
|
|
368
402
|
|
|
369
403
|
Kea2 has been actively developed and maintained by the people in [ecnusse](https://github.com/ecnusse):
|
|
370
404
|
|
|
@@ -382,7 +416,13 @@ Kea2 has been actively developed and maintained by the people in [ecnusse](https
|
|
|
382
416
|
|
|
383
417
|
Kea2 has also received many valuable insights, advices, feedbacks and lessons shared by several industrial people from Bytedance ([Zhao Zhang](https://github.com/zhangzhao4444), Yuhui Su from the Fastbot team), OPay (Tiesong Liu), WeChat (Haochuan Lu, Yuetang Deng), Huawei, Xiaomi and etc. Kudos!
|
|
384
418
|
|
|
385
|
-
###
|
|
419
|
+
### Become a Contributor!
|
|
420
|
+
|
|
421
|
+
Kea2 is an open-source project and we are calling for more contributors to join us!
|
|
422
|
+
|
|
423
|
+
See [Developer guide](DEVELOP.md) for more details.
|
|
424
|
+
|
|
425
|
+
## Star History
|
|
386
426
|
|
|
387
427
|
[](https://www.star-history.com/#ecnusse/Kea2&Date)
|
|
388
428
|
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -95,13 +95,12 @@ def cmd_merge(args):
|
|
|
95
95
|
# Merge test reports
|
|
96
96
|
merged_report = merger.merge_reports(args.paths, args.output)
|
|
97
97
|
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
print(f"📈 Merged {merge_summary.get('merged_directories', 0)} directories", flush=True)
|
|
98
|
+
if merged_report is not None:
|
|
99
|
+
print(f"✅ Test reports merged successfully!", flush=True)
|
|
100
|
+
print(f"📊 Merged report: {merged_report}", flush=True)
|
|
101
|
+
# Get merge summary
|
|
102
|
+
merge_summary = merger.get_merge_summary()
|
|
103
|
+
print(f"📈 Merged {merge_summary.get('merged_directories', 0)} directories", flush=True)
|
|
105
104
|
|
|
106
105
|
except Exception as e:
|
|
107
106
|
logger.error(f"Error during merge operation: {e}")
|
|
@@ -41,62 +41,12 @@ class FastbotManager:
|
|
|
41
41
|
:params: port: the listening port for script driver
|
|
42
42
|
:return: the fastbot daemon thread
|
|
43
43
|
"""
|
|
44
|
-
cur_dir = Path(__file__).parent
|
|
45
|
-
self.dev.sync.push(
|
|
46
|
-
Path.joinpath(cur_dir, "assets/monkeyq.jar"),
|
|
47
|
-
"/sdcard/monkeyq.jar"
|
|
48
|
-
)
|
|
49
|
-
self.dev.sync.push(
|
|
50
|
-
Path.joinpath(cur_dir, "assets/fastbot-thirdpart.jar"),
|
|
51
|
-
"/sdcard/fastbot-thirdpart.jar",
|
|
52
|
-
)
|
|
53
|
-
self.dev.sync.push(
|
|
54
|
-
Path.joinpath(cur_dir, "assets/kea2-thirdpart.jar"),
|
|
55
|
-
"/sdcard/kea2-thirdpart.jar",
|
|
56
|
-
)
|
|
57
|
-
self.dev.sync.push(
|
|
58
|
-
Path.joinpath(cur_dir, "assets/framework.jar"),
|
|
59
|
-
"/sdcard/framework.jar",
|
|
60
|
-
)
|
|
61
|
-
self.dev.sync.push(
|
|
62
|
-
Path.joinpath(cur_dir, "assets/fastbot_libs/arm64-v8a/libfastbot_native.so"),
|
|
63
|
-
"/data/local/tmp/arm64-v8a/libfastbot_native.so",
|
|
64
|
-
)
|
|
65
|
-
self.dev.sync.push(
|
|
66
|
-
Path.joinpath(cur_dir, "assets/fastbot_libs/armeabi-v7a/libfastbot_native.so"),
|
|
67
|
-
"/data/local/tmp/armeabi-v7a/libfastbot_native.so",
|
|
68
|
-
)
|
|
69
|
-
self.dev.sync.push(
|
|
70
|
-
Path.joinpath(cur_dir, "assets/fastbot_libs/x86/libfastbot_native.so"),
|
|
71
|
-
"/data/local/tmp/x86/libfastbot_native.so",
|
|
72
|
-
)
|
|
73
|
-
self.dev.sync.push(
|
|
74
|
-
Path.joinpath(cur_dir, "assets/fastbot_libs/x86_64/libfastbot_native.so"),
|
|
75
|
-
"/data/local/tmp/x86_64/libfastbot_native.so",
|
|
76
|
-
)
|
|
77
|
-
|
|
78
|
-
cwd = getProjectRoot()
|
|
79
|
-
whitelist = self.options.act_whitelist_file
|
|
80
|
-
blacklist = self.options.act_blacklist_file
|
|
81
|
-
if bool(whitelist) ^ bool(blacklist):
|
|
82
|
-
if whitelist:
|
|
83
|
-
file_to_push = cwd / 'configs' / 'awl.strings'
|
|
84
|
-
remote_path = whitelist
|
|
85
|
-
else:
|
|
86
|
-
file_to_push = cwd / 'configs' / 'abl.strings'
|
|
87
|
-
remote_path = blacklist
|
|
88
|
-
|
|
89
|
-
self.dev.sync.push(
|
|
90
|
-
file_to_push,
|
|
91
|
-
remote_path
|
|
92
|
-
)
|
|
93
44
|
|
|
45
|
+
self._push_libs()
|
|
94
46
|
t = self._startFastbotService()
|
|
95
47
|
logger.info("Running Fastbot...")
|
|
96
|
-
|
|
97
48
|
return t
|
|
98
49
|
|
|
99
|
-
|
|
100
50
|
def check_alive(self):
|
|
101
51
|
"""
|
|
102
52
|
check if the script driver and proxy server are alive.
|
|
@@ -183,6 +133,58 @@ class FastbotManager:
|
|
|
183
133
|
@property
|
|
184
134
|
def device_output_dir(self):
|
|
185
135
|
return self._device_output_dir
|
|
136
|
+
|
|
137
|
+
def _push_libs(self):
|
|
138
|
+
logger.info("Pushing Fastbot libraries to device...")
|
|
139
|
+
cur_dir = Path(__file__).parent
|
|
140
|
+
self.dev.sync.push(
|
|
141
|
+
Path.joinpath(cur_dir, "assets/monkeyq.jar"),
|
|
142
|
+
"/sdcard/monkeyq.jar"
|
|
143
|
+
)
|
|
144
|
+
self.dev.sync.push(
|
|
145
|
+
Path.joinpath(cur_dir, "assets/fastbot-thirdpart.jar"),
|
|
146
|
+
"/sdcard/fastbot-thirdpart.jar",
|
|
147
|
+
)
|
|
148
|
+
self.dev.sync.push(
|
|
149
|
+
Path.joinpath(cur_dir, "assets/kea2-thirdpart.jar"),
|
|
150
|
+
"/sdcard/kea2-thirdpart.jar",
|
|
151
|
+
)
|
|
152
|
+
self.dev.sync.push(
|
|
153
|
+
Path.joinpath(cur_dir, "assets/framework.jar"),
|
|
154
|
+
"/sdcard/framework.jar",
|
|
155
|
+
)
|
|
156
|
+
self.dev.sync.push(
|
|
157
|
+
Path.joinpath(cur_dir, "assets/fastbot_libs/arm64-v8a/libfastbot_native.so"),
|
|
158
|
+
"/data/local/tmp/arm64-v8a/libfastbot_native.so",
|
|
159
|
+
)
|
|
160
|
+
self.dev.sync.push(
|
|
161
|
+
Path.joinpath(cur_dir, "assets/fastbot_libs/armeabi-v7a/libfastbot_native.so"),
|
|
162
|
+
"/data/local/tmp/armeabi-v7a/libfastbot_native.so",
|
|
163
|
+
)
|
|
164
|
+
self.dev.sync.push(
|
|
165
|
+
Path.joinpath(cur_dir, "assets/fastbot_libs/x86/libfastbot_native.so"),
|
|
166
|
+
"/data/local/tmp/x86/libfastbot_native.so",
|
|
167
|
+
)
|
|
168
|
+
self.dev.sync.push(
|
|
169
|
+
Path.joinpath(cur_dir, "assets/fastbot_libs/x86_64/libfastbot_native.so"),
|
|
170
|
+
"/data/local/tmp/x86_64/libfastbot_native.so",
|
|
171
|
+
)
|
|
172
|
+
|
|
173
|
+
cwd = getProjectRoot()
|
|
174
|
+
whitelist = self.options.act_whitelist_file
|
|
175
|
+
blacklist = self.options.act_blacklist_file
|
|
176
|
+
if bool(whitelist) ^ bool(blacklist):
|
|
177
|
+
if whitelist:
|
|
178
|
+
file_to_push = cwd / 'configs' / 'awl.strings'
|
|
179
|
+
remote_path = whitelist
|
|
180
|
+
else:
|
|
181
|
+
file_to_push = cwd / 'configs' / 'abl.strings'
|
|
182
|
+
remote_path = blacklist
|
|
183
|
+
|
|
184
|
+
self.dev.sync.push(
|
|
185
|
+
file_to_push,
|
|
186
|
+
remote_path
|
|
187
|
+
)
|
|
186
188
|
|
|
187
189
|
def _startFastbotService(self) -> ADBStreamShell_V2:
|
|
188
190
|
shell_command = [
|