taf 0.3.7 → 0.3.8

Sign up to get free protection for your applications and to get access to all the features.
Files changed (83) hide show
  1. checksums.yaml +4 -4
  2. data/bin/taf +23 -2
  3. data/lib/taf.rb +48 -0
  4. data/lib/taf/browser.rb +103 -0
  5. data/lib/taf/cmd_line.rb +74 -0
  6. data/lib/taf/create_directories.rb +53 -0
  7. data/lib/taf/json_parser.rb +48 -0
  8. data/lib/taf/junit_report.rb +73 -0
  9. data/lib/taf/my_log.rb +21 -0
  10. data/lib/taf/parser.rb +37 -0
  11. data/lib/taf/report.rb +110 -0
  12. data/lib/taf/report_summary.rb +56 -0
  13. data/lib/taf/screenshot.rb +30 -0
  14. data/lib/taf/test_engine.rb +82 -0
  15. data/lib/taf/test_steps.rb +38 -0
  16. data/lib/taf/test_steps/handlers/base.rb +90 -0
  17. data/lib/taf/test_steps/handlers/base/browser_back.rb +21 -0
  18. data/lib/taf/test_steps/handlers/base/browser_forward.rb +21 -0
  19. data/lib/taf/test_steps/handlers/base/browser_open.rb +21 -0
  20. data/lib/taf/test_steps/handlers/base/browser_quit.rb +21 -0
  21. data/lib/taf/test_steps/handlers/base/browser_refresh.rb +21 -0
  22. data/lib/taf/test_steps/handlers/base/capture_alert.rb +22 -0
  23. data/lib/taf/test_steps/handlers/base/check_box.rb +22 -0
  24. data/lib/taf/test_steps/handlers/base/check_boxdata.rb +35 -0
  25. data/lib/taf/test_steps/handlers/base/check_browser_title.rb +21 -0
  26. data/lib/taf/test_steps/handlers/base/check_logs.rb +25 -0
  27. data/lib/taf/test_steps/handlers/base/check_screendata.rb +23 -0
  28. data/lib/taf/test_steps/handlers/base/check_url.rb +22 -0
  29. data/lib/taf/test_steps/handlers/base/click_button.rb +33 -0
  30. data/lib/taf/test_steps/handlers/base/execute_system_command.rb +23 -0
  31. data/lib/taf/test_steps/handlers/base/handle_browser_window.rb +23 -0
  32. data/lib/taf/test_steps/handlers/base/ipause.rb +21 -0
  33. data/lib/taf/test_steps/handlers/base/list_all_dropdowns_values.rb +23 -0
  34. data/lib/taf/test_steps/handlers/base/login.rb +59 -0
  35. data/lib/taf/test_steps/handlers/base/open_url.rb +22 -0
  36. data/lib/taf/test_steps/handlers/base/ping_test.rb +27 -0
  37. data/lib/taf/test_steps/handlers/base/radio_button.rb +24 -0
  38. data/lib/taf/test_steps/handlers/base/select_dropdown.rb +24 -0
  39. data/lib/taf/test_steps/handlers/base/send_special_keys.rb +22 -0
  40. data/lib/taf/test_steps/handlers/base/write_box_data.rb +35 -0
  41. data/lib/taf/version.rb +5 -0
  42. metadata +41 -43
  43. data/lib/functions/handlers.rb +0 -6
  44. data/lib/functions/handlers/base_handler.rb +0 -91
  45. data/lib/functions/handlers/browser_back.rb +0 -21
  46. data/lib/functions/handlers/browser_forward.rb +0 -21
  47. data/lib/functions/handlers/browser_quit.rb +0 -21
  48. data/lib/functions/handlers/browser_refresh.rb +0 -21
  49. data/lib/functions/handlers/capture_alert.rb +0 -22
  50. data/lib/functions/handlers/check_box.rb +0 -21
  51. data/lib/functions/handlers/check_boxdata.rb +0 -35
  52. data/lib/functions/handlers/check_browser_title.rb +0 -21
  53. data/lib/functions/handlers/check_logs.rb +0 -23
  54. data/lib/functions/handlers/check_screendata.rb +0 -21
  55. data/lib/functions/handlers/check_url.rb +0 -22
  56. data/lib/functions/handlers/click_button.rb +0 -33
  57. data/lib/functions/handlers/execute_system_command.rb +0 -23
  58. data/lib/functions/handlers/handle_browser_window.rb +0 -23
  59. data/lib/functions/handlers/ipause.rb +0 -21
  60. data/lib/functions/handlers/list_all_dropdowns_values.rb +0 -23
  61. data/lib/functions/handlers/login.rb +0 -59
  62. data/lib/functions/handlers/open_url.rb +0 -35
  63. data/lib/functions/handlers/ping_test.rb +0 -27
  64. data/lib/functions/handlers/radio_button.rb +0 -22
  65. data/lib/functions/handlers/select_dropdown.rb +0 -24
  66. data/lib/functions/handlers/send_special_keys.rb +0 -22
  67. data/lib/functions/handlers/write_box_data.rb +0 -35
  68. data/lib/main.rb +0 -31
  69. data/lib/parser/json_parser.rb +0 -50
  70. data/lib/parser/parser.rb +0 -49
  71. data/lib/report/junit_report.rb +0 -74
  72. data/lib/report/report.rb +0 -116
  73. data/lib/report/report_summary.rb +0 -53
  74. data/lib/taf_config.rb +0 -46
  75. data/lib/utils/browser.rb +0 -98
  76. data/lib/utils/cmd_line.rb +0 -71
  77. data/lib/utils/create_directories.rb +0 -50
  78. data/lib/utils/exceptions.rb +0 -7
  79. data/lib/utils/logger.rb +0 -21
  80. data/lib/utils/screenshot.rb +0 -30
  81. data/lib/utils/test_engine.rb +0 -77
  82. data/lib/utils/test_steps.rb +0 -38
  83. data/lib/version.rb +0 -21
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 436860d3248c2b1548a9409a70f6edafe44c1f3239c8ec03fb1991b69e6a45e5
4
- data.tar.gz: 97ded2847979e394f7a01680d1274fea84d69aa65b4f46b4612c22c541cf96eb
3
+ metadata.gz: fdf9086f0e77fd7b425360f96cd7ce31eb009af1108cbaf87f2db5074741a247
4
+ data.tar.gz: b1d008e6ad5536addcfb8968581f5c161d751a4e98688d6f435d2b39fd9cb66b
5
5
  SHA512:
