From 2934c54dfd3faf65abdaac51e7c893cb8c0ff11d Mon Sep 17 00:00:00 2001 From: Alex Ghiculescu Date: Wed, 16 Jun 2021 13:46:42 -0500 Subject: [PATCH] Output UJs test failures in CI --- Gemfile | 1 - Gemfile.lock | 4 -- ci/qunit-selenium-runner.rb | 73 +++++++++++++++++++++++++++++++++---- 3 files changed, 66 insertions(+), 12 deletions(-) diff --git a/Gemfile b/Gemfile index 01f34c59642..b956c7e85e4 100644 --- a/Gemfile +++ b/Gemfile @@ -95,7 +95,6 @@ gem "aws-sdk-sns", require: false gem "webmock" group :ujs do - gem "qunit-selenium" gem "webdrivers" end diff --git a/Gemfile.lock b/Gemfile.lock index 6d356d9c587..1b966034414 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -345,9 +345,6 @@ GEM puma (5.3.2) nio4r (~> 2.0) que (0.14.3) - qunit-selenium (0.0.4) - selenium-webdriver - thor raabro (1.4.0) racc (1.5.2) rack (2.2.3) @@ -563,7 +560,6 @@ DEPENDENCIES puma que queue_classic! - qunit-selenium racc (>= 1.4.6) rack-cache (~> 1.2) rails! diff --git a/ci/qunit-selenium-runner.rb b/ci/qunit-selenium-runner.rb index b7013c258ab..846636f9211 100644 --- a/ci/qunit-selenium-runner.rb +++ b/ci/qunit-selenium-runner.rb @@ -1,22 +1,81 @@ # frozen_string_literal: true -require "qunit/selenium/test_runner" +require "webdrivers" -if ARGV[1] - driver = ::Selenium::WebDriver.for(:remote, url: ARGV[1], desired_capabilities: :chrome) +# This class based on https://github.com/smontanari/qunit-selenium, with a few tweaks to make it easier to read output. +# Copyright (c) 2014 Silvio Montanari +# License: MIT +class TestRun + TestResult = Struct.new(:tests, :assertions, :duration, :raw_output) + + ID_TESTRESULT = "qunit-testresult" + ID_TESTS = "qunit-tests" + + def initialize(driver) + @qunit_testresult = driver[ID_TESTRESULT] + @qunit_tests = driver[ID_TESTS] + end + + def completed? + @qunit_testresult.text =~ /Tests completed/ + end + + def result + assertions = { total: total_assertions, passed: passed_assertions, failed: failed_assertions } + tests = { total: total_tests, passed: pass_tests, failed: fail_tests } + TestResult.new(tests, assertions, duration, raw_output) + end + + private + def raw_output + @qunit_tests.text + end + + def duration + match = /Tests completed in (?\d+) milliseconds/.match @qunit_testresult.text + match[:milliseconds].to_i / 1000 + end + + %w(total passed failed).each do |result| + define_method("#{result}_assertions".to_sym) do + @qunit_testresult.find_elements(:class, result).first.text.to_i + end + end + + def total_tests + @qunit_tests.find_elements(:css, "##{ID_TESTS} > *").count + end + + %w(pass fail).each do |result| + define_method("#{result}_tests".to_sym) do + @qunit_tests.find_elements(:css, "##{ID_TESTS} > .#{result}").count + end + end +end + +driver = if ARGV[1] + ::Selenium::WebDriver.for(:remote, url: ARGV[1], desired_capabilities: :chrome) else - require "webdrivers" - driver_options = Selenium::WebDriver::Chrome::Options.new driver_options.add_argument("--headless") driver_options.add_argument("--disable-gpu") driver_options.add_argument("--no-sandbox") - driver = ::Selenium::WebDriver.for(:chrome, options: driver_options) + ::Selenium::WebDriver.for(:chrome, options: driver_options) end -result = QUnit::Selenium::TestRunner.new(driver).open(ARGV[0], timeout: 60) +driver.get(ARGV[0]) + +result = TestRun.new(driver).tap do |run| + ::Selenium::WebDriver::Wait.new(timeout: 60).until do + run.completed? + end +end.result + driver.quit puts "Time: #{result.duration} seconds, Total: #{result.assertions[:total]}, Passed: #{result.assertions[:passed]}, Failed: #{result.assertions[:failed]}" +if result.tests[:failed] > 0 + puts "Qunit output follows. Look for lines that have failures, eg (1, n, n) - those are your failing lines\r\n\r\n#{result.raw_output}" +end exit(result.tests[:failed] > 0 ? 1 : 0)