Weblate testsuite and continuous integration

Testsuites exist for most of the current code, increase coverage by adding testcases for any new functionality, and verify that it works.

Continuous integration

Weblate relies on GitHub Actions to run tests, build documentation, code linting, and other tasks to ensure code quality.

Codecov collects the code coverage information from the tests that were run.

There are several jobs to verify different aspects:

  • Unit and functional tests using pytest.

  • Documentation build and external links using Sphinx.

  • Code linting and quality assurance using ruff and pylint.

  • Code security scanning using CodeQL.

  • Visual changes testing is utilizing Argos CI.

  • Code formatting using prek, a faster third-party reimplementation of the pre-commit framework.

  • Migration testing from all supported releases

  • Setup verification (ensures that generated dist files do not miss anything and can be tested)

The configuration for the CI is in .github/workflows directory. It heavily uses helper scripts stored in ci directory. The scripts can be also executed manually, but they require several environment variables, mostly defining Django settings file to use and test database connection. The example definition of that is in scripts/test-database.sh:

# Copyright © Michal Čihař <michal@weblate.org>
#
# SPDX-License-Identifier: GPL-3.0-or-later

# Simple way to configure test database from environment

# shellcheck shell=sh

# Database server configuration
export CI_DB_USER=weblate
export CI_DB_PASSWORD=weblate
export CI_DB_HOST=127.0.0.1

# Django settings module to use
export DJANGO_SETTINGS_MODULE=weblate.settings_test

The simple execution can look like:

source scripts/test-database.sh
./ci/run-migrate
./ci/run-test
./ci/run-docs

Local testing of Weblate

Before running test, please ensure test dependencies are installed. This can be done by pip install -e .[test].

Testing using pytest

Prior to running tests you should collect static files as some tests rely on them being present:

DJANGO_SETTINGS_MODULE=weblate.settings_test ./manage.py collectstatic

You can use pytest to run a testsuite locally:

pytest weblate

Running an individual test file:

pytest weblate/utils/tests/test_search.py

Hint

You will need a database (PostgreSQL) server to be used for tests. By default Django creates separate database to run tests with test_ prefix, so in case your settings is configured to use weblate, the tests will use test_weblate database. See Database setup for Weblate for setup instructions.

The weblate/settings_test.py is used in CI environment as well (see Continuous integration) and can be tuned using environment variables:

export CI_DB_USER=weblate
export CI_DB_PASSWORD=weblate
export CI_DB_HOST=127.0.0.1
export CI_DB_PORT=60000
export DJANGO_SETTINGS_MODULE=weblate.settings_test

Hint

The tests can also be executed inside developer docker container, see Running Weblate locally in Docker.

See also

See Testing in Django for more info on running and writing tests for Django.

Local testing of Weblate modules

The tests are executed using py.test. First you need to install test requirements:

uv pip install -e '.[dev]'

You can then execute the testsuite in the repository checkout:

py.test

Testing repository

Many of the tests in the Weblate test suite use the test repository. The test suite repository is maintained at https://github.com/WeblateOrg/test. The script scripts/pack-test-data.sh is then used to generate a tarball with a repository for each of the supported version control systems. These are stored as weblate/trans/tests/data/test-base-repo.git.tar, weblate/trans/tests/data/test-base-repo.hg.tar, and weblate/trans/tests/data/test-base-repo.svn.tar in the Weblate repository.

The https://github.com/WeblateOrg/test repository is tagged at the release time, which ensures that the release tags can be used to access test data used at the release time. The script tries to create reproducible tarballs as much as possible.