tabbyx 0.1.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (40) hide show
  1. checksums.yaml +7 -0
  2. data/bin/console +14 -0
  3. data/bin/setup +8 -0
  4. data/lib/tabbyx.rb +29 -0
  5. data/lib/tabbyx/calabash_android.rb +11 -0
  6. data/lib/tabbyx/calabash_ios.rb +4 -0
  7. data/lib/tabbyx/core/base.rb +54 -0
  8. data/lib/tabbyx/core/config.rb +36 -0
  9. data/lib/tabbyx/core/initialize.rb +35 -0
  10. data/lib/tabbyx/fixtures/constants.rb +21 -0
  11. data/lib/tabbyx/fixtures/global.rb +39 -0
  12. data/lib/tabbyx/helpers/csv_helper.rb +65 -0
  13. data/lib/tabbyx/helpers/debug_helper.rb +37 -0
  14. data/lib/tabbyx/helpers/excel_helper.rb +79 -0
  15. data/lib/tabbyx/helpers/http_batch_handler.rb +50 -0
  16. data/lib/tabbyx/helpers/http_helper.rb +46 -0
  17. data/lib/tabbyx/helpers/minitest_helper.rb +48 -0
  18. data/lib/tabbyx/helpers/screenshot_helpers.rb +128 -0
  19. data/lib/tabbyx/helpers/txt_helper.rb +35 -0
  20. data/lib/tabbyx/steps_android/assert_steps.rb +31 -0
  21. data/lib/tabbyx/steps_android/check_box_steps.rb +3 -0
  22. data/lib/tabbyx/steps_android/context_menu_steps.rb +17 -0
  23. data/lib/tabbyx/steps_android/date_picker_steps.rb +8 -0
  24. data/lib/tabbyx/steps_android/enter_text_steps.rb +23 -0
  25. data/lib/tabbyx/steps_android/location_steps.rb +7 -0
  26. data/lib/tabbyx/steps_android/navigation_steps.rb +47 -0
  27. data/lib/tabbyx/steps_android/press_button_steps.rb +39 -0
  28. data/lib/tabbyx/steps_android/progress_steps.rb +51 -0
  29. data/lib/tabbyx/steps_android/search_steps.rb +7 -0
  30. data/lib/tabbyx/steps_android/spinner_steps.rb +11 -0
  31. data/lib/tabbyx/steps_ios/assertions.rb +79 -0
  32. data/lib/tabbyx/steps_ios/date_picker.rb +39 -0
  33. data/lib/tabbyx/steps_ios/operations.rb +187 -0
  34. data/lib/tabbyx/steps_ios/wait.rb +48 -0
  35. data/lib/tabbyx/utils/adb_devices.rb +248 -0
  36. data/lib/tabbyx/utils/adb_screenshot.rb +22 -0
  37. data/lib/tabbyx/utils/code_coverage.rb +6 -0
  38. data/lib/tabbyx/utils/shell.rb +32 -0
  39. data/lib/tabbyx/version.rb +3 -0
  40. metadata +286 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: d5f561c10b7d01338e3ac087878c9ef7e3a07381
