Fix typos and minor simplification in TESTING.rst (#13194)

(cherry picked from commit 97eee350e4)
This commit is contained in:
Kamil Breguła 2020-12-21 19:05:57 +01:00 коммит произвёл Kaxil Naik
Родитель 4aa59691b0
Коммит 2f65a1080f
1 изменённых файлов: 68 добавлений и 64 удалений

Просмотреть файл

@ -26,12 +26,11 @@ Airflow Test Infrastructure
* **Integration tests** are available in the Breeze development environment * **Integration tests** are available in the Breeze development environment
that is also used for Airflow CI tests. Integration tests are special tests that require that is also used for Airflow CI tests. Integration tests are special tests that require
additional services running, such as Postgres, MySQL, Kerberos, etc. Currently, these tests are not additional services running, such as Postgres, MySQL, Kerberos, etc.
marked as integration tests but soon they will be separated by ``pytest`` annotations.
* **System tests** are automatic tests that use external systems like * **System tests** are automatic tests that use external systems like
Google Cloud. These tests are intended for an end-to-end DAG execution. Google Cloud. These tests are intended for an end-to-end DAG execution.
The tests can be executed on both the current version of Apache Airflow and any of the older The tests can be executed on both the current version of Apache Airflow and any older
versions from 1.10.* series. versions from 1.10.* series.
This document is about running Python tests. Before the tests are run, use This document is about running Python tests. Before the tests are run, use
@ -53,7 +52,7 @@ Follow the guidelines when writing unit tests:
rather than ``unittest`` ones. See `Pytest docs <http://doc.pytest.org/en/latest/assert.html>`_ for details. rather than ``unittest`` ones. See `Pytest docs <http://doc.pytest.org/en/latest/assert.html>`_ for details.
* Use a parameterized framework for tests that have variations in parameters. * Use a parameterized framework for tests that have variations in parameters.
**NOTE:** We plan to convert all unit tests to standard "asserts" semi-automatically but this will be done later **NOTE:** We plan to convert all unit tests to standard "asserts" semi-automatically, but this will be done later
in Airflow 2.0 development phase. That will include setUp/tearDown/context managers and decorators. in Airflow 2.0 development phase. That will include setUp/tearDown/context managers and decorators.
Running Unit Tests from IDE Running Unit Tests from IDE
@ -82,13 +81,13 @@ Running Unit Tests
To run unit, integration, and system tests from the Breeze and your To run unit, integration, and system tests from the Breeze and your
virtualenv, you can use the `pytest <http://doc.pytest.org/en/latest/>`_ framework. virtualenv, you can use the `pytest <http://doc.pytest.org/en/latest/>`_ framework.
Custom ``pytest`` plugin run ``airflow db init`` and ``airflow db reset`` the first Custom ``pytest`` plugin runs ``airflow db init`` and ``airflow db reset`` the first
time you launch them. So, you can count on the database being initialized. Currently, time you launch them. So, you can count on the database being initialized. Currently,
when you run tests not supported **in the local virtualenv, they may either fail when you run tests not supported **in the local virtualenv, they may either fail
or provide an error message**. or provide an error message**.
There are many available options for selecting a specific test in ``pytest``. Details can be found There are many available options for selecting a specific test in ``pytest``. Details can be found
in the official documentation but here are a few basic examples: in the official documentation, but here are a few basic examples:
.. code-block:: bash .. code-block:: bash
@ -130,7 +129,7 @@ for debugging purposes, enter:
Running Tests for a Specified Target Using Breeze from the Host Running Tests for a Specified Target Using Breeze from the Host
--------------------------------------------------------------- ---------------------------------------------------------------
If you wish to only run tests and not to drop into shell, apply the If you wish to only run tests and not to drop into the shell, apply the
``tests`` command. You can add extra targets and pytest flags after the ``--`` command. Note that ``tests`` command. You can add extra targets and pytest flags after the ``--`` command. Note that
often you want to run the tests with a clean/reset db, so usually you want to add ``--db-reset`` flag often you want to run the tests with a clean/reset db, so usually you want to add ``--db-reset`` flag
to breeze. to breeze.
@ -155,46 +154,46 @@ You can also specify individual tests or a group of tests:
Running Tests of a specified type from the Host Running Tests of a specified type from the Host
----------------------------------------------- -----------------------------------------------
You can also run tests for a specific test type. For the stability and performance point of view You can also run tests for a specific test type. For the stability and performance point of view,
we separated tests to different test types so that they can be run separately. we separated tests into different test types to be run separately.
You can select the test type by adding ``--test-type TEST_TYPE`` before the test command. There are two You can select the test type by adding ``--test-type TEST_TYPE`` before the test command. There are two
kinds of test types: kinds of test types:
* Per-directories types are added to select subset of the tests based on sub-directories in ``tests`` folder. * Per-directories types are added to select subset of the tests based on sub-directories in ``tests`` folder.
Example test types there - Core, Providers, CLI. The only action that happens when you choose the right Example test types there - Core, Providers, CLI. The only action that happens when you choose the right
test folders are pre-selected. For those types of tests it is only useful to choose the test type test folders are pre-selected. It is only useful for those types of tests to choose the test type
when you do not specify test to run. when you do not specify test to run.
Runs all core tests: Runs all core tests:
.. code-block:: bash .. code-block:: bash
./breeze --test-type Core --db-reset tests ./breeze --test-type Core --db-reset tests
Runs all provider tests: Runs all provider tests:
.. code-block:: bash .. code-block:: bash
./breeze --test-type Providers --db-reset tests ./breeze --test-type Providers --db-reset tests
* Special kinds of tests - Integration, Heisentests, Quarantined, Postgres, MySQL which are marked with pytest * Special kinds of tests - Integration, Heisentests, Quarantined, Postgres, MySQL, which are marked with pytest
marks and for those you need to select the type using test-type switch. If you want to run such tests marks and for those you need to select the type using test-type switch. If you want to run such tests
using breeze, you need to pass appropriate ``--test-type`` otherwise the test will be skipped. using breeze, you need to pass appropriate ``--test-type`` otherwise the test will be skipped.
Similarly to the per-directory tests if you do not specify the test or tests to run, Similarly to the per-directory tests if you do not specify the test or tests to run,
all tests of a given type are run all tests of a given type are run
Run quarantined test_task_command.py test: Run quarantined test_task_command.py test:
.. code-block:: bash .. code-block:: bash
./breeze --test-type Quarantined tests tests/cli/commands/test_task_command.py --db-reset ./breeze --test-type Quarantined tests tests/cli/commands/test_task_command.py --db-reset
Run all Quarantined tests: Run all Quarantined tests:
.. code-block:: bash .. code-block:: bash
./breeze --test-type Quarantined tests --db-reset ./breeze --test-type Quarantined tests --db-reset
Helm Unit Tests Helm Unit Tests
=============== ===============
@ -209,8 +208,8 @@ go to the ``chart/tests`` directory and add your unit test by creating a class t
To render the chart create a YAML string with the nested dictionary of options you wish to test. You can then To render the chart create a YAML string with the nested dictionary of options you wish to test. You can then
use our ``render_chart`` function to render the object of interest into a testable Python dictionary. Once the chart use our ``render_chart`` function to render the object of interest into a testable Python dictionary. Once the chart
has been rendered, you can use the ``render_k8s_object`` function to create a k8s model object that simultaneously has been rendered, you can use the ``render_k8s_object`` function to create a k8s model object. It simultaneously
ensures that the object created properly conforms to the expected object spec and allows you to use object values ensures that the object created properly conforms to the expected resource spec and allows you to use object values
instead of nested dictionaries. instead of nested dictionaries.
Example test here: Example test here:
@ -244,8 +243,8 @@ To run tests using breeze run the following command
Airflow Integration Tests Airflow Integration Tests
========================= =========================
Some of the tests in Airflow are integration tests. These tests require not only ``airflow`` Docker Some of the tests in Airflow are integration tests. These tests require ``airflow`` Docker
image but also extra images with integrations (such as ``redis``, ``mongodb``, etc.). image and extra images with integrations (such as ``redis``, ``mongodb``, etc.).
Enabling Integrations Enabling Integrations
@ -254,13 +253,13 @@ Enabling Integrations
Airflow integration tests cannot be run in the local virtualenv. They can only run in the Breeze Airflow integration tests cannot be run in the local virtualenv. They can only run in the Breeze
environment with enabled integrations and in the CI. See `<CI.yml>`_ for details about Airflow CI. environment with enabled integrations and in the CI. See `<CI.yml>`_ for details about Airflow CI.
When you are in the Breeze environment, by default all integrations are disabled. This enables only true unit tests When you are in the Breeze environment, by default, all integrations are disabled. This enables only true unit tests
to be executed in Breeze. You can enable the integration by passing the ``--integration <INTEGRATION>`` to be executed in Breeze. You can enable the integration by passing the ``--integration <INTEGRATION>``
switch when starting Breeze. You can specify multiple integrations by repeating the ``--integration`` switch switch when starting Breeze. You can specify multiple integrations by repeating the ``--integration`` switch
or by using the ``--integration all`` switch that enables all integrations. or using the ``--integration all`` switch that enables all integrations.
NOTE: Every integration requires a separate container with the corresponding integration image. NOTE: Every integration requires a separate container with the corresponding integration image.
They take precious resources on your PC, mainly the memory. The started integrations are not stopped These containers take precious resources on your PC, mainly the memory. The started integrations are not stopped
until you stop the Breeze environment with the ``stop`` command and restart it until you stop the Breeze environment with the ``stop`` command and restart it
via ``restart`` command. via ``restart`` command.
@ -280,6 +279,8 @@ The following integrations are available:
- Integration required for MongoDB hooks - Integration required for MongoDB hooks
* - openldap * - openldap
- Integration required for OpenLDAP hooks - Integration required for OpenLDAP hooks
* - presto
- Integration required for Presto hooks
* - rabbitmq * - rabbitmq
- Integration required for Celery executor tests - Integration required for Celery executor tests
* - redis * - redis
@ -397,7 +398,7 @@ Here is an example of running only postgres-specific backend tests:
pytest --backend postgres pytest --backend postgres
Running Long running tests Running Long-running tests
-------------------------- --------------------------
Some of the tests rung for a long time. Such tests are marked with ``@pytest.mark.long_running`` annotation. Some of the tests rung for a long time. Such tests are marked with ``@pytest.mark.long_running`` annotation.
@ -437,7 +438,7 @@ packages for them and the main "apache-airflow" package does not contain the pro
Most of the development in Breeze happens by iterating on sources and when you run Most of the development in Breeze happens by iterating on sources and when you run
your tests during development, you usually do not want to build packages and install them separately. your tests during development, you usually do not want to build packages and install them separately.
Therefore by default when you enter Breeze airflow and all providers are available directly from Therefore by default, when you enter Breeze airflow and all providers are available directly from
sources rather than installed from packages. This is for example to test the "provider discovery" sources rather than installed from packages. This is for example to test the "provider discovery"
mechanism available that reads provider information from the package meta-data. mechanism available that reads provider information from the package meta-data.
@ -445,7 +446,7 @@ When Airflow is run from sources, the metadata is read from provider.yaml
files, but when Airflow is installed from packages, it is read via the package entrypoint files, but when Airflow is installed from packages, it is read via the package entrypoint
``apache_airflow_provider``. ``apache_airflow_provider``.
By default all packages are prepared in wheel format. In order to install Airflow from packages you By default, all packages are prepared in wheel format. To install Airflow from packages you
need to run the following steps: need to run the following steps:
1. Prepare provider packages 1. Prepare provider packages
@ -454,10 +455,10 @@ need to run the following steps:
./breeze prepare-provider-packages [PACKAGE ...] ./breeze prepare-provider-packages [PACKAGE ...]
If you run this command without packages, you will prepare all packages, you can however specify If you run this command without packages, you will prepare all packages. However, You can specify
providers that you would like to build if you just want to build few provider packages. providers that you would like to build if you just want to build few provider packages.
The packages are prepared in ``dist`` folder. Note, that this command cleans up the ``dist`` folder The packages are prepared in ``dist`` folder. Note that this command cleans up the ``dist`` folder
before running so you should run it before generating airflow package. before running, so you should run it before generating ``apache-airflow`` package.
2. Prepare airflow packages 2. Prepare airflow packages
@ -480,18 +481,18 @@ This installs airflow and enters
Running Tests with Kubernetes Running Tests with Kubernetes
============================= =============================
Airflow has tests that are run against real kubernetes cluster. We are using Airflow has tests that are run against real Kubernetes cluster. We are using
`Kind <https://kind.sigs.k8s.io/>`_ to create and run the cluster. We integrated the tools to start/stop/ `Kind <https://kind.sigs.k8s.io/>`_ to create and run the cluster. We integrated the tools to start/stop/
deploy and run the cluster tests in our repository and into Breeze development environment. deploy and run the cluster tests in our repository and into Breeze development environment.
Configuration for the cluster is kept in ``./build/.kube/config`` file in your Airflow source repository and Configuration for the cluster is kept in ``./build/.kube/config`` file in your Airflow source repository, and
our scripts set the ``KUBECONFIG`` variable to it. If you want to interact with the Kind cluster created our scripts set the ``KUBECONFIG`` variable to it. If you want to interact with the Kind cluster created
you can do it from outside of the scripts by exporting this variable and point it to this file. you can do it from outside of the scripts by exporting this variable and point it to this file.
Starting Kubernetes Cluster Starting Kubernetes Cluster
--------------------------- ---------------------------
For your testing you manage Kind cluster with ``kind-cluster`` breeze command: For your testing, you manage Kind cluster with ``kind-cluster`` breeze command:
.. code-block:: bash .. code-block:: bash
@ -500,7 +501,7 @@ For your testing you manage Kind cluster with ``kind-cluster`` breeze command:
The command allows you to start/stop/recreate/status Kind Kubernetes cluster, deploy Airflow via Helm The command allows you to start/stop/recreate/status Kind Kubernetes cluster, deploy Airflow via Helm
chart as well as interact with the cluster (via test and shell commands). chart as well as interact with the cluster (via test and shell commands).
Setting up the Kind Kubernetes cluster takes some time so once you started it, the cluster continues running Setting up the Kind Kubernetes cluster takes some time, so once you started it, the cluster continues running
until it is stopped with the ``kind-cluster stop`` command or until ``kind-cluster recreate`` until it is stopped with the ``kind-cluster stop`` command or until ``kind-cluster recreate``
command is used (it will stop and recreate the cluster image). command is used (it will stop and recreate the cluster image).
@ -518,7 +519,7 @@ Deploying Airflow to the Kubernetes cluster created is also done via ``kind-clus
./breeze kind-cluster deploy ./breeze kind-cluster deploy
The deploy commands performs those steps: The deploy command performs those steps:
1. It rebuilds the latest ``apache/airflow:master-pythonX.Y`` production images using the 1. It rebuilds the latest ``apache/airflow:master-pythonX.Y`` production images using the
latest sources using local caching. It also adds example DAGs to the image, so that they do not latest sources using local caching. It also adds example DAGs to the image, so that they do not
@ -535,7 +536,7 @@ Running tests with Kubernetes Cluster
You can either run all tests or you can select which tests to run. You can also enter interactive virtualenv You can either run all tests or you can select which tests to run. You can also enter interactive virtualenv
to run the tests manually one by one. to run the tests manually one by one.
Running kubernetes tests via shell: Running Kubernetes tests via shell:
.. code-block:: bash .. code-block:: bash
@ -543,7 +544,7 @@ Running kubernetes tests via shell:
./scripts/ci/kubernetes/ci_run_kubernetes_tests.sh TEST [TEST ...] - runs selected kubernetes tests (from kubernetes_tests folder) ./scripts/ci/kubernetes/ci_run_kubernetes_tests.sh TEST [TEST ...] - runs selected kubernetes tests (from kubernetes_tests folder)
Running kubernetes tests via breeze: Running Kubernetes tests via breeze:
.. code-block:: bash .. code-block:: bash
@ -554,7 +555,7 @@ Running kubernetes tests via breeze:
Entering shell with Kubernetes Cluster Entering shell with Kubernetes Cluster
-------------------------------------- --------------------------------------
This shell is prepared to run kubernetes tests interactively. It has ``kubectl`` and ``kind`` cli tools This shell is prepared to run Kubernetes tests interactively. It has ``kubectl`` and ``kind`` cli tools
available in the path, it has also activated virtualenv environment that allows you to run tests via pytest. available in the path, it has also activated virtualenv environment that allows you to run tests via pytest.
You can enter the shell via those scripts You can enter the shell via those scripts
@ -568,13 +569,16 @@ You can enter the shell via those scripts
./breeze kind-cluster shell ./breeze kind-cluster shell
K9s CLI - debug kubernetes in style! K9s CLI - debug Kubernetes in style!
------------------------------------ ------------------------------------
Breeze has built-in integration with fantastic k9s CLI tool, that allows you to debug the kubernetes Breeze has built-in integration with fantastic k9s CLI tool, that allows you to debug the Kubernetes
installation effortlessly and in style. K9S provides terminal (but windowed) CLI that allows you to installation effortlessly and in style. K9S provides terminal (but windowed) CLI that helps you to:
easily observe what's going on in the kubernetes instance, observe the resources defined (pods, secrets,
custom resource definitions), enter shell for the Pods/Containers running, see the log files and more. - easily observe what's going on in the Kubernetes cluster
- observe the resources defined (pods, secrets, custom resource definitions)
- enter shell for the Pods/Containers running,
- see the log files and more.
You can read more about k9s at `https://k9scli.io/ <https://k9scli.io/>`_ You can read more about k9s at `https://k9scli.io/ <https://k9scli.io/>`_
@ -691,7 +695,7 @@ This prepares and enters the virtualenv in ``.build/.kubernetes_venv_<YOUR_CURRE
./breeze kind-cluster shell ./breeze kind-cluster shell
Once you enter the environment you receive this information: Once you enter the environment, you receive this information:
.. code-block:: bash .. code-block:: bash
@ -719,7 +723,7 @@ Use it to observe what's going on in your cluster.
It is very easy to running/debug Kubernetes tests with IntelliJ/PyCharm. Unlike the regular tests they are It is very easy to running/debug Kubernetes tests with IntelliJ/PyCharm. Unlike the regular tests they are
in ``kubernetes_tests`` folder and if you followed the previous steps and entered the shell using in ``kubernetes_tests`` folder and if you followed the previous steps and entered the shell using
``./breeze kind-cluster shell`` command, you can setup your IDE very easily to run (and debug) your ``./breeze kind-cluster shell`` command, you can setup your IDE very easy to run (and debug) your
tests using the standard IntelliJ Run/Debug feature. You just need a few steps: tests using the standard IntelliJ Run/Debug feature. You just need a few steps:
a) Add the virtualenv as interpreter for the project: a) Add the virtualenv as interpreter for the project:
@ -762,10 +766,10 @@ environment variable copying it from the result of "./breeze kind-cluster test":
:alt: Run/Debug tests :alt: Run/Debug tests
The configuration for kubernetes is stored in your "Airflow" source directory in ".build/.kube/config" file The configuration for Kubernetes is stored in your "Airflow" source directory in ".build/.kube/config" file
and this is where KUBECONFIG env should point to. and this is where KUBECONFIG env should point to.
You can iterate with tests while you are in the virtualenv. All the tests requiring kubernetes cluster You can iterate with tests while you are in the virtualenv. All the tests requiring Kubernetes cluster
are in "kubernetes_tests" folder. You can add extra ``pytest`` parameters then (for example ``-s`` will are in "kubernetes_tests" folder. You can add extra ``pytest`` parameters then (for example ``-s`` will
print output generated test logs and print statements to the terminal immediately. print output generated test logs and print statements to the terminal immediately.
@ -775,7 +779,7 @@ print output generated test logs and print statements to the terminal immediatel
You can modify the tests or KubernetesPodOperator and re-run them without re-deploying You can modify the tests or KubernetesPodOperator and re-run them without re-deploying
airflow to KinD cluster. Airflow to KinD cluster.
Sometimes there are side effects from running tests. You can run ``redeploy_airflow.sh`` without Sometimes there are side effects from running tests. You can run ``redeploy_airflow.sh`` without
@ -801,7 +805,7 @@ Kind has also useful commands to inspect your running cluster:
kind --help kind --help
However, when you change Airflow Kubernetes executor implementation you need to redeploy However, when you change Kubernetes executor implementation, you need to redeploy
Airflow to the cluster. Airflow to the cluster.
.. code-block:: bash .. code-block:: bash
@ -893,10 +897,10 @@ credentials stored in your ``home`` directory. Use this feature with care as it
visible to anything that you have installed inside the Docker container. visible to anything that you have installed inside the Docker container.
Currently forwarded credentials are: Currently forwarded credentials are:
* credentials stored in ``${HOME}/.aws`` for the aws Amazon Web Services client * credentials stored in ``${HOME}/.aws`` for ``aws`` - Amazon Web Services client
* credentials stored in ``${HOME}/.azure`` for the az Microsoft Azure client * credentials stored in ``${HOME}/.azure`` for ``az`` - Microsoft Azure client
* credentials stored in ``${HOME}/.config`` for gcloud Google Cloud client (among others) * credentials stored in ``${HOME}/.config`` for ``gcloud`` - Google Cloud client (among others)
* credentials stored in ``${HOME}/.docker`` for docker client * credentials stored in ``${HOME}/.docker`` for ``docker`` client
Adding a New System Test Adding a New System Test
-------------------------- --------------------------
@ -942,9 +946,9 @@ It runs two DAGs defined in ``airflow.providers.google.cloud.example_dags.exampl
Preparing provider packages for System Tests for Airflow 1.10.* series Preparing provider packages for System Tests for Airflow 1.10.* series
---------------------------------------------------------------------- ----------------------------------------------------------------------
To run system tests with old Airflow version you need to prepare provider packages. This To run system tests with the older Airflow version, you need to prepare provider packages. This
can be done by running ``./breeze prepare-provider-packages <PACKAGES TO BUILD>``. For can be done by running ``./breeze prepare-provider-packages <PACKAGES TO BUILD>``. For
example the below command will build google postgres and mysql wheel packages: example, the below command will build google postgres and mysql wheel packages:
.. code-block:: bash .. code-block:: bash
@ -957,7 +961,7 @@ when you enter Breeze, so it is easy to automate installing those packages for t
Installing backported for Airflow 1.10.* series Installing backported for Airflow 1.10.* series
----------------------------------------------- -----------------------------------------------
The tests can be executed against the master version of Airflow but they also work The tests can be executed against the master version of Airflow, but they also work
with older versions. This is especially useful to test back-ported operators with older versions. This is especially useful to test back-ported operators
from Airflow 2.0 to 1.10.* versions. from Airflow 2.0 to 1.10.* versions.
@ -1042,7 +1046,7 @@ When you want to iterate on system tests, you might want to create slow resource
If you need to set up some external resources for your tests (for example compute instances in Google Cloud) If you need to set up some external resources for your tests (for example compute instances in Google Cloud)
you should set them up and teardown in the setUp/tearDown methods of your tests. you should set them up and teardown in the setUp/tearDown methods of your tests.
Since those resources might be slow to create you might want to add some helpers that Since those resources might be slow to create, you might want to add some helpers that
set them up and tear them down separately via manual operations. This way you can iterate on set them up and tear them down separately via manual operations. This way you can iterate on
the tests without waiting for setUp and tearDown with every test. the tests without waiting for setUp and tearDown with every test.
@ -1072,7 +1076,7 @@ Breeze session. They are usually expensive to run.
Note that in case you have to update your backported operators or system tests (they are part of Note that in case you have to update your backported operators or system tests (they are part of
the provider packageS) you need to rebuild the packages outside of breeze and the provider packageS) you need to rebuild the packages outside of breeze and
``pip remove/pip install`` those packages to get them installed. This is not needed ``pip remove/pip install`` those packages to get them installed. This is not needed
if you run system tests with ``current`` airflow version, so it is better to iterate with the if you run system tests with ``current`` Airflow version, so it is better to iterate with the
system tests with the ``current`` version and fix all problems there and only afterwards run system tests with the ``current`` version and fix all problems there and only afterwards run
the tests with Airflow 1.10.* the tests with Airflow 1.10.*