6
- metadata.gz: 9a814d67bcbc4f17493282b383b4874a2bd6b94e09db6e6478a897ee477f825a3baebdbb14e6ca6630044721a71bd3c105d0aaecd0aafb93538da4820332de04
7
- data.tar.gz: '04829e2953ad7ab526f8603ecec94f6373244843f1b353848b9eba45e24d53e431113b7b9059705506097ca364a049c1379b4d7ee007f39285c18d69317586bc'
6
+ metadata.gz: d1983aa74c176c657c4aa4ebf13f49ef401f084f369f738a923102fe3d72cacc4fe054e63fba75fd7557c37739791d906c05a437ea9b0739b916a5ee2a2b3489
7
+ data.tar.gz: c4062ab7558b5591d8ac095f7f17d1d881d2a2abc56cc29090046732e4a33dfbb25cabe6312e59cf0d402ed7767dcf1f17802d690d7864beef4fe93052ea3746
data/bin/taf CHANGED
@@ -1,5 +1,26 @@
1
1
  #!/usr/bin/env ruby
2
2
  # frozen_string_literal: true
3
3
 
4
- require 'version.rb'
5
- require 'main.rb'
4
+ require 'taf'
5
+
6
+ # parses the cmd line imput into the taf
7
+ Taf::CMDLine.cmdline_input
8
+
9
+ # get the overall test suite end time
10
+ ts_start_time = Taf::Report.current_time
11
+
12
+ # process the test files to execute the tests
13
+ total_passes, total_failures, total_skipped =
14
+ Taf::TestEngine.process_testfiles
15
+ total_metrics = [total_passes, total_failures, total_skipped]
16
+ # get the overall test suite end time
17
+ ts_end_time = Taf::Report.current_time
18
+
19
+ # output the overall test summary
20
+ Taf::ReportSummary.overall_test_summary(ts_start_time, ts_end_time,
21
+ total_metrics)
22
+ Taf::JUnitReport.test_summary_junit(ts_start_time, ts_end_time,
23
+ total_metrics)
24
+
25
+ # Exit status code.
26
+ Process.exit(total_failures.zero? ? 0 : 1)
data/lib/taf.rb ADDED
@@ -0,0 +1,48 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Taf is the main namespace for this project.
4
+ module Taf
5
+ class TafError < StandardError; end
6
+ class UnknownTestStep < TafError; end
7
+ class FailureThresholdExceeded < TafError; end
8
+ class BrowserFailedOpen < TafError; end
9
+ class LoginTypeFailed < TafError; end
10
+
11
+ require 'selenium-webdriver'
12
+ require 'watir'
13
+ require 'rubygems'
14
+ require 'fileutils'
15
+ require 'logger'
16
+ require 'net/ping'
17
+ require 'nokogiri'
18
+ require 'time_difference'
19
+ require 'colored'
20
+ require 'optparse'
21
+ require 'fileutils'
22
+ require 'securerandom'
23
+ require 'json'
24
+
25
+ require 'taf/browser'
26
+ require 'taf/cmd_line'
27
+ require 'taf/create_directories'
28
+ require 'taf/json_parser'
29
+ require 'taf/junit_report'
30
+ require 'taf/my_log'
31
+ require 'taf/parser'
32
+ require 'taf/report'
33
+ require 'taf/report_summary'
34
+ require 'taf/screenshot'
35
+ require 'taf/test_engine'
36
+ require 'taf/test_steps'
37
+ require 'taf/test_steps/handlers/base'
38
+ require 'taf/version'
39
+
40
+ # Load all handlers.
41
+ Dir[File.expand_path('taf/test_steps/handlers/base/*.rb', __dir__)]
42
+ .each do |f|
43
+ require f
44
+ end
45
+
46
+ # Watir config. set wait:
47
+ Watir.default_timeout = 60
48
+ end
@@ -0,0 +1,103 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Created on 02 Aug 2018
4
+ # @author: Andy Perrett
5
+ #
6
+ # Versions:
7
+ # 1.0 - Baseline
8
+ #
9
+ module Taf
10
+ # browser_setup.rb - a browser functions
11
+ module Browser
12
+ # open_browser function
13
+ def self.open_browser
14
+ browser = Taf::CMDLine.browser_type.downcase
15
+ case browser
16
+ when 'chrome' then chrome
17
+ when 'chrome-headless' then chrome_headless
18
+ when 'firefox' then firefox
19
+ when 'firefox-headless' then firefox_headless
20
+ else
21
+ raise Taf::BrowserFailedOpen,
22
+ "unable to open selected browser: #{browser}"
23
+ end
24
+ end
25
+
26
+ # chrome browser details
27
+ def self.chrome
28
+ @browser = Watir::Browser.new :chrome, switches: %w[
29
+ --acceptInsecureCerts-true --start-maximized --window-size=1920,1080
30
+ ]
31
+ end
32
+
33
+ # chrome headless browser details
34
+ def self.chrome_headless
35
+ @browser = Watir::Browser.new :chrome, switches: %w[
36
+ --start-maximized --disable-gpu --headless --acceptInsecureCerts-true
37
+ --no-sandbox --window-size=1920,1080
38
+ ]
39
+ end
40
+
41
+ # firefox browser details
42
+ def self.firefox
43
+ caps = Selenium::WebDriver::Remote::Capabilities.firefox
44
+ caps['acceptInsecureCerts'] = true
45
+ driver = Selenium::WebDriver.for(:firefox, desired_capabilities: caps)
46
+ @browser = Watir::Browser.new(driver)
47
+ browser_full_screen
48
+ end
49
+
50
+ # firefox headless browser details
51
+ def self.firefox_headless
52
+ caps = Selenium::WebDriver::Remote::Capabilities.firefox
53
+ options = Selenium::WebDriver::Firefox::Options.new(args: ['-headless'])
54
+ caps['acceptInsecureCerts'] = true
55
+ driver = Selenium::WebDriver.for(:firefox, options: options,
56
+ desired_capabilities: caps)
57
+ @browser = Watir::Browser.new(driver)
58
+ # makes the browser full screen.
59
+ @browser.driver.manage.window.resize_to(1920, 1200)
60
+ @browser.driver.manage.window.move_to(0, 0)
61
+ end
62
+
63
+ # makes the browser full screen.
64
+ def self.browser_full_screen
65
+ screen_width = @browser.execute_script('return screen.width;')
66
+ screen_height = @browser.execute_script('return screen.height;')
67
+ @browser.driver.manage.window.resize_to(screen_width, screen_height)
68
+ @browser.driver.manage.window.move_to(0, 0)
69
+ end
70
+
71
+ # define browser value
72
+ def self.b
73
+ @browser
74
+ end
75
+
76
+ # Check browser version
77
+ def self.browser_version
78
+ browser_name = Taf::CMDLine.browser_type.downcase
79
+ case browser_name
80
+ when 'chrome', 'chrome-headless'
81
+ @browser.driver.capabilities[:version]
82
+ when 'firefox', 'firefox-headless'
83
+ @browser.execute_script('return navigator.userAgent;').split('/')[-1]
84
+ end
85
+ rescue StandardError
86
+ 'No Browser version'
87
+ end
88
+
89
+ # Check platform
90
+ def self.browser_platform
91
+ browser_name = Taf::CMDLine.browser_type.downcase
92
+ case browser_name
93
+ when 'chrome', 'chrome-headless'
94
+ @browser.execute_script('return navigator.userAgent;')
95
+ .split(';')[1].split(')')[0]
96
+ when 'firefox', 'firefox-headless'
97
+ @browser.execute_script('return navigator.userAgent;').split(';')[1]
98
+ end
99
+ rescue StandardError
100
+ 'No Platform found'
101
+ end
102
+ end
103
+ end
@@ -0,0 +1,74 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Created on 13 May 2019
4
+ # @author: Andy Perrett
5
+ #
6
+ # Versions:
7
+ # 1.0 - Baseline
8
+ #
9
+ module Taf
10
+ # cmd_line.rb - command line script Script
11
+ module CMDLine
12
+ def self.help
13
+ puts ' Usage: taf [options]'
14
+ puts '-h --help 2 arguments are required: -b {Browser}'\
15
+ '-t {Testcase folder}'
16
+ puts '-v --verision Shows current version'
17
+ puts '-b --browser browser Supported Browsers: chrome, chrome-headless,'\
18
+ ' firefox, firefox-headless'
19
+ puts '-t --tests testfolder i.e. tests/*.json'
20
+ Process.exit
21
+ end
22
+
23
+ def self.browser(browser)
24
+ @browser_type = browser
25
+ unless ['chrome', 'chrome-headless', 'firefox', 'firefox-headless']
26
+ .include?(@browser_type)
27
+ Taf::MyLog.log.warn 'A valid Browser has not been supplied as a' \
28
+ ' command-line parameter as expected'
29
+ Process.exit
30
+ end
31
+ end
32
+
33
+ def self.tests(testfolder)
34
+ @tests_folder = testfolder
35
+ if Taf::Parser.test_files.size.positive?
36
+ Taf::MyLog.log.info "There are: #{Taf::Parser.test_files.size}" \
37
+ " test files to process: #{Taf::Parser.test_files}\n"
38
+ else
39
+ Taf::MyLog.log.warn \
40
+ 'A valid Test case location has not been supplied' \
41
+ ' as a command-line parameter as expected, Files should be .JSON'
42
+ Process.exit
43
+ end
44
+ end
45
+
46
+ def self.taf_version
47
+ puts "TAF Version: #{Taf::VERSION}"
48
+ Process.exit
49
+ end
50
+
51
+ def self.browser_type
52
+ @browser_type
53
+ end
54
+
55
+ def self.tests_folder
56
+ @tests_folder
57
+ end
58
+
59
+ def self.cmdline_input
60
+ # check if the test suite file name exists on the command line
61
+ # allow a user to input 2 arguments in to CMD line the 2 values are:
62
+ # Testcase Folder and Browser.
63
+ options = {}
64
+ ARGV.push('-h') if ARGV.empty?
65
+ OptionParser.new do |opt|
66
+ opt.banner = 'Usage: taf [options]'
67
+ opt.on('-h', '--help') { help }
68
+ opt.on('-v', '--version') { taf_version }
69
+ opt.on('-b', '--browser b') { |b| options[:browser] = b, browser(b) }
70
+ opt.on('-t', '--tests t') { |t| options[:testfolder] = t, tests(t) }
71
+ end.parse!
72
+ end
73
+ end
74
+ end
@@ -0,0 +1,53 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Created on 20 Sept 2017
4
+ # @author: Andy Perrett
5
+ #
6
+ # Versions:
7
+ # 1.0 - Baseline
8
+ #
9
+ module Taf
10
+ # create_directories.rb - Creates folder structures.
11
+ module CreateDirectories
12
+ # create the project directories and open the test results file,
13
+ # the screenshot will be placed in a unique filename based upon the
14
+ # testStep.
15
+ #
16
+ # A single top-level directory named after the Project ID will be used.
17
+ # The target sub-directories will be created for each run of the test.
18
+ # ----> Project directory (working directory)
19
+ #
20
+ # -------> directory named after the test run ID UUID
21
+
22
+ def self.construct_projectdirs
23
+ # create top-level directory if it doesn't already exist:
24
+ # Results/Project_id
25
+ project_id = Taf::JSONParser.project_id.delete(' ')
26
+ project_dir = File.join('Results', project_id)
27
+
28
+ FileUtils.mkdir_p(project_dir)
29
+
30
+ # Generate UUID
31
+ @run_uuid = SecureRandom.uuid
32
+ end
33
+
34
+ def self.construct_testspecdirs
35
+ # create directories for each test spec for screenshots:
36
+ # Results/Project_id/Run_ID_UUID
37
+ project_id = Taf::JSONParser.project_id.delete(' ')
38
+ screenshot_dir = File.join('Results', project_id, "Run_ID_#{@run_uuid}")
39
+
40
+ abs_path_screenshot_dir = File.absolute_path(screenshot_dir)
41
+ FileUtils.mkdir_p(abs_path_screenshot_dir)
42
+ # if any issues then set error message and re-raise the exception
43
+ rescue StandardError => e
44
+ # construct the error message from custom text and the actual system error
45
+ # message (converted to a string)
46
+ error_to_display = 'Error creating directory:' + e.to_s
47
+ raise error_to_display
48
+ else
49
+ # if no exception then return the screenshot file directory path
50
+ abs_path_screenshot_dir
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,48 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Created on 02 Aug 2018
4
+ # @author: Andy Perrett
5
+ #
6
+ # Versions:
7
+ # 1.0 - Baseline
8
+ #
9
+ module Taf
10
+ # json_parser.rb - json parser functions
11
+ module JSONParser
12
+ def self.parse_test_header_data(parse_json)
13
+ # get the number of test steps in the file
14
+ number_test_steps = parse_json['steps'].count
15
+ # get the remaining test data
16
+ @test_id = parse_json['testId']
17
+ @project_id = parse_json['projectId']
18
+ test_des = parse_json['testDescription']
19
+ Taf::MyLog.log.info "Number of test steps: #{number_test_steps}"
20
+ Taf::MyLog.log.info "Test Description: #{test_des}"
21
+ Taf::MyLog.log.info "TestID: #{@test_id} \n"
22
+ end
23
+
24
+ def self.test_id
25
+ @test_id
26
+ end
27
+
28
+ def self.project_id
29
+ @project_id
30
+ end
31
+
32
+ # parseTestStepData
33
+ def self.parse_test_step_data(parse_json)
34
+ parsed_step = { testdesc: parse_json['description'],
35
+ testFunction: parse_json['function'].downcase,
36
+ testvalue: parse_json['value0'],
37
+ locate: parse_json['value1'] || 'id',
38
+ testvalue2: parse_json['value2'],
39
+ locate2: parse_json['value3'] || 'id',
40
+ skipTestCase: parse_json['skipTestCase'] == 'yes' }
41
+
42
+ parsed_step
43
+ # if an error reading the test step data then re-raise the exception
44
+ rescue StandardError => e
45
+ raise e
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,73 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Created on 20 Sept 2017
4
+ # @author: Andy Perrett
5
+ #
6
+ # Versions:
7
+ # 1.0 - Baseline
8
+ #
9
+ module Taf
10
+ # junit_report.rb - methods for writing to the summary xml junit report.
11
+ module JUnitReport
12
+ # holds printable test report summary for all the executed tests
13
+ @test_step_report_summary2 = []
14
+ # construct the test suite header for junit
15
+ def self.test_step_summary_xml(test_file_name, test_file_name_index,
16
+ tc_start, tc_end, metrics)
17
+ number_test_steps = [metrics.stepFailures, metrics.stepPasses,
18
+ metrics.stepSkipped].sum
19
+ @test_step_report_summary2[test_file_name_index] = {
20
+ 'classname' => test_file_name,
21
+ 'name' => test_file_name,
22
+ 'assertions' => number_test_steps,
23
+ 'failures' => metrics.stepFailures,
24
+ 'tests' => metrics.stepPasses,
25
+ 'skipped' => metrics.stepSkipped,
26
+ 'time' => TimeDifference.between(tc_end, tc_start).in_seconds
27
+ }
28
+ end
29
+
30
+ def self.test_summary_junit(ts_start_time, ts_end_time, total_metrics)
31
+ # output to XML file format for Junit for CI.
32
+ builder = Nokogiri::XML::Builder.new(encoding: 'UTF-8') do |xml|
33
+ testsuite_attrs = {
34
+ 'classname' => Taf::CMDLine.tests_folder.to_s,
35
+ 'name' => Taf::CMDLine.tests_folder.to_s,
36
+ 'tests' => total_metrics[0].to_s,
37
+ 'failures' => total_metrics[1].to_s,
38
+ 'timestamp' => ts_start_time.to_s,
39
+ 'skipped' => total_metrics[2].to_s,
40
+ 'time' => TimeDifference.between(ts_end_time, ts_start_time)
41
+ .in_seconds
42
+ }
43
+ xml.testsuites(testsuite_attrs) do |testsuites|
44
+ @test_step_report_summary2.each do |test_step_report_summary2|
45
+ testsuites.testsuite(test_step_report_summary2) do |testsuite|
46
+ $testStep_xml[test_step_report_summary2['name']]
47
+ .each do |test_step_idx, test_step_xml|
48
+ testsuite.testcase(test_step_xml) do |testcase|
49
+ failure = $failtestStep_xml
50
+ &.[](test_step_report_summary2['name'])&.[](test_step_idx)
51
+ skipped = $skiptestStep_xml
52
+ &.[](test_step_report_summary2['name'])&.[](test_step_idx)
53
+ testcase.failure(failure) if failure
54
+ testcase.skipped(skipped) if skipped
55
+ end
56
+ end
57
+ end
58
+ end
59
+ end
60
+ end
61
+
62
+ # the test suite summary is a XML report generated will be called
63
+ # 'report_uuid.xml'
64
+ project_id = Taf::JSONParser.project_id.delete(' ')
65
+ xml_dir = File.join('Results', project_id)
66
+ ts_xml_file = "#{xml_dir}/report_#{SecureRandom.uuid}.xml"
67
+
68
+ ts_summary_file_xml = File.open(ts_xml_file, 'w')
69
+ ts_summary_file_xml.write builder.to_xml
70
+ ts_summary_file_xml.close
71
+ end
72
+ end
73
+ end