Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Output UJs test failures in CI #42513

Merged
merged 2 commits into from
Jun 23, 2021
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
1 change: 0 additions & 1 deletion Gemfile
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,6 @@ gem "aws-sdk-sns", require: false
gem "webmock"

group :ujs do
gem "qunit-selenium"
gem "webdrivers"
end

Expand Down
4 changes: 0 additions & 4 deletions Gemfile.lock
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -563,7 +560,6 @@ DEPENDENCIES
puma
que
queue_classic!
qunit-selenium
racc (>= 1.4.6)
rack-cache (~> 1.2)
rails!
Expand Down
73 changes: 66 additions & 7 deletions ci/qunit-selenium-runner.rb
Original file line number Diff line number Diff line change
@@ -1,22 +1,81 @@
# frozen_string_literal: true

require "qunit/selenium/test_runner"
zzak marked this conversation as resolved.
Show resolved Hide resolved
require "webdrivers"

if ARGV[1]
driver = ::Selenium::WebDriver.for(:remote, url: ARGV[1], desired_capabilities: :chrome)
else
require "webdrivers"
# 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
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@rafaelfranca is this okay, or do we need the full text?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is the most similar scenario to this that I could find: https://github.com/rails/rails/blob/main/guides/rails_guides/levenshtein.rb#L6

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

reading the license I believe it needs to be the full text.

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

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 (?<milliseconds>\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
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)