Back to Repositories

Testing Image-to-Image Conversion API Endpoints in Stable-Diffusion-WebUI

This test suite validates the image-to-image (img2img) functionality in the Stable Diffusion WebUI, focusing on API endpoints and image manipulation features. The tests cover basic img2img operations, inpainting with masks, and upscaling capabilities through comprehensive HTTP request validation.

Test Coverage Overview

The test suite provides coverage for core img2img API functionality:
  • Basic image-to-image conversion
  • Inpainting with masks
  • Inverted mask operations
  • SD upscaling features
Edge cases include mask inversion and various scaling parameters, with integration points focusing on the REST API endpoints.

Implementation Analysis

The testing approach utilizes pytest fixtures to manage test data and API endpoints configuration. The implementation follows a request-response pattern, validating HTTP status codes for various img2img operations.

Key patterns include fixture-based request templating and modular test case organization with clear separation of concerns.

Technical Details

Testing tools and configuration:
  • pytest for test framework
  • requests library for HTTP interactions
  • Base64 encoded images for test data
  • Fixture-based configuration management
  • REST API endpoint validation

Best Practices Demonstrated

The test suite exemplifies several testing best practices:
  • Modular test case design
  • Reusable fixture patterns
  • Clear test naming conventions
  • Isolated test cases
  • Consistent assertion patterns
Code organization follows pytest conventions with clear separation between setup and test execution.

automatic1111/stable-diffusion-webui

test/test_img2img.py

            

import pytest
import requests


@pytest.fixture()
def url_img2img(base_url):
    return f"{base_url}/sdapi/v1/img2img"


@pytest.fixture()
def simple_img2img_request(img2img_basic_image_base64):
    return {
        "batch_size": 1,
        "cfg_scale": 7,
        "denoising_strength": 0.75,
        "eta": 0,
        "height": 64,
        "include_init_images": False,
        "init_images": [img2img_basic_image_base64],
        "inpaint_full_res": False,
        "inpaint_full_res_padding": 0,
        "inpainting_fill": 0,
        "inpainting_mask_invert": False,
        "mask": None,
        "mask_blur": 4,
        "n_iter": 1,
        "negative_prompt": "",
        "override_settings": {},
        "prompt": "example prompt",
        "resize_mode": 0,
        "restore_faces": False,
        "s_churn": 0,
        "s_noise": 1,
        "s_tmax": 0,
        "s_tmin": 0,
        "sampler_index": "Euler a",
        "seed": -1,
        "seed_resize_from_h": -1,
        "seed_resize_from_w": -1,
        "steps": 3,
        "styles": [],
        "subseed": -1,
        "subseed_strength": 0,
        "tiling": False,
        "width": 64,
    }


def test_img2img_simple_performed(url_img2img, simple_img2img_request):
    assert requests.post(url_img2img, json=simple_img2img_request).status_code == 200


def test_inpainting_masked_performed(url_img2img, simple_img2img_request, mask_basic_image_base64):
    simple_img2img_request["mask"] = mask_basic_image_base64
    assert requests.post(url_img2img, json=simple_img2img_request).status_code == 200


def test_inpainting_with_inverted_masked_performed(url_img2img, simple_img2img_request, mask_basic_image_base64):
    simple_img2img_request["mask"] = mask_basic_image_base64
    simple_img2img_request["inpainting_mask_invert"] = True
    assert requests.post(url_img2img, json=simple_img2img_request).status_code == 200


def test_img2img_sd_upscale_performed(url_img2img, simple_img2img_request):
    simple_img2img_request["script_name"] = "sd upscale"
    simple_img2img_request["script_args"] = ["", 8, "Lanczos", 2.0]
    assert requests.post(url_img2img, json=simple_img2img_request).status_code == 200