4
+ data.tar.gz: 940d701ff81724a79638e4341cef3e750958ad8e
5
+ SHA512:
6
+ metadata.gz: 7dc32fb6e82ab1c7a6cf319a3465523b8ca330c75ab8e57f2547217493e4bf7618a0e69e059de921f4399bcbd3a7f2595cbe5b0f14b3a432836b75f0af29fc5b
7
+ data.tar.gz: a4f70a93ff08205644694606429f60c187e73e702901b43f9cc862c62046d81408b6a1d657a752a8fde211156072173e6ad9cf9d8d1d142cf8ba78819a7ee9a4
data/bin/console ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "tabbyx"
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ # require "pry"
11
+ # Pry.start
12
+
13
+ require "irb"
14
+ IRB.start(__FILE__)
data/bin/setup ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
data/lib/tabbyx.rb ADDED
@@ -0,0 +1,29 @@
1
+ require "tabbyx/version"
2
+
3
+
4
+ require 'tabbyx/core/base'
5
+ require 'tabbyx/core/initialize'
6
+ require 'tabbyx/core/config'
7
+
8
+ require 'tabbyx/fixtures/constants'
9
+ require 'tabbyx/fixtures/global'
10
+
11
+ # helpers
12
+ require 'tabbyx/helpers/http_helper'
13
+ require 'tabbyx/helpers/csv_helper'
14
+ require 'tabbyx/helpers/excel_helper'
15
+ require 'tabbyx/helpers/txt_helper'
16
+ require 'tabbyx/helpers/screenshot_helpers'
17
+
18
+ # support
19
+ require 'tabbyx/utils/code_coverage'
20
+
21
+ # utilities
22
+ require 'tabbyx/utils/shell'
23
+ require 'tabbyx/utils/adb_devices'
24
+ require 'tabbyx/utils/adb_screenshot'
25
+
26
+
27
+ module Tabbyx
28
+ # Your code goes here...
29
+ end
@@ -0,0 +1,11 @@
1
+ require 'tabbyx/steps_android/assert_steps'
2
+ require 'tabbyx/steps_android/check_box_steps'
3
+ require 'tabbyx/steps_android/context_menu_steps'
4
+ require 'tabbyx/steps_android/date_picker_steps'
5
+ require 'tabbyx/steps_android/enter_text_steps'
6
+ require 'tabbyx/steps_android/location_steps'
7
+ require 'tabbyx/steps_android/navigation_steps'
8
+ require 'tabbyx/steps_android/press_button_steps'
9
+ require 'tabbyx/steps_android/progress_steps'
10
+ require 'tabbyx/steps_android/search_steps'
11
+ require 'tabbyx/steps_android/spinner_steps'
@@ -0,0 +1,4 @@
1
+ require 'tabbyx/steps_ios/assertions'
2
+ require 'tabbyx/steps_ios/date_picker'
3
+ require 'tabbyx/steps_ios/operations'
4
+ require 'tabbyx/steps_ios/wait'
@@ -0,0 +1,54 @@
1
+ require 'yaml'
2
+ require 'tabbyx/fixtures/constants'
3
+
4
+
5
+ module Base
6
+
7
+ # load all yaml files in config folder
8
+ def Base::load_yamls
9
+ config = File.absolute_path(CONFIG_PATH)
10
+ Dir[File.join(config, '*.yml')].map {|file| [File.basename(file, '.yml').to_s, YAML.load_file(file)]}
11
+ end
12
+
13
+ def Base::read_yaml(filename)
14
+ path = File.absolute_path(CONFIG_PATH)
15
+ file = File.join(path,"config","#{filename}.yml")
16
+ # puts file
17
+ if File.exist?(file)
18
+ YAML.load_file(file)
19
+ else
20
+ warn('cannot find the yaml file '+ filename)
21
+ end
22
+ end
23
+
24
+ def Base::create_directory(directory_name, path= INPUT_PATH)
25
+ path = File.absolute_path(path)
26
+ directory = File.join(path,"#{directory_name}")
27
+ unless File.directory?(directory)
28
+ Dir.mkdir(directory)
29
+ end
30
+ end
31
+
32
+ def self.create_file(file_name, file_path= INPUT_PATH)
33
+ path = File.absolute_path(file_path)
34
+ file = File.join(path,file_name)
35
+ unless File.exist?(file)
36
+ puts "create file..."
37
+ File.new(file, "a+")
38
+ end
39
+ file
40
+ end
41
+
42
+ def self.file_exists?(filename, file_path= INPUT_PATH)
43
+ path = File.absolute_path(file_path)
44
+ file = File.join(path, filename)
45
+ File.exist?(file) ? file : nil
46
+ end
47
+
48
+ def self.file(filename,file_path= INPUT_PATH)
49
+ path = File.absolute_path(file_path)
50
+ File.join(path, filename)
51
+ end
52
+
53
+ end
54
+
@@ -0,0 +1,36 @@
1
+ require 'tabbyx/core/base'
2
+
3
+ class Hash
4
+ def stringify
5
+ inject({}) do |options, (key, value)|
6
+ options[key.to_s] = value.to_s
7
+ options
8
+ end
9
+ end
10
+ end
11
+
12
+ module Config
13
+ def Config::read_config(product, server, target)
14
+
15
+ users_yml = Base.read_yaml('users')
16
+ hosts_yml = Base.read_yaml('hosts')
17
+ server_yml = Base.read_yaml('server')
18
+ password_yml = Base.read_yaml('passwords')
19
+ app_yml = Base.read_yaml('app')
20
+ device_yml = Base.read_yaml('devices')
21
+ config = {
22
+ :server => (Base.read_yaml('server')[server] if server_yml),
23
+ :user => (Base.read_yaml('users')[product][server] if users_yml),
24
+ :password => (Base.read_yaml('passwords')[server] if password_yml),
25
+ :app => (Base.read_yaml('app')[product] if app_yml),
26
+ :device => (Base.read_yaml('devices')[target] if device_yml),
27
+ :host => (Base.read_yaml('hosts')[product][server] if hosts_yml),
28
+ }
29
+
30
+ # Make sure everything is strings
31
+ config.each do |key, value|
32
+ config[key] = value.stringify if value.respond_to?(:stringify)
33
+ end
34
+ end
35
+
36
+ end
@@ -0,0 +1,35 @@
1
+ require 'tabbyx/core/base'
2
+
3
+ module Tabby
4
+
5
+ def self.page(class_name)
6
+ class_name.new()
7
+ end
8
+
9
+ def self.initialize_project
10
+ Base.create_directory("apps",ROOT_PATH)
11
+ Base.create_directory("screenshots",ROOT_PATH)
12
+ Base.create_directory("reports",ROOT_PATH)
13
+ # Base.create_directory("inputs",ROOT_PATH)
14
+ # Base.create_directory("outputs",ROOT_PATH)
15
+ Base.create_directory("testcases",ROOT_PATH)
16
+ Base.create_directory("testsuites",ROOT_PATH+"features/")
17
+
18
+ if ENV['PLATFORM'] == 'android'
19
+ Base.create_directory("pages",ROOT_PATH+"features/android/")
20
+ Base.create_file("pages.rb",ROOT_PATH+"features/android/support")
21
+ end
22
+
23
+ if ENV['PLATFORM'] == 'ios'
24
+ Base.create_directory("pages",ROOT_PATH+"features/ios/")
25
+ Base.create_file("pages.rb",ROOT_PATH+"features/ios/support")
26
+ end
27
+
28
+ if ENV['PLATFORM'] == 'web'
29
+ Base.create_directory("pages",ROOT_PATH+"features/web/")
30
+ Base.create_file("pages.rb",ROOT_PATH+"features/web/support")
31
+ end
32
+ end
33
+
34
+
35
+ end
@@ -0,0 +1,21 @@
1
+
2
+ # Wait durations
3
+ NORMAL_SLEEP_SECS = 2
4
+ MID_SLEEP_SECS = 5
5
+ MAX_SLEEP_SECS = 10
6
+ MAX_WAIT_SECS = 30
7
+ MAX_TIME_OUT = 180
8
+ MAX_RETRY_TIMES = 3
9
+
10
+ # for web
11
+ MIN_WAIT = 3
12
+ MID_WAIT = 5
13
+ MAX_WAIT = 10
14
+ WAIT_TIME_OUT = 60
15
+ NETWORK_WAIT = 5
16
+
17
+
18
+ ENV['ROOT_PATH'] ? ROOT_PATH = ENV['ROOT_PATH'] : ROOT_PATH = ""
19
+ ENV['CONFIG_PATH']? CONFIG_PATH = ENV['CONFIG_PATH'] : CONFIG_PATH = ""
20
+ ENV['INPUT_PATH'] ? INPUT_PATH = ENV['INPUT_PATH'] : INPUT_PATH = ""
21
+ ENV['SCREENSHOT_TEMP'] ? SCREENSHOT_TEMP = ENV['SCREENSHOT_TEMP'] : SCREENSHOT_TEMP = ""
@@ -0,0 +1,39 @@
1
+ require 'tabbyx/core/config'
2
+
3
+ # Default settings in case environment variables hasn't been set
4
+ ENV['SERVER'] = 'uat' if ENV['SERVER'].nil?
5
+ ENV['PRODUCT'] = 'sample' if ENV['PRODUCT'].nil?
6
+ ENV['TARGET'] = 'iossimulator' if ENV['TARGET'].nil?
7
+ ENV['BROWSER'] = 'chrome' if ENV['BROWSER'].nil?
8
+
9
+ ENV['CONNECT_TIMEOUT'] = '90' if ENV['CONNECT_TIMEOUT'].nil?
10
+
11
+ # Always use downcase
12
+ ENV['SERVER'] = ENV['SERVER'].downcase
13
+ ENV['PRODUCT'] = ENV['PRODUCT'].downcase
14
+ ENV['TARGET'] = ENV['TARGET'].downcase
15
+ ENV['BROWSER'] = ENV['BROWSER'].downcase
16
+
17
+ # Read the configuration files
18
+ puts "Configuring for product #{ENV['PRODUCT']}, environment #{ENV['SERVER']}"
19
+ warn("please check support/env.rb to make sure product and environment should be correct!!!")
20
+
21
+ config = Config.read_config(ENV['PRODUCT'], ENV['SERVER'], ENV['TARGET'])
22
+
23
+ # Setup global constants
24
+ SERVER = config[:server]
25
+ USER = config[:user]
26
+ PASSWORD = config[:password]
27
+ APP = config[:app]
28
+ DEVICE = config[:device]
29
+ HOST = config[:host]
30
+
31
+ puts USER, APP, HOST
32
+
33
+ warn("请配置测试账户信息!") unless USER
34
+ warn("请配置app信息!") unless APP
35
+ warn("请配置当前项目的host!") unless HOST
36
+
37
+ # Relevant configurations for API Testing
38
+ USER_AGENT = "QDReaderAppStore/3.7.3 (iPhone; iOS 9.3; Scale/2.00)"
39
+ COOKIE = "QDHeader=NzRiMjdkYzIxMmY2NjNlYmRlNWI2NzdkY2RkYzRmNWJ8My43LjN8NzUwfDEzMzR8UWlZZXw5LjMwfDV8aVBob25lIE9TL2lQaG9uZS94ODZfNjR8MTY0fFFpWWV8Mw==; _ga=GA1.2.207823887.1473851687; cmfuToken=N((cfBPzO963RhWhcOx2uGENWANvs2qlZ4zKVpEK8Tlo1RKq3oztfJ4onZu5bFWY3-a4XjIMPYkQOmqWfUrob5VIX1i7EQP6OP6TaPc9tWnPtMxigj0_wm4hU3rxDO24U-ewbhHaG_Ibeca9uUrJXCZe9JkwBizrFwDXUJoCGAMbQPTJwGekSHeQeJWMJF0OlJzPmLXmcIHeoxQ_hrACayIuQTxkLaSAXwBUjkXdzXukBQXW7P5nVMQkkHvTfhs8WajMOuPuv5X1hh9I_M0xNG2CbtyChJBVxvVSKf8_yDOxHaLdEvglmHAEg2; stat_gid=8208333844"
@@ -0,0 +1,65 @@
1
+ require 'csv'
2
+ require 'tabbyx/core/base'
3
+
4
+ module CSVhelper
5
+
6
+ def self.read_from_csv(filename)
7
+ file = Base.file_exists?(filename)
8
+ sheet = CSV.read(file)
9
+ sheet
10
+ end
11
+
12
+
13
+ # example: CSVhelper.read_specified_cell("api_testcases.csv",2,2)
14
+ def self.read_specified_cell(filename,row,column)
15
+ sheet = read_from_csv(filename)
16
+ sheet[row][column]
17
+ end
18
+
19
+
20
+ # example:
21
+ # h = { 'dog' => 'canine', 'cat' => 'feline', 'donkey' => 'asinine' }
22
+ # CSVhelper.write_hash_to_csv(h,"test.csv")
23
+ def self.write_hash_to_csv(hash,filename)
24
+ Base.file_exists?(filename) ? file = Base.file_exists?(filename) : file = Base.create_file(filename)
25
+ CSV.open(file, "wb") {|csv| hash.to_a.each {|elem| csv << elem} }
26
+ end
27
+
28
+
29
+ # example:
30
+ # arr = ["test", "test2", "test3"]
31
+ # CSVhelper.write_array_to_csv(arr,"test_ar.csv")
32
+ def self.write_array_to_csv(array,filename)
33
+ Base.file_exists?(filename) ? file = Base.file_exists?(filename) : file = Base.create_file(filename)
34
+ CSV.open(file, "wb") do |csv|
35
+ csv << array
36
+ end
37
+ end
38
+
39
+
40
+ # example:
41
+ # dic = [["test", "test2", "test3"],["test", "test2", "test3"],["test", "test2", "test3"]]
42
+ # CSVhelper.write_dictionary_to_csv(dic, "test_dic.csv")
43
+ def self.write_dictionary_to_csv(dic,filename)
44
+ Base.file_exists?(filename) ? file = Base.file_exists?(filename) : file = Base.create_file(filename)
45
+ CSV.open(file, "wb") do |csv|
46
+ dic.each do |data|
47
+ csv << data
48
+ end
49
+ end
50
+ end
51
+
52
+
53
+ # example: CSVhelper.append_to_row_end("api_testcases.csv",2,"pass")
54
+ def self.append_to_row_end(filename,row,value)
55
+ file = Base.file_exists?(filename)
56
+ original_data = CSV.parse(File.read(file)) if Base.file_exists?(filename)
57
+ original_data[row] << value
58
+ CSV.open(file, "wb") do |csv|
59
+ original_data.each do |data|
60
+ csv << data
61
+ end
62
+ end
63
+ end
64
+
65
+ end
@@ -0,0 +1,37 @@
1
+ require 'tabbyx/utils/adb_devices'
2
+
3
+ # information of the connected devices
4
+ puts ADBDevices.adb_devices
5
+ puts ADBDevices.get_device_id
6
+ puts ADBDevices.get_android_version
7
+ puts ADBDevices.get_sdk_version
8
+ puts ADBDevices.get_screen_resolution
9
+ puts ADBDevices.get_battery_level
10
+ puts ADBDevices.get_battery_temperature
11
+ puts ADBDevices.get_battery_status
12
+ puts ADBDevices.get_focused_package_activity
13
+ puts ADBDevices.get_current_activity
14
+
15
+ puts ADBDevices.get_installed_apps_list
16
+ puts ADBDevices.get_system_apps_list
17
+
18
+ # debug
19
+ # puts ADBDevices.get_pid(ADBDevices.get_current_package_name)
20
+ # puts ADBDevices.kill_process("5723")
21
+ # ADBDevices.stop_current_app
22
+ # ADBDevices.reset_current_app
23
+ # ADBDevices.clear_app_data("com.test.myapplication")
24
+ # ADBDevices.remove_all_apks
25
+
26
+ # debug UIAutomatorTests
27
+ # ADBDevices.run_android_test_by_class("com.test.myapplication.demoTest","com.test.myapplication")
28
+ # ADBDevices.run_android_test("com.test.myapplication" )
29
+
30
+ # app helpers
31
+ puts ADBDevices.is_install?("com.qq.reader")
32
+ # ADBDevices.install_app(app_path)
33
+ # ADBDevices.uninstall_app("com.test.myapplication")
34
+ # ADBDevices.push_file(local_path,"/data/local/tmp/")
35
+ # ADBDevices.pull_file(remote_path,local_path)
36
+ # ADBDevices.get_app_startup_time("com.test.myapplication/com.app.activity.login.LoginActivity")
37
+ # ADBDevices.start_activity("com.qq.reader/.activity.GuideActivity")
@@ -0,0 +1,79 @@
1
+ require 'rubyXL'
2
+ require 'tabbyx/core/base'
3
+
4
+ module ExcelHelper
5
+
6
+ # read content of specified sheet by row and store in an array
7
+ # example:
8
+ # ExcelHelper.read_from_excel("api_testcases.xlsx",0) # by sheet number
9
+ # ExcelHelper.read_from_excel("api_testcases.xlsx",'Sheet 1') # by sheet name
10
+ def self.read_from_excel(filename,worksheet)
11
+ content = []
12
+ file = Base.file_exists?(filename)
13
+ excel = RubyXL::Parser.parse(file)
14
+ sheet = excel.worksheets[worksheet]
15
+
16
+ sheet.each do |row|
17
+ row_array = []
18
+ row && row.cells.each { |cell|
19
+ val = cell && cell.value
20
+ row_array.push val
21
+ }
22
+ content.push row_array
23
+ end
24
+ content
25
+ end
26
+
27
+ # example:
28
+ # ExcelHelper.get_value_by_location("api_testcases.xlsx",0,1,1)
29
+ def self.get_value_by_location(filename,worksheet,row,column)
30
+ file = Base.file_exists?(filename)
31
+ excel = RubyXL::Parser.parse(file)
32
+ sheet = excel.worksheets[worksheet]
33
+ value = ''
34
+ value = sheet[row][column].value unless sheet[row][column].nil? unless sheet[row].nil?
35
+ value
36
+ end
37
+
38
+ # if file exists, it writes value to specified cell. if file does not exist,create an excel and put in outputs folder.
39
+ # example:
40
+ # ExcelHelper.write_into_worksheet("test.xlsx",0,5,5,"Hi Excel")
41
+ def self.write_into_worksheet(filename,worksheet,row,column,value)
42
+ if Base.file_exists?(filename)
43
+ file = Base.file(filename)
44
+ raise("指定的文件不是excel,请检查") unless File.extname(file) == ".xlsx"
45
+ excel = RubyXL::Parser.parse(file)
46
+ elsif Base.file_exists?(filename,"../outputs/")
47
+ file = Base.file(filename,"../outputs/")
48
+ excel = RubyXL::Parser.parse(file)
49
+ else
50
+ file = Base.file(filename,"../outputs/")
51
+ puts "创建excel文件"+filename
52
+ excel = RubyXL::Workbook.new
53
+ end
54
+
55
+ sheet = excel.worksheets[worksheet]
56
+ if sheet[row].nil?
57
+ sheet.add_cell(row,column,value)
58
+ elsif sheet[row][column].nil?
59
+ sheet.add_cell(row,column,value)
60
+ else
61
+ sheet[row][column].change_contents(value)
62
+ end
63
+ excel.save(file)
64
+ end
65
+
66
+ # write an array, of which contains array items into excel file.
67
+ # example:
68
+ # dic = [["test", "test2", "test3"],["test", "test2", "test3"],["test", "test2", "test3"]]
69
+ # ExcelHelper.write_dictionary_to_excel(dic,"test1.xlsx",0)
70
+ def self.write_dictionary_to_excel(dic,filename,worksheet)
71
+ dic.each_with_index do |array, row|
72
+ array.each_with_index do |item,column|
73
+ write_into_worksheet(filename,worksheet,row,column,item)
74
+ end
75
+ end
76
+ end
77
+
78
+ end
79
+