2019-02-19 16:44:08 -05:00
# GitLab QA - End-to-end tests for GitLab
2017-02-20 06:45:04 -05:00
2019-05-21 21:34:12 -04:00
This directory contains [end-to-end tests ](../../../doc/development/testing_guide/end_to_end/index.md )
2019-02-19 16:44:08 -05:00
for GitLab. It includes the test framework and the tests themselves.
The tests can be found in `qa/specs/features` (not to be confused with the unit
tests for the test framework, which are in `spec/` ).
2017-02-20 07:18:41 -05:00
2017-10-05 06:36:28 -04:00
It is part of the [GitLab QA project ](https://gitlab.com/gitlab-org/gitlab-qa ).
2017-03-09 04:41:10 -05:00
2017-10-05 06:36:28 -04:00
## What is it?
2017-03-09 04:41:10 -05:00
2019-02-19 16:44:08 -05:00
GitLab QA is an end-to-end tests suite for GitLab.
2017-03-09 04:41:10 -05:00
2019-02-19 16:44:08 -05:00
These are black-box and entirely click-driven end-to-end tests you can run
2017-03-09 04:41:10 -05:00
against any existing instance.
## How does it work?
1. When we release a new version of GitLab, we build a Docker images for it.
1. Along with GitLab Docker Images we also build and publish GitLab QA images.
2019-02-19 16:44:08 -05:00
1. GitLab QA project uses these images to execute end-to-end tests.
2017-09-30 02:38:12 -04:00
2018-01-12 05:04:41 -05:00
## Validating GitLab views / partials / selectors in merge requests
We recently added a new CI job that is going to be triggered for every push
event in CE and EE projects. The job is called `qa:selectors` and it will
verify coupling between page objects implemented as a part of GitLab QA
and corresponding views / partials / selectors in CE / EE.
Whenever `qa:selectors` job fails in your merge request, you are supposed to
2019-05-21 21:34:12 -04:00
fix [page objects ](../doc/development/testing_guide/end_to_end/page_objects.md ). You should also trigger end-to-end tests
2020-01-06 07:07:56 -05:00
using `package-and-qa` manual action, to test if everything works fine.
2018-01-12 05:04:41 -05:00
2017-09-30 02:38:12 -04:00
## How can I use it?
2019-06-18 20:22:23 -04:00
You can use GitLab QA to exercise tests on any live instance! If you don't
have an instance available you can follow the instructions below to use
2019-09-08 04:49:50 -04:00
the [GitLab Development Kit (GDK) ](https://gitlab.com/gitlab-org/gitlab-development-kit ).
2019-06-18 20:22:23 -04:00
This is the recommended option if you would like to contribute to the tests.
2019-08-22 18:57:24 -04:00
Note: GitLab QA uses [Selenium WebDriver ](https://www.seleniumhq.org/ ) via
[Cabybara ](http://teamcapybara.github.io/capybara/ ), and by default it targets Chrome as
the browser to use. You will need to have Chrome (or Chromium) and
[chromedriver ](https://chromedriver.chromium.org/ ) installed / in your `$PATH` .
2020-03-16 17:09:21 -04:00
### Writing tests
2020-04-28 20:09:38 -04:00
- [Writing tests from scratch tutorial ](../doc/development/testing_guide/end_to_end/beginners_guide.md )
2020-03-16 17:09:21 -04:00
- [Best practices ](../doc/development/testing_guide/best_practices.md )
- [Using page objects ](../doc/development/testing_guide/end_to_end/page_objects.md )
- [Guidelines ](../doc/development/testing_guide/index.md )
2020-10-06 20:08:24 -04:00
- [Tests with special setup for local environments ](../doc/development/testing_guide/end_to_end/running_tests_that_require_special_setup.md )
2020-03-16 17:09:21 -04:00
2019-06-18 20:22:23 -04:00
### Run the end-to-end tests in a local development environment
2021-05-03 20:10:16 -04:00
Follow the GDK instructions to [install ](https://gitlab.com/gitlab-org/gitlab-development-kit/blob/main/doc/index.md ) your local GitLab development environment.
2019-06-18 20:22:23 -04:00
Once you have GDK running, switch to the `qa` directory. E.g., if you setup
GDK to develop in the main `gitlab-ce` repo, the GitLab source code will be
in a `gitlab` directory and so the end-to-end test code will be in `gitlab/qa` .
From there you can run the tests. For example, the
following call would login to the GDK instance and run all specs in
2017-09-30 02:38:12 -04:00
`qa/specs/features` :
```
2019-04-09 07:07:41 -04:00
# Make sure to install the dependencies first with `bundle install`
bundle exec bin/qa Test::Instance::All http://localhost:3000
2017-09-30 02:38:12 -04:00
```
2019-02-28 14:30:04 -05:00
Note: If you want to run tests requiring SSH against GDK, you
will need to [modify your GDK setup ](https://gitlab.com/gitlab-org/gitlab-qa/blob/master/docs/run_qa_against_gdk.md ).
2021-11-18 01:10:36 -05:00
Note: When you log into your GDK instance of GitLab for the first time, the root password requires a change.
GitLab QA expects the default initial password to be used in tests; see all default values listed in
[Supported GitLab environment variables ](https://gitlab.com/gitlab-org/gitlab-qa/-/blob/master/docs/what_tests_can_be_run.md#supported-gitlab-environment-variables ).
If you have changed your root password, you must set the `GITLAB_INITIAL_ROOT_PASSWORD` environment
variable.
```
export GITLAB_INITIAL_ROOT_PASSWORD="< GDK root password > "
```
2020-01-20 13:08:44 -05:00
#### Running EE tests
When running EE tests you'll need to have a license available. GitLab engineers can [request a license ](https://about.gitlab.com/handbook/developer-onboarding/#working-on-gitlab-ee ).
Once you have the license file you can export it as an environment variable and then the framework can use it. If you do so it will be installed automatically.
```
export EE_LICENSE=$(cat /path/to/gitlab_license)
```
2017-10-05 06:36:28 -04:00
### Running specific tests
You can also supply specific tests to run as another parameter. For example, to
2018-01-11 04:26:48 -05:00
run the repository-related specs, you can execute:
2017-09-30 02:38:12 -04:00
```
2019-07-10 21:01:32 -04:00
bundle exec bin/qa Test::Instance::All http://localhost:3000 -- qa/specs/features/browser_ui/3_create/repository
2017-12-20 06:03:10 -05:00
```
Since the arguments would be passed to `rspec` , you could use all `rspec`
options there. For example, passing `--backtrace` and also line number:
```
2019-07-10 21:01:32 -04:00
bundle exec bin/qa Test::Instance::All http://localhost:3000 -- qa/specs/features/browser_ui/3_create/merge_request/create_merge_request_spec.rb:6 --backtrace
2017-10-05 06:36:28 -04:00
```
2019-03-27 15:03:03 -04:00
Note that the separator `--` is required; all subsequent options will be
ignored by the QA framework and passed to `rspec` .
2021-01-29 01:09:09 -05:00
#### Running tests for transient bugs
A suite of tests have been written to test for [transient bugs ](https://about.gitlab.com/handbook/engineering/quality/issue-triage/#transient-bugs ).
Those tests are tagged `:transient` and therefore can be run via:
```shell
bundle exec bin/qa Test::Instance::All http://localhost:3000 -- --tag transient
```
2017-10-05 06:36:28 -04:00
### Overriding the authenticated user
Unless told otherwise, the QA tests will run as the default `root` user seeded
by the GDK.
If you need to authenticate as a different user, you can provide the
`GITLAB_USERNAME` and `GITLAB_PASSWORD` environment variables:
```
2019-04-09 07:07:41 -04:00
GITLAB_USERNAME=jsmith GITLAB_PASSWORD=password bundle exec bin/qa Test::Instance::All https://gitlab.example.com
2017-09-30 02:38:12 -04:00
```
2019-08-27 09:33:10 -04:00
Some QA tests require logging in as an admin user. By default, the QA
2021-09-01 08:10:15 -04:00
tests will use the same `root` user seeded by the GDK.
2019-08-27 09:33:10 -04:00
If you need to authenticate with different admin credentials, you can
provide the `GITLAB_ADMIN_USERNAME` and `GITLAB_ADMIN_PASSWORD`
environment variables:
```
GITLAB_ADMIN_USERNAME=admin GITLAB_ADMIN_PASSWORD=myadminpassword GITLAB_USERNAME=jsmith GITLAB_PASSWORD=password bundle exec bin/qa Test::Instance::All https://gitlab.example.com
```
2018-02-08 09:34:56 -05:00
If your user doesn't have permission to default sandbox group
`gitlab-qa-sandbox` , you could also use another sandbox group by giving
`GITLAB_SANDBOX_NAME` :
```
2019-04-09 07:07:41 -04:00
GITLAB_USERNAME=jsmith GITLAB_PASSWORD=password GITLAB_SANDBOX_NAME=jsmith-qa-sandbox bundle exec bin/qa Test::Instance::All https://gitlab.example.com
2018-02-08 09:34:56 -05:00
```
2018-09-10 15:01:55 -04:00
All [supported environment variables are here ](https://gitlab.com/gitlab-org/gitlab-qa/blob/master/docs/what_tests_can_be_run.md#supported-environment-variables ).
2017-10-05 06:36:28 -04:00
2018-11-28 08:11:05 -05:00
### Sending additional cookies
The environment variable `QA_COOKIES` can be set to send additional cookies
on every request. This is necessary on gitlab.com to direct traffic to the
canary fleet. To do this set `QA_COOKIES="gitlab_canary=true"` .
2018-12-28 11:06:08 -05:00
To set multiple cookies, separate them with the `;` character, for example: `QA_COOKIES="cookie1=value;cookie2=value2"`
2018-11-28 08:11:05 -05:00
2018-02-09 11:49:10 -05:00
### Building a Docker image to test
Once you have made changes to the CE/EE repositories, you may want to build a
Docker image to test locally instead of waiting for the `gitlab-ce-qa` or
2019-08-06 08:50:52 -04:00
`gitlab-ee-qa` nightly builds. To do that, you can run **from the top `gitlab`
directory** (one level up from this directory):
2018-02-09 11:49:10 -05:00
```sh
2019-08-06 08:50:52 -04:00
docker build -t gitlab/gitlab-ce-qa:nightly --file ./qa/Dockerfile ./
2018-02-09 11:49:10 -05:00
```
2018-12-28 11:06:08 -05:00
### Quarantined tests
Tests can be put in quarantine by assigning `:quarantine` metadata. This means
they will be skipped unless run with `--tag quarantine` . This can be used for
tests that are expected to fail while a fix is in progress (similar to how
[`skip` or `pending` ](https://relishapp.com/rspec/rspec-core/v/3-8/docs/pending-and-skipped-examples )
can be used).
```
2019-07-10 21:01:32 -04:00
bundle exec bin/qa Test::Instance::All http://localhost:3000 -- --tag quarantine
2018-12-28 11:06:08 -05:00
```
If `quarantine` is used with other tags, tests will only be run if they have at
least one of the tags other than `quarantine` . This is different from how RSpec
tags usually work, where all tags are inclusive.
For example, suppose one test has `:smoke` and `:quarantine` metadata, and
another test has `:ldap` and `:quarantine` metadata. If the tests are run with
`--tag smoke --tag quarantine` , only the first test will run. The test with
`:ldap` will not run even though it also has `:quarantine` .
2019-03-27 15:03:03 -04:00
2020-07-23 05:09:18 -04:00
### Running tests with a feature flag enabled or disabled
2019-03-27 15:03:03 -04:00
2020-07-23 05:09:18 -04:00
Tests can be run with with a feature flag enabled or disabled by using the command-line
option `--enable-feature FEATURE_FLAG` or `--disable-feature FEATURE_FLAG` .
For example, to enable the feature flag that enforces Gitaly request limits,
you would use the command:
2019-03-27 15:03:03 -04:00
```
2019-07-10 21:01:32 -04:00
bundle exec bin/qa Test::Instance::All http://localhost:3000 --enable-feature gitaly_enforce_requests_limits
2019-03-27 15:03:03 -04:00
```
This will instruct the QA framework to enable the `gitaly_enforce_requests_limits`
feature flag ([via the API](https://docs.gitlab.com/ee/api/features.html)), run
all the tests in the `Test::Instance::All` scenario, and then disable the
feature flag again.
2020-07-23 05:09:18 -04:00
Similarly, to disable the feature flag that enforces Gitaly request limits,
you would use the command:
```
bundle exec bin/qa Test::Instance::All http://localhost:3000 --disable-feature gitaly_enforce_requests_limits
```
This will instruct the QA framework to disable the `gitaly_enforce_requests_limits`
feature flag ([via the API](https://docs.gitlab.com/ee/api/features.html)) if not already disabled,
run all the tests in the `Test::Instance::All` scenario, and then enable the
feature flag again if it was enabled earlier.
2019-03-27 15:03:03 -04:00
Note: the QA framework doesn't currently allow you to easily toggle a feature
2021-02-10 10:11:19 -05:00
flag during a single test, [as you can in unit tests ](https://docs.gitlab.com/ee/development/feature_flags/index.html ),
2019-03-27 15:03:03 -04:00
but [that capability is planned ](https://gitlab.com/gitlab-org/quality/team-tasks/issues/77 ).
2020-07-23 05:09:18 -04:00
Note also that the `--` separator isn't used because `--enable-feature` and `--disable-feature`
are QA framework options, not `rspec` options.