2
0
mirror of https://github.com/inventree/InvenTree.git synced 2026-01-10 05:08:09 +00:00
Files
InvenTree/src/performance/tests.py
Oliver 4709dc8a9a [API] Search improvements (#11094)
* Improve prefetching

* Cache user groups for permission  check

* Use a GET request to execute search

- Prevent forced prefetch
- Reduce execution time significantly

* Fix group caching

* Improve StockItemSerializer

- Select related for pricing_data rather than prefetch

* Add benchmarking for search endpoint

* Adjust prefetch

* Ensure no errors returned

* Fix prefetch

* Fix more prefetch issues

* Remove debug print

* Fix for performance testing

* Data is already returned as dict

* Test fix

* Extract model types better
2026-01-08 18:06:23 +11:00

161 lines
4.1 KiB
Python

"""Performance benchmarking tests for InvenTree using the module."""
import json
import os
import pytest
from inventree.api import InvenTreeAPI
server = os.environ.get('INVENTREE_PYTHON_TEST_SERVER', 'http://127.0.0.1:12345')
user = os.environ.get('INVENTREE_PYTHON_TEST_USERNAME', 'testuser')
pwd = os.environ.get('INVENTREE_PYTHON_TEST_PASSWORD', 'testpassword')
api_client = InvenTreeAPI(
server,
username=user,
password=pwd,
timeout=30,
token_name='python-test',
use_token_auth=True,
)
@pytest.mark.benchmark
def test_api_auth_performance():
"""Benchmark the API authentication performance."""
client = InvenTreeAPI(
server,
username=user,
password=pwd,
timeout=30,
token_name='python-test',
use_token_auth=True,
)
assert client
@pytest.mark.benchmark
@pytest.mark.parametrize(
'url',
[
'/api/part/',
'/api/part/category/',
'/api/stock/',
'/api/stock/location/',
'/api/company/',
'/api/build/',
#'/api/build/line/',
'/api/build/item/',
'/api/order/so/',
'/api/order/so/shipment/',
#'/api/order/po/',
#'/api/order/po-line/',
'/api/user/roles/',
'/api/parameter/',
'/api/parameter/template/',
],
)
def test_api_list_performance(url):
"""Benchmark the API list request performance."""
result = api_client.get(url)
assert result
assert len(result) > 0
@pytest.mark.benchmark
@pytest.mark.parametrize(
'url',
[
'/api/part/',
'/api/part/category/',
'/api/stock/location/',
'/api/company/',
'/api/build/',
'/api/build/line/',
'/api/build/item/',
'/api/order/so/',
'/api/order/so/shipment/',
'/api/order/po/',
'/api/order/po-line/',
'/api/user/roles/',
'/api/parameter/',
'/api/parameter/template/',
],
)
def test_api_options_performance(url):
"""Benchmark the API OPTIONS request performance."""
response = api_client.request(url, method='OPTIONS')
result = json.loads(response.text)
assert result
assert 'actions' in result
assert len(result['actions']) > 0
@pytest.mark.benchmark
@pytest.mark.parametrize(
'key',
[
'all',
'part',
'partcategory',
'supplierpart',
'manufacturerpart',
'stockitem',
'stocklocation',
'build',
'supplier',
'manufacturer',
'customer',
'purchaseorder',
'salesorder',
'salesordershipment',
'returnorder',
],
)
def test_search_performance(key: str):
"""Benchmark the API search performance."""
SEARCH_URL = '/api/search/'
# An indicative search query for various model types
SEARCH_DATA = {
'part': {'active': True},
'partcategory': {},
'supplierpart': {
'part_detail': True,
'supplier_detail': True,
'manufacturer_detail': True,
},
'manufacturerpart': {
'part_detail': True,
'supplier_detail': True,
'manufacturer_detail': True,
},
'stockitem': {'part_detail': True, 'location_detail': True, 'in_stock': True},
'stocklocation': {},
'build': {'part_detail': True},
'supplier': {},
'manufacturer': {},
'customer': {},
'purchaseorder': {'supplier_detail': True, 'outstanding': True},
'salesorder': {'customer_detail': True, 'outstanding': True},
'salesordershipment': {},
'returnorder': {'customer_detail': True, 'outstanding': True},
}
model_types = list(SEARCH_DATA.keys())
search_params = SEARCH_DATA if key == 'all' else {key: SEARCH_DATA[key]}
# Add in a common search term
search_params.update({'search': '0', 'limit': 50})
response = api_client.post(SEARCH_URL, data=search_params)
assert response
if key == 'all':
for model_type in model_types:
assert model_type in response
assert 'error' not in response[model_type]
else:
assert key in response
assert 'error' not in response[key]