GitLab Documentation

Testing Standards and Style Guidelines

This guide outlines standards and best practices for automated testing of GitLab CE and EE.

It is meant to be an extension of the thoughtbot testing styleguide. If this guide defines a rule that contradicts the thoughtbot guide, this guide takes precedence. Some guidelines may be repeated verbatim to stress their importance.

Factories

GitLab uses factory_girl as a test fixture replacement.

JavaScript

GitLab uses Teaspoon to run its Jasmine JavaScript specs. They can be run on the command line via bundle exec teaspoon, or via a web browser at http://localhost:3000/teaspoon when the Rails server is running.

RSpec

General Guidelines

let variables

GitLab's RSpec suite has made extensive use of let variables to reduce duplication. However, this sometimes comes at the cost of clarity, so we need to set some guidelines for their use going forward:

Test speed

GitLab has a massive test suite that, without parallelization, can take more than an hour to run. It's important that we make an effort to write tests that are accurate and effective as well as fast.

Here are some things to keep in mind regarding test performance:

Features / Integration

Spinach (feature) tests

GitLab moved from Cucumber to Spinach for its feature/integration tests in September 2012.

As of March 2016, we are trying to avoid adding new Spinach tests going forward, opting for RSpec feature specs.

Adding new Spinach scenarios is acceptable only if the new scenario requires no more than one new step definition. If more than that is required, the test should be re-implemented using RSpec instead.

Testing Rake Tasks

To make testing Rake tasks a little easier, there is a helper that can be included in lieu of the standard Spec helper. Instead of require 'spec_helper', use require 'rake_helper'. The helper includes spec_helper for you, and configures a few other things to make testing Rake tasks easier.

At a minimum, requiring the Rake helper will redirect stdout, include the runtime task helpers, and include the RakeHelpers Spec support module.

The RakeHelpers module exposes a run_rake_task(<task>) method to make executing tasks simple. See spec/support/rake_helpers.rb for all available methods.

Example:

require 'rake_helper'

describe 'gitlab:shell rake tasks' do
  before do
    Rake.application.rake_require 'tasks/gitlab/shell'

    stub_warn_user_is_not_gitlab
  end

 describe 'install task' do
    it 'invokes create_hooks task' do
      expect(Rake::Task['gitlab:shell:create_hooks']).to receive(:invoke)

      run_rake_task('gitlab:shell:install')
    end
  end
end

Return to Development documentation