taf 0.3.7 → 0.3.8

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.
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