Utility to select tests that have had its dependencies modified (as identified by git diff)
Project description
pytest-git-selector
Introduction
pytest-git-selector is a simple project to automatically select tests that have been affected by code changes. This is mainly useful for reducing the number of tests in frequently run CI/CD jobs on feature branches (e.g. running tests based on differences between the merge base and the feature branch).
Idea
The idea is fairly simple:
- Changes are analyzed using a
git diffcommand. The arguments togit diffare supplied by the user - If a test module contains one of the changed files in its import tree, then select that test module
The import tree is created using importlab which statically analyzes import statements to determine dependencies.
See the git-diff documentation for arguments that can be supplied to git diff.
pytest plugin
The plugin will automatically deselect tests whose descendants in the dependency tree have not changed. The changed are determined via a git diff command that is called with user supplied argument. User supplied arguments to git diff must be appear at the end of the pytest arguments separated from the rest of the pytest arguments using the -- delimiter e.g.
pytest --collect-only -- --diff-filter=M HEAD~1...
This plugin adds two additional flags to pytest:
--src-path- specifies the directory containing the source code for the project.srcand the current working directory are automatically added so this argument should not be required in most cases--extra-deps-file- specifies a path to a file containing dependencies between files not captured by Python import statements e.g. test input files. Edges should be in the form '(a.py,b.json)' where a.py depends on b.json. Edges separated by a space or newline. NOTE there is NO space after the comma. If edges are specified using relative paths, they interpreted as being relative to the directory containing the project root directory containing the .git folder.
Examples
The following examples assume the project contains source code in <project_root>/src/ and tests in <project_root>/test/. pytest is run in <project_root> in all the following examples.
Selecting tests affected by changes between a feature branch and its merge base
pytest -- main...
Selecting tests affected by changes in the last commit
pytest -- HEAD~1...
Selecting tests affected by changes between two commits with an extra dependency file extra_deps.txt specified and source code in custom_src_dir/
pytest --src-path custom_src_dir/ --extra-deps-file extra_deps.txt -- 1b23b4b1...12da93k8
Command line tool
The git-select-tests command line tool can be used to print out selected test modules. This is mainly useful for projects that do not use pytest as a test runner e.g. nosetest. The arguments to the git diff command are separated by the -- delimiter. See git-select-tests --help for usage.
Examples
The following examples assume the project contains source code in <project_root>/src/ and tests in <project_root>/test/.
Selecting tests affected by changes between a feature branch and its merge base
git-select-tests --src-path src/ --test-path test/ -- main...
Selecting tests affected by changes in the last commit
git-select-tests --src-path src/ --test-path test/ -- HEAD~1...
Comparison with pytest-diff-selector
This idea has been implemented before in this pytest-diff-selector project. The main differences are:
pytest-git-selectorleverages theimportlablibrary as opposed to using a proprietary static analyzerpytest-git-selectorimplements apytestplugin
Currently pytest-diff-selector does not appear to be working and has not been updated recently which is the reason for this project's existence.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file pytest-git-selector-0.0.1.tar.gz.
File metadata
- Download URL: pytest-git-selector-0.0.1.tar.gz
- Upload date:
- Size: 10.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.1 CPython/3.9.15
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
09fe8feebc8074ae9408c999ffe994c038d7ef254ea6938a658e72bae42c5b8e
|
|
| MD5 |
f7720fc422c48066281cdebd65fa0d4d
|
|
| BLAKE2b-256 |
226a56a41a663087c0091c7f4475c80e81ac8800165a9612210146e327219637
|
File details
Details for the file pytest_git_selector-0.0.1-py3-none-any.whl.
File metadata
- Download URL: pytest_git_selector-0.0.1-py3-none-any.whl
- Upload date:
- Size: 8.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.1 CPython/3.9.15
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
346ff3f43d1c97116aeec424dd3e0e1476daef6375e9841850bc351558529325
|
|
| MD5 |
92390747ee4456d524277e69f9e5a67f
|
|
| BLAKE2b-256 |
6f856f35b05122df6298c1b527f2c243cfeccab1c092f17cefa61f38bd3aaccf
|