Skip to content

Speed up admin feature specs

Miguel Rincon requested to merge mrincon-use-mock-admin-mode-feature-specs into master

What does this MR do and why?

This change adds a new use_mock_admin_mode in gitlab_enable_admin_mode_sign_in which allows tests to enable admin mode faster by mocking the admin mode settings instead of using capybara and the browser.

use_mock_admin_mode is enabled by default, so specs that use gitlab_enable_admin_mode_sign_in start using the faster version by default.

Why does this work?

gitlab_enable_admin_mode_sign_in is frequently used in our specs to simulate a user entering admin mode. It works by visiting new admin session page, and filling out the user password using Capybara.

This is inefficient for most of our tests for the admin section because we must run this code repeatedly in the before block, for each test. This MR mocks the Gitlab::Auth::CurrentUserMode setting so the mock user can bypass this check and go directly to admin mode.

It uses enable_admin_mode! which has been used for admin controllers tests.

Screenshots or screen recordings

Taking admin_runners_spec.rb as an example, we see a significant decrease in time taken (in my local machine).

Spec Before After
spec/features/admin/admin_runners_spec.rb
Finished in 6 minutes 36 seconds (files took 12.14 seconds to load)
$ bundle exec rspec spec/features/admin/admin_runners_spec.rb --profile
Run options: include {:focus=>true}

All examples were filtered out; ignoring {:focus=>true}

Test environment set up in 3.032256 seconds
Starting the Capybara driver server...
Capybara starting Puma...
* Version 6.4.0 , codename: The Eagle of Durango
* Min threads: 0, max threads: 4
* Listening on unix:///var/folders/yb/yqb2vdd94kb3kw0xmhfbjqmc0000gn/T/20231208-97180-vlwrdx
.....................................................................

Top 10 slowest examples (85.84 seconds, 21.7% of total time):
  Admin Runners Admin Runners page runners creation shows a create button
    12.05 seconds ./spec/features/admin/admin_runners_spec.rb:30
  Admin Runners Admin Runners page when there are runners filter by tag shows correct runner when tag is selected and search term is entered
    9.5 seconds ./spec/features/admin/admin_runners_spec.rb:453
  Admin Runners Admin Runners page when there are runners filter by type shows correct runner when type is selected and search term is entered
    8.95 seconds ./spec/features/admin/admin_runners_spec.rb:358
  Admin Runners Admin Runners page when there are runners with an instance runner behaves like pauses, resumes and deletes a runner pauses and resumes runner
    8.87 seconds ./spec/support/shared_examples/features/runners_shared_examples.rb:111
  Admin Runners Admin Runners page when there are runners filter by type maintains the same filter when switching between runner types
    8.73 seconds ./spec/features/admin/admin_runners_spec.rb:378
  Admin Runners Admin Runners page when there are runners filter by status shows correct runner when status is selected and search term is entered
    7.68 seconds ./spec/features/admin/admin_runners_spec.rb:271
  Admin Runners Admin Runners page when there are runners filter by tag behaves like filters by tag shows correct runner when tag matches
    7.63 seconds ./spec/support/shared_examples/features/runners_shared_examples.rb:178
  Admin Runners Admin Runners page when there are runners with multiple runners behaves like deletes runners in bulk when selecting all for deletion behaves like shows no runners registered shows 0 count and the empty state
    7.56 seconds ./spec/support/shared_examples/features/runners_shared_examples.rb:66
  Admin Runners Admin Runners page when there are runners filter by tag when tag does not match behaves like shows no runners found shows "no runners" message
    7.48 seconds ./spec/support/shared_examples/features/runners_shared_examples.rb:80
  Admin Runners Admin Runners page when there are runners filter by tag when tag does not match shows no runner
    7.39 seconds ./spec/features/admin/admin_runners_spec.rb:448

Finished in 6 minutes 36 seconds (files took 12.14 seconds to load)
69 examples, 0 failures

[TEST PROF INFO] Time spent in factories: 00:02.325 (0.58% of total time)
Finished in 4 minutes 9.7 seconds (files took 12.18 seconds to load)
$ bundle exec rspec spec/features/admin/admin_runners_spec.rb --profile
Run options: include {:focus=>true}

All examples were filtered out; ignoring {:focus=>true}

Test environment set up in 3.371029 seconds
Starting the Capybara driver server...
Capybara starting Puma...
* Version 6.4.0 , codename: The Eagle of Durango
* Min threads: 0, max threads: 4
* Listening on unix:///var/folders/yb/yqb2vdd94kb3kw0xmhfbjqmc0000gn/T/20231211-65352-g1e8nj
.....................................................................

Top 10 slowest examples (62.94 seconds, 25.2% of total time):
  Admin Runners Admin Runners page runners creation shows a create button
    8.38 seconds ./spec/features/admin/admin_runners_spec.rb:28
  Admin Runners Admin Runners page when there are runners filter by tag shows correct runner when tag is selected and search term is entered
    8.18 seconds ./spec/features/admin/admin_runners_spec.rb:451
  Admin Runners Admin Runners page when there are runners with an instance runner behaves like pauses, resumes and deletes a runner pauses and resumes runner
    6.73 seconds ./spec/support/shared_examples/features/runners_shared_examples.rb:111
  Admin Runners Admin Runners page when there are runners filter by type maintains the same filter when switching between runner types
    6.3 seconds ./spec/features/admin/admin_runners_spec.rb:376
  Admin Runners Admin Runners page when there are runners filter by type shows correct runner when type is selected and search term is entered
    6.21 seconds ./spec/features/admin/admin_runners_spec.rb:356
  Admin Runners Admin Runners page when there are runners with an instance runner behaves like pauses, resumes and deletes a runner deletes runner deletes a runner
    5.6 seconds ./spec/support/shared_examples/features/runners_shared_examples.rb:139
  Admin Runners Admin Runners page when there are runners filter by tag behaves like filters by tag shows correct runner when tag matches
    5.51 seconds ./spec/support/shared_examples/features/runners_shared_examples.rb:178
  Admin Runners Admin Runners page when there are runners filter by tag when tag does not match behaves like shows no runners found shows "no runners" message
    5.4 seconds ./spec/support/shared_examples/features/runners_shared_examples.rb:80
  Admin Runners Admin Runners page when there are runners shows a running status badge that links to jobs tab
    5.36 seconds ./spec/features/admin/admin_runners_spec.rb:106
  Admin Runners Admin Runners page when there are runners filter by tag when tag does not match shows no runner
    5.25 seconds ./spec/features/admin/admin_runners_spec.rb:446

Finished in 4 minutes 9.7 seconds (files took 12.18 seconds to load)
69 examples, 0 failures

[TEST PROF INFO] Time spent in factories: 00:02.878 (1.14% of total time)

How to set up and validate locally

A green pipeline. 💚 ... or if you insist, this should run our admin feature specs:

$ bundle exec rspec spec/features/admin
$ bundle exec rspec ee/spec/features/admin

MR acceptance checklist

This checklist encourages us to confirm any changes have been analyzed to reduce risks in quality, performance, reliability, security, and maintainability.

Edited by Miguel Rincon

Merge request reports