-
-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy pathtest_app_size.py
114 lines (92 loc) · 5.63 KB
/
test_app_size.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
"""
Tests for app size ot {N} apps.
"""
import logging
import os
import unittest
from core.base_test.tns_test import TnsTest
from core.enums.os_type import OSType
from core.settings import Settings
from core.utils.file_utils import File, Folder
from core.utils.perf_utils import PerfUtils
from core.utils.run import run
from core.utils.docker import Docker
from data.templates import Template
from products.nativescript.tns import Tns
from products.nativescript.tns_paths import TnsPaths
class AppSizeTests(TnsTest):
js_app = Settings.AppName.DEFAULT + 'JS'
ng_app = Settings.AppName.DEFAULT + 'NG'
@classmethod
def setUpClass(cls):
TnsTest.setUpClass()
Docker.start()
# Create JS app and copy to temp data folder
Tns.create(app_name=cls.js_app, template=Template.HELLO_WORLD_JS.local_package, update=True)
Tns.platform_add_android(app_name=cls.js_app, framework_path=Settings.Android.FRAMEWORK_PATH)
if Settings.HOST_OS is OSType.OSX:
Tns.platform_add_ios(app_name=cls.js_app, framework_path=Settings.IOS.FRAMEWORK_PATH)
# Create NG app and copy to temp data folder
Tns.create(app_name=cls.ng_app, template=Template.HELLO_WORLD_NG.local_package, update=True)
Tns.platform_add_android(app_name=cls.ng_app, framework_path=Settings.Android.FRAMEWORK_PATH)
if Settings.HOST_OS is OSType.OSX:
Tns.platform_add_ios(app_name=cls.ng_app, framework_path=Settings.IOS.FRAMEWORK_PATH)
# Build apps
Tns.build_android(cls.js_app, release=True, bundle=True, aot=True, uglify=True, snapshot=True)
Tns.build_android(cls.ng_app, release=True, bundle=True, aot=True, uglify=True, snapshot=True)
if Settings.HOST_OS == OSType.OSX:
Tns.build_ios(cls.js_app, release=True, bundle=True, aot=True, uglify=True, for_device=True)
Tns.build_ios(cls.ng_app, release=True, bundle=True, aot=True, uglify=True, for_device=True)
@classmethod
def tearDownClass(cls):
TnsTest.tearDownClass()
Docker.stop()
def test_001_js_app_app_resources(self):
folder = os.path.join(TnsPaths.get_app_path(app_name=self.js_app), 'app')
assert PerfUtils.is_value_in_range(actual=Folder.get_size(folder), expected=1268131, tolerance=0.1)
def test_002_js_app_node_modules(self):
folder = os.path.join(TnsPaths.get_app_path(app_name=self.js_app), 'node_modules')
assert PerfUtils.is_value_in_range(actual=Folder.get_size(folder), expected=58628036, tolerance=0.1)
def test_003_js_app_apk(self):
# Extract APK
apk = TnsPaths.get_apk_path(app_name=self.js_app, release=True)
extracted_apk = os.path.join(Settings.TEST_OUT_TEMP, 'js-apk')
File.unzip(file_path=apk, dest_dir=extracted_apk)
res = os.path.join(extracted_apk, 'res')
assets_app = os.path.join(extracted_apk, 'assets', 'app')
assets_snapshots = os.path.join(extracted_apk, 'assets', 'snapshots')
lib = os.path.join(extracted_apk, 'lib')
run(cmd='du -hs *', cwd=lib, wait=True, log_level=logging.INFO)
# Verify content of APK
assert PerfUtils.is_value_in_range(actual=Folder.get_size(lib), expected=51992248, tolerance=0.05)
assert PerfUtils.is_value_in_range(actual=Folder.get_size(res), expected=796627, tolerance=0.05)
assert PerfUtils.is_value_in_range(actual=Folder.get_size(assets_app), expected=1210914, tolerance=0.05)
assert PerfUtils.is_value_in_range(actual=Folder.get_size(assets_snapshots), expected=10621384, tolerance=0.05)
# Verify final apk size
assert PerfUtils.is_value_in_range(actual=File.get_size(apk), expected=24304589, tolerance=0.03)
@unittest.skipIf(Settings.HOST_OS != OSType.OSX, 'iOS tests can be executed only on macOS.')
def test_102_js_app_ipa(self):
ipa = TnsPaths.get_ipa_path(app_name=self.js_app, release=True, for_device=True)
assert PerfUtils.is_value_in_range(actual=File.get_size(ipa), expected=14465180, tolerance=0.02)
def test_100_ng_app_app_resources(self):
app_folder = os.path.join(TnsPaths.get_app_path(app_name=self.ng_app), 'App_Resources')
assert PerfUtils.is_value_in_range(actual=Folder.get_size(app_folder), expected=1262699, tolerance=0.1)
def test_101_ng_app_node_modules(self):
app_folder = os.path.join(TnsPaths.get_app_path(app_name=self.ng_app), 'node_modules')
assert PerfUtils.is_value_in_range(actual=Folder.get_size(app_folder), expected=210482662, tolerance=0.1)
def test_102_ng_app_apk(self):
# Extract APK
apk = TnsPaths.get_apk_path(app_name=self.ng_app, release=True)
extracted_apk = os.path.join(Settings.TEST_OUT_TEMP, 'ng-apk')
File.unzip(file_path=apk, dest_dir=extracted_apk)
assets_app = os.path.join(extracted_apk, 'assets', 'app')
assets_snapshots = os.path.join(extracted_apk, 'assets', 'snapshots')
# No asserts for lib and res, since it is same as JS project
assert PerfUtils.is_value_in_range(actual=Folder.get_size(assets_app), expected=1991318, tolerance=0.05)
assert PerfUtils.is_value_in_range(actual=Folder.get_size(assets_snapshots), expected=21822104, tolerance=0.05)
# Verify final apk size
assert PerfUtils.is_value_in_range(actual=File.get_size(apk), expected=26988067, tolerance=0.03)
@unittest.skipIf(Settings.HOST_OS != OSType.OSX, 'iOS tests can be executed only on macOS.')
def test_102_ng_app_ipa(self):
ipa = TnsPaths.get_ipa_path(app_name=self.ng_app, release=True, for_device=True)
assert PerfUtils.is_value_in_range(actual=File.get_size(ipa), expected=14672899, tolerance=0.02)