mirror of
https://github.com/inventree/InvenTree.git
synced 2026-01-10 05:08:09 +00:00
* 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
161 lines
4.1 KiB
Python
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]
|