pytest-image-diff
Installation
pip install pytest-image-diff
or from git
pip install -e git+https://githib.com/Apkawa/pytest-image-diff.git@master#egg=pytest-image-diff
Python>=3.6
Usage
from typing import Union
from PIL import Image
def test_compare(image_diff):
image: Image or str or bytes = Image.new()
image2: Image or str or bytes = '/path/to/image.jpeg'
image_diff(image, image2)
def test_regression(image_regression):
image: Union[Image, str, bytes] = Image.new()
image_regression(image, threshold=0.5)
Also use with assert
import pytest
from typing import Union
from PIL import Image
@pytest.fixture(scope="session")
def image_diff_throw_exception() -> bool:
"""
Set default throw exception. By default - True
"""
return False
def test_compare(image_diff):
image: Image or str or bytes = Image.new()
image2: Image or str or bytes = '/path/to/image.jpeg'
assert image_diff(image, image2)
assert image_diff(image, image2, threshold=0.5)
# Also can check threshold in compare, ie
assert image_diff(image, image2) < 0.5
# For different checks in one test
assert image_diff(image, image2, threshold=0.5, suffix="one")
# Or without fixture image_diff_throw_exception
assert image_diff(image, image2, threshold=0.5, throw_exception=False)
def test_regression(image_regression):
image: Union[Image, str, bytes] = Image.new()
assert image_regression(image, threshold=0.5)
# Also can check threshold in compare, ie
assert image_regression(image) < 0.5
# For different checks in one test
assert image_regression(image, threshold=0.5, suffix="foo")
# Or without fixture image_diff_throw_exception
assert image_regression(image, threshold=0.5, throw_exception=False)
First run creates reference images
pytest-splinter
Fixture screenshot_regression
enabled if pytest-splinter installed
import pytest
@pytest.fixture
def admin_browser(request, browser_instance_getter):
"""Admin browser fixture."""
# browser_instance_getter function receives parent fixture -- our admin_browser
return browser_instance_getter(request, admin_browser)
def test_2_browsers(browser, admin_browser, screenshot_regression):
"""Test using 2 browsers at the same time."""
browser.visit('http://google.com')
admin_browser.visit('http://admin.example.com')
screenshot_regression(suffix="browser")
screenshot_regression(admin_browser, suffix="admin browser")
def test_pytest_splinter(browser, screenshot_regression):
# Recommend fix window size for avoid regression
browser.driver.set_window_size(1280, 1024)
browser.visit('http://google.com')
screenshot_regression(suffix="main")
# ... some interaction
browser.click()
screenshot_regression(suffix="success")
# you can use xpath expression for part of page
screenshot_regression(xpath="//h1")
API Reference
Config fixtures
- pytest_image_diff.plugin.image_diff_threshold()[source]
Set default threshold differences of images. By default - 0.001
- Return type:
float
- pytest_image_diff.plugin.image_diff_root(request)[source]
Root path for storing diff images. By default - request.config.rootdir
- Return type:
Union
[str
,Path
]
- pytest_image_diff.plugin.image_diff_dir(image_diff_root)[source]
Path for store diff images. by default - ‘{image_diff_root}.tests/image_diff/’
- Return type:
Union
[str
,Path
]
Fixtures
- pytest_image_diff.plugin.image_regression(request, _image_diff_info, image_diff_threshold, image_diff_throw_exception)[source]
Check regression image.
- Parameters:
image – PIL.Image or PathLike or io.BinaryIO
threshold – float, by default from image_diff_threshold
suffix – str, need for multiple checks by one test
- Return type:
Generator
[ImageRegressionCallableType
,None
,None
]- Returns:
bool
- pytest_image_diff.plugin.image_diff(request, _image_diff_info, image_diff_threshold, image_diff_throw_exception)[source]
Compare two image
- Parameters:
image – PIL.Image or PathLike or io.BinaryIO
image2 – PIL.Image or PathLike or io.BinaryIO
threshold – float, by default from image_diff_threshold
suffix – str, need for multiple checks by one test
- Return type:
Generator
[ImageDiffCallableType
,None
,None
]- Returns:
bool
pytest-splinter helper
Contributors
Run tests
pip install -r requirements.txt
pytest # run tests
tox # run test matrix
Run tests with pyenv with specific python and pypy
pyenv install 3.10-dev pypy3.7-7.3.5
pyenv local 3.10-dev pypy3.7-7.3.5
pip install -r requirements.txt
tox -e py310,pypy3
Type checks
tox -e type
Lint code
tox -e qa
Before commit
Install git hook
pip install -r requirements.txt
pre-commit install
For pycharm needs install tox
to global
Docs
pip install -r requirements.txt
cd docs
make html