locust 2.29.2.dev15__tar.gz → 2.29.2.dev32__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/PKG-INFO +1 -1
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/benchmarks/dispatch.py +98 -49
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/docs/tasksets.rst +4 -2
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/_version.py +2 -2
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/test/test_sequential_taskset.py +20 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/user/sequential_taskset.py +8 -6
- locust-2.29.2.dev32/locust/webui/dist/assets/index-e9ad42b4.js +250 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust.egg-info/PKG-INFO +1 -1
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust.egg-info/SOURCES.txt +1 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/.coveragerc +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/.dockerignore +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/.git-blame-ignore-revs +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/.gitattributes +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/.github/CONTRIBUTING.md +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/.github/ISSUE_TEMPLATE/bug.yml +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/.github/workflows/stale.yml +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/.github/workflows/tests.yml +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/.gitignore +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/.pre-commit-config.yaml +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/.readthedocs.yaml +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/.vscode/extensions.json +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/.vscode/launch.json +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/.vscode/launch_locust.json +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/.vscode/settings.json +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/CHANGELOG.md +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/Dockerfile +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/LICENSE +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/MANIFEST.in +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/Makefile +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/README.md +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/SECURITY.md +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/Vagrantfile +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/docs/_static/theme-overrides.css +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/docs/api.rst +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/docs/changelog.rst +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/docs/conf.py +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/docs/configuration.rst +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/docs/custom-load-shape.rst +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/docs/developing-locust.rst +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/docs/extending-locust.rst +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/docs/extensions.rst +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/docs/faq.rst +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/docs/further-reading.rst +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/docs/history.rst +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/docs/images/extend_modern_web_ui_cache_stats.png +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/docs/images/locust_workers.png +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/docs/images/number_of_users.png +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/docs/images/response_times.png +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/docs/images/total_requests_per_second.png +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/docs/images/userclass_picker_example.png +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/docs/images/webui-running-statistics.png +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/docs/images/webui-splash-screenshot.png +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/docs/increase-performance.rst +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/docs/increasing-request-rate.rst +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/docs/index.rst +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/docs/installation.rst +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/docs/logging.rst +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/docs/quickstart.rst +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/docs/requirements.txt +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/docs/retrieving-stats.rst +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/docs/running-distributed.rst +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/docs/running-in-debugger.rst +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/docs/running-in-docker.rst +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/docs/running-without-web-ui.rst +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/docs/testing-other-systems.rst +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/docs/use-as-lib.rst +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/docs/what-is-locust.rst +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/docs/writing-a-locustfile.rst +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/examples/add_command_line_argument.py +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/examples/basic.py +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/examples/browse_docs_sequence_test.py +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/examples/browse_docs_test.py +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/examples/custom_messages.py +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/examples/custom_shape/double_wave.py +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/examples/custom_shape/stages.py +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/examples/custom_shape/staging_user_classes.py +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/examples/custom_shape/step_load.py +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/examples/custom_shape/wait_user_count.py +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/examples/custom_wait_function.py +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/examples/custom_xmlrpc_client/server.py +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/examples/custom_xmlrpc_client/xmlrpc_locustfile.py +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/examples/debugging.py +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/examples/debugging_advanced.py +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/examples/dispatch_test_scripts/locustfile.py +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/examples/dispatch_test_scripts/run-disributed-headless.sh +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/examples/dispatch_test_scripts/run-disributed-web.sh +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/examples/dispatch_test_scripts/run-local-headless.sh +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/examples/dispatch_test_scripts/run-local-web.sh +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/examples/docker-compose/docker-compose.yml +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/examples/dynamic_user_credentials.py +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/examples/events.py +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/examples/extend_web_ui.py +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/examples/fast_http_locust.py +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/examples/grpc/grpc_user.py +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/examples/grpc/hello.proto +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/examples/grpc/hello_pb2.py +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/examples/grpc/hello_pb2_grpc.py +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/examples/grpc/hello_server.py +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/examples/grpc/locustfile.py +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/examples/locustfile.py +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/examples/manual_stats_reporting.py +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/examples/multiple_hosts.py +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/examples/nested_inline_tasksets.py +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/examples/rest.py +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/examples/sdk_session_patching/session_patch_locustfile.py +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/examples/semaphore_wait.py +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/examples/stop_on_threshold.py +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/examples/terraform/aws/README.md +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/examples/terraform/aws/data_subnet.tf +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/examples/terraform/aws/main.tf +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/examples/terraform/aws/output.tf +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/examples/terraform/aws/plan/basic.py +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/examples/terraform/aws/provisioner.tf +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/examples/terraform/aws/variables.tf +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/examples/test_data_management.py +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/examples/use_as_lib.py +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/examples/vagrant/README.md +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/examples/vagrant/supervisord.conf +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/examples/web_ui_auth.py +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/examples/web_ui_cache_stats.py +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/examples/worker_index.py +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/generate_changelog.py +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/__init__.py +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/__main__.py +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/argument_parser.py +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/clients.py +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/contrib/__init__.py +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/contrib/fasthttp.py +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/debug.py +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/dispatch.py +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/env.py +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/event.py +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/exception.py +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/html.py +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/input_events.py +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/log.py +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/main.py +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/py.typed +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/rpc/__init__.py +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/rpc/protocol.py +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/rpc/zmqrpc.py +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/runners.py +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/shape.py +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/stats.py +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/test/__init__.py +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/test/fake_module1_for_env_test.py +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/test/fake_module2_for_env_test.py +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/test/mock_locustfile.py +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/test/mock_logging.py +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/test/test_debugging.py +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/test/test_dispatch.py +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/test/test_env.py +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/test/test_fasthttp.py +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/test/test_http.py +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/test/test_interruptable_task.py +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/test/test_load_locustfile.py +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/test/test_locust_class.py +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/test/test_log.py +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/test/test_main.py +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/test/test_old_wait_api.py +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/test/test_parser.py +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/test/test_runners.py +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/test/test_stats.py +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/test/test_tags.py +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/test/test_taskratio.py +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/test/test_users.py +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/test/test_util.py +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/test/test_wait_time.py +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/test/test_web.py +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/test/test_zmqrpc.py +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/test/testcases.py +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/test/util.py +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/user/__init__.py +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/user/inspectuser.py +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/user/task.py +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/user/users.py +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/user/wait_time.py +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/util/__init__.py +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/util/cache.py +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/util/date.py +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/util/deprecation.py +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/util/exception_handler.py +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/util/load_locustfile.py +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/util/rounding.py +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/util/timespan.py +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/web.py +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/webui/.eslintrc +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/webui/.gitignore +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/webui/.prettierrc +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/webui/auth.html +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/webui/dev.html +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/webui/dist/assets/favicon.ico +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/webui/dist/assets/logo.png +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/webui/dist/auth.html +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/webui/dist/index.html +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/webui/dist/report.html +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/webui/index.html +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/webui/package.json +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/webui/public/assets/favicon.ico +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/webui/public/assets/logo.png +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/webui/public/report.html +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/webui/src/App.test.tsx +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/webui/src/App.tsx +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/webui/src/components/DataTable/DataTable.test.tsx +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/webui/src/components/DataTable/DataTable.tsx +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/webui/src/components/ExceptionsTable/ExceptionsTable.tsx +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/webui/src/components/FailuresTable/FailuresTable.tsx +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/webui/src/components/FallbackRender/FallbackRender.test.tsx +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/webui/src/components/FallbackRender/FallbackRender.tsx +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/webui/src/components/Form/Form.tsx +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/webui/src/components/Form/Select.tsx +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/webui/src/components/Form/tests/Form.test.tsx +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/webui/src/components/Form/tests/Select.test.tsx +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/webui/src/components/Layout/Footer/About.tsx +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/webui/src/components/Layout/Footer/Footer.tsx +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/webui/src/components/Layout/Layout.tsx +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/webui/src/components/Layout/Navbar/DarkLightToggle.tsx +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/webui/src/components/Layout/Navbar/Navbar.tsx +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/webui/src/components/Layout/Navbar/SwarmMonitor.test.tsx +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/webui/src/components/Layout/Navbar/SwarmMonitor.tsx +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/webui/src/components/LineChart/LineChart.test.tsx +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/webui/src/components/LineChart/LineChart.tsx +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/webui/src/components/LogViewer/LogViewer.tsx +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/webui/src/components/LogViewer/logUtils.tsx +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/webui/src/components/LogViewer/tests/LogViewer.test.tsx +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/webui/src/components/LogViewer/tests/useLogViewer.test.tsx +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/webui/src/components/LogViewer/useLogViewer.ts +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/webui/src/components/Modal/Modal.tsx +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/webui/src/components/Reports/Reports.test.tsx +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/webui/src/components/Reports/Reports.tsx +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/webui/src/components/ResponseTimeTable/ResponseTimeTable.test.tsx +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/webui/src/components/ResponseTimeTable/ResponseTimeTable.tsx +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/webui/src/components/StateButtons/EditButton.tsx +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/webui/src/components/StateButtons/NewTestButton.tsx +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/webui/src/components/StateButtons/ResetButton.tsx +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/webui/src/components/StateButtons/StateButtons.tsx +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/webui/src/components/StateButtons/StopButton.tsx +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/webui/src/components/StateButtons/tests/ResetButton.test.tsx +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/webui/src/components/StateButtons/tests/StateButtons.test.tsx +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/webui/src/components/StateButtons/tests/StopButton.test.tsx +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/webui/src/components/StatsTable/StatsTable.tsx +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/webui/src/components/SwarmCharts/SwarmCharts.tsx +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/webui/src/components/SwarmForm/SwarmCustomParameters.tsx +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/webui/src/components/SwarmForm/SwarmEditForm.tsx +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/webui/src/components/SwarmForm/SwarmForm.tsx +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/webui/src/components/SwarmForm/SwarmUserClassPicker.tsx +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/webui/src/components/SwarmForm/tests/SwarmCustomParameters.test.tsx +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/webui/src/components/SwarmForm/tests/SwarmEditForm.test.tsx +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/webui/src/components/SwarmForm/tests/SwarmForm.test.tsx +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/webui/src/components/SwarmForm/tests/SwarmUserClassPicker.test.tsx +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/webui/src/components/SwarmRatios/SwarmRatios.test.tsx +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/webui/src/components/SwarmRatios/SwarmRatios.tsx +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/webui/src/components/Table/Table.test.tsx +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/webui/src/components/Table/Table.tsx +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/webui/src/components/Tabs/Tabs.constants.tsx +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/webui/src/components/Tabs/Tabs.test.tsx +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/webui/src/components/Tabs/Tabs.tsx +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/webui/src/components/ViewColumnSelector/ViewColumnSelector.test.tsx +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/webui/src/components/ViewColumnSelector/ViewColumnSelector.tsx +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/webui/src/components/WorkersTable/WorkersTable.tsx +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/webui/src/constants/auth.ts +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/webui/src/constants/logs.ts +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/webui/src/constants/swarm.ts +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/webui/src/constants/theme.ts +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/webui/src/global.d.ts +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/webui/src/hooks/tests/useNotifications.test.tsx +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/webui/src/hooks/tests/useSelecteViewColumns.test.tsx +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/webui/src/hooks/tests/useSortByField.test.tsx +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/webui/src/hooks/tests/useSwarmUi.test.tsx +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/webui/src/hooks/useInterval.ts +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/webui/src/hooks/useNotifications.ts +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/webui/src/hooks/useSelectViewColumns.ts +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/webui/src/hooks/useSortByField.ts +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/webui/src/hooks/useSwarmUi.ts +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/webui/src/index.tsx +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/webui/src/pages/Auth.tsx +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/webui/src/pages/Dashboard.tsx +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/webui/src/pages/HtmlReport.tsx +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/webui/src/pages/tests/Auth.test.tsx +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/webui/src/pages/tests/Dashboard.test.tsx +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/webui/src/pages/tests/HtmlReport.test.tsx +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/webui/src/redux/api/swarm.ts +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/webui/src/redux/hooks.ts +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/webui/src/redux/slice/logViewer.slice.ts +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/webui/src/redux/slice/notification.slice.ts +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/webui/src/redux/slice/root.slice.ts +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/webui/src/redux/slice/swarm.slice.ts +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/webui/src/redux/slice/tests/ui.slice.test.ts +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/webui/src/redux/slice/theme.slice.ts +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/webui/src/redux/slice/ui.slice.ts +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/webui/src/redux/slice/url.slice.ts +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/webui/src/redux/store.ts +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/webui/src/redux/utils.ts +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/webui/src/styles/theme.ts +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/webui/src/test/constants.ts +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/webui/src/test/mocks/statsRequest.mock.ts +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/webui/src/test/mocks/swarmState.mock.ts +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/webui/src/test/setup.ts +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/webui/src/test/testUtils.tsx +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/webui/src/types/auth.types.ts +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/webui/src/types/swarm.types.ts +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/webui/src/types/tab.types.ts +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/webui/src/types/table.types.ts +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/webui/src/types/ui.types.ts +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/webui/src/utils/array.ts +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/webui/src/utils/date.ts +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/webui/src/utils/number.ts +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/webui/src/utils/object.ts +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/webui/src/utils/string.ts +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/webui/src/utils/tests/number.test.ts +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/webui/src/utils/tests/object.test.ts +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/webui/src/utils/tests/string.test.ts +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/webui/src/utils/tests/url.test.ts +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/webui/src/utils/url.ts +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/webui/tsconfig.json +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/webui/vite.config.ts +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/webui/vitest.config.ts +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust/webui/yarn.lock +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust.egg-info/dependency_links.txt +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust.egg-info/entry_points.txt +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust.egg-info/not-zip-safe +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust.egg-info/requires.txt +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/locust.egg-info/top_level.txt +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/package.json +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/pyproject.toml +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/setup.cfg +0 -0
- {locust-2.29.2.dev15 → locust-2.29.2.dev32}/tox.ini +0 -0
@@ -1,7 +1,7 @@
|
|
1
1
|
"""
|
2
2
|
This file contains a benchmark to validate the performance of Locust itself.
|
3
3
|
More precisely, the performance of the `UsersDispatcher` class which is responsible
|
4
|
-
for calculating the distribution of users on each
|
4
|
+
for calculating the distribution of users on each worker. This benchmark is to be used
|
5
5
|
by people working on Locust's development.
|
6
6
|
"""
|
7
7
|
|
@@ -9,105 +9,146 @@ from locust import User
|
|
9
9
|
from locust.dispatch import UsersDispatcher
|
10
10
|
from locust.runners import WorkerNode
|
11
11
|
|
12
|
+
import argparse
|
13
|
+
import gc
|
12
14
|
import itertools
|
13
15
|
import statistics
|
14
16
|
import time
|
15
17
|
|
16
18
|
from prettytable import PrettyTable
|
17
19
|
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
78, 76, 28, 62, 69, 5, 55, 37, 2, 97,
|
22
|
-
41, 33, 19, 19, 34, 78, 76, 28, 62, 69,
|
23
|
-
41, 33, 19, 19, 34, 78, 76, 28, 62, 69,
|
24
|
-
41, 33, 19, 19, 34, 78, 76, 28, 62, 69,
|
25
|
-
5, 55, 37, 2, 97, 41, 33, 19, 19, 34,
|
26
|
-
78, 76, 28, 62, 69, 5, 55, 37, 2, 97,
|
27
|
-
41, 33, 19, 19, 34, 78, 76, 28, 62, 69,
|
28
|
-
41, 33, 19, 19, 34, 78, 76, 28, 62, 69,
|
29
|
-
41, 33, 19, 19, 34, 78, 76, 28, 62, 69,
|
30
|
-
]
|
31
|
-
# fmt: on
|
20
|
+
NUMBER_OF_USER_CLASSES: int = 1000
|
21
|
+
USER_CLASSES: list[type[User]] = []
|
22
|
+
WEIGHTS = list(range(1, NUMBER_OF_USER_CLASSES + 1))
|
32
23
|
|
33
24
|
for i, x in enumerate(WEIGHTS):
|
34
|
-
exec(f"class User{i
|
25
|
+
exec(f"class User{i}(User): weight = {x}")
|
35
26
|
|
36
27
|
# Equivalent to:
|
37
28
|
#
|
38
|
-
# class
|
29
|
+
# class User0(User):
|
39
30
|
# weight = 5
|
40
31
|
#
|
41
|
-
# class
|
32
|
+
# class User1(User):
|
42
33
|
# weight = 55
|
43
34
|
# .
|
44
35
|
# .
|
45
36
|
# .
|
46
|
-
# class User100(User):
|
47
|
-
# weight = 69
|
48
37
|
|
49
|
-
exec("USER_CLASSES = [" + ",".join(f"User{i
|
38
|
+
exec("USER_CLASSES = [" + ",".join(f"User{i}" for i in range(len(WEIGHTS))) + "]")
|
50
39
|
# Equivalent to:
|
51
40
|
#
|
52
41
|
# USER_CLASSES = [
|
42
|
+
# User0,
|
53
43
|
# User1,
|
54
|
-
# User2,
|
55
44
|
# .
|
56
45
|
# .
|
57
46
|
# .
|
58
|
-
# User100,
|
59
47
|
# ]
|
60
48
|
|
61
49
|
|
62
50
|
if __name__ == "__main__":
|
51
|
+
parser = argparse.ArgumentParser()
|
52
|
+
parser.add_argument("-f", "--full-benchmark", action="store_true", help="run benchmark on full test matrix")
|
53
|
+
parser.add_argument(
|
54
|
+
"-i",
|
55
|
+
"--include-fixed-users",
|
56
|
+
action="store_true",
|
57
|
+
help="add test cases when 50 percent of users use User.fixed_count instead of User.weight",
|
58
|
+
)
|
59
|
+
parser.add_argument("-r", "--repeat", default=1, type=int, help="number of test cases with the same parameters")
|
60
|
+
parser.add_argument("-s", "--save-output", action="store_true", help="save test results to files")
|
61
|
+
args = parser.parse_args()
|
62
|
+
|
63
63
|
now = time.time()
|
64
64
|
|
65
|
-
worker_count_cases = [10, 100,
|
66
|
-
user_count_cases = [
|
67
|
-
number_of_user_classes_cases = [1,
|
68
|
-
spawn_rate_cases = [
|
65
|
+
worker_count_cases = [10, 100, 1000]
|
66
|
+
user_count_cases = [10_000, 100_000, 1_000_000]
|
67
|
+
number_of_user_classes_cases = [1, 30, 1000]
|
68
|
+
spawn_rate_cases = [100, 10_000]
|
69
|
+
fixed_count_cases = [False, True] if args.include_fixed_users else [False]
|
70
|
+
# [0% fixed_count users, 50% fixed_count users] if args.mixed_user_types else [0% fixed_count users]
|
71
|
+
repeat_cases = list(range(1, args.repeat + 1))
|
72
|
+
|
73
|
+
if not args.full_benchmark:
|
74
|
+
worker_count_cases = [max(worker_count_cases)]
|
75
|
+
user_count_cases = [max(user_count_cases)]
|
76
|
+
number_of_user_classes_cases = [max(number_of_user_classes_cases)]
|
77
|
+
spawn_rate_cases = [max(spawn_rate_cases)]
|
69
78
|
|
70
79
|
case_count = (
|
71
|
-
len(worker_count_cases)
|
80
|
+
len(worker_count_cases)
|
81
|
+
* len(user_count_cases)
|
82
|
+
* len(number_of_user_classes_cases)
|
83
|
+
* len(spawn_rate_cases)
|
84
|
+
* len(fixed_count_cases)
|
85
|
+
* len(repeat_cases)
|
72
86
|
)
|
73
87
|
|
74
88
|
results = {}
|
75
89
|
|
76
90
|
try:
|
77
|
-
for case_index, (
|
78
|
-
|
91
|
+
for case_index, (
|
92
|
+
worker_count,
|
93
|
+
user_count,
|
94
|
+
number_of_user_classes,
|
95
|
+
spawn_rate,
|
96
|
+
fixed_users,
|
97
|
+
iteration,
|
98
|
+
) in enumerate(
|
99
|
+
itertools.product(
|
100
|
+
worker_count_cases,
|
101
|
+
user_count_cases,
|
102
|
+
number_of_user_classes_cases,
|
103
|
+
spawn_rate_cases,
|
104
|
+
fixed_count_cases,
|
105
|
+
repeat_cases,
|
106
|
+
)
|
79
107
|
):
|
80
|
-
|
81
|
-
|
82
|
-
|
108
|
+
workers = [WorkerNode(str(i)) for i in range(worker_count)]
|
109
|
+
if fixed_users:
|
110
|
+
sum_fixed_weight = 0
|
111
|
+
for j in range(0, number_of_user_classes, 2):
|
112
|
+
sum_fixed_weight += USER_CLASSES[j].weight
|
83
113
|
|
84
|
-
|
114
|
+
for j in range(0, number_of_user_classes, 2): # set fixed_weights for 50% of users
|
115
|
+
USER_CLASSES[j].fixed_count = max(1, USER_CLASSES[j].weight // sum_fixed_weight) # type: ignore # assigned .weight is int
|
85
116
|
|
86
|
-
ts = time.
|
117
|
+
ts = time.process_time()
|
87
118
|
users_dispatcher = UsersDispatcher(
|
88
119
|
worker_nodes=workers,
|
89
|
-
user_classes=USER_CLASSES[:number_of_user_classes],
|
120
|
+
user_classes=USER_CLASSES[:number_of_user_classes],
|
90
121
|
)
|
91
|
-
instantiate_duration = time.
|
122
|
+
instantiate_duration = time.process_time() - ts
|
92
123
|
|
93
124
|
# Ramp-up
|
94
|
-
|
125
|
+
gc.disable()
|
126
|
+
ts = time.process_time()
|
95
127
|
users_dispatcher.new_dispatch(target_user_count=user_count, spawn_rate=spawn_rate)
|
96
|
-
new_dispatch_ramp_up_duration = time.
|
128
|
+
new_dispatch_ramp_up_duration = time.process_time() - ts
|
129
|
+
gc.enable()
|
130
|
+
|
97
131
|
assert len(users_dispatcher.dispatch_iteration_durations) == 0
|
98
132
|
users_dispatcher._wait_between_dispatch = 0
|
99
133
|
all_dispatched_users_ramp_up = list(users_dispatcher)
|
100
134
|
dispatch_iteration_durations_ramp_up = users_dispatcher.dispatch_iteration_durations[:]
|
101
135
|
|
102
136
|
# Ramp-down
|
103
|
-
|
137
|
+
gc.disable()
|
138
|
+
ts = time.process_time()
|
104
139
|
users_dispatcher.new_dispatch(target_user_count=0, spawn_rate=spawn_rate)
|
105
|
-
new_dispatch_ramp_down_duration = time.
|
140
|
+
new_dispatch_ramp_down_duration = time.process_time() - ts
|
141
|
+
gc.enable()
|
142
|
+
|
106
143
|
assert len(users_dispatcher.dispatch_iteration_durations) == 0
|
107
144
|
users_dispatcher._wait_between_dispatch = 0
|
108
145
|
all_dispatched_users_ramp_down = list(users_dispatcher)
|
109
146
|
dispatch_iteration_durations_ramp_down = users_dispatcher.dispatch_iteration_durations[:]
|
110
147
|
|
148
|
+
if fixed_users:
|
149
|
+
for j in range(0, number_of_user_classes, 2):
|
150
|
+
USER_CLASSES[j].fixed_count = None
|
151
|
+
|
111
152
|
cpu_ramp_up = "{:3.3f}/{:3.3f}/{:3.3f}".format( # noqa: UP032
|
112
153
|
1000 * statistics.mean(dispatch_iteration_durations_ramp_up),
|
113
154
|
1000 * min(dispatch_iteration_durations_ramp_up),
|
@@ -135,7 +176,10 @@ if __name__ == "__main__":
|
|
135
176
|
)
|
136
177
|
)
|
137
178
|
|
138
|
-
results[(worker_count, user_count, number_of_user_classes, spawn_rate)] = (
|
179
|
+
results[(worker_count, user_count, number_of_user_classes, spawn_rate, fixed_users, iteration)] = (
|
180
|
+
cpu_ramp_up,
|
181
|
+
cpu_ramp_down,
|
182
|
+
)
|
139
183
|
|
140
184
|
finally:
|
141
185
|
table = PrettyTable()
|
@@ -144,6 +188,8 @@ if __name__ == "__main__":
|
|
144
188
|
"Users",
|
145
189
|
"User Classes",
|
146
190
|
"Spawn Rate",
|
191
|
+
"Fixed Users",
|
192
|
+
"Iteration",
|
147
193
|
"Ramp-Up (avg/min/max) (ms)",
|
148
194
|
"Ramp-Down (avg/min/max) (ms)",
|
149
195
|
]
|
@@ -151,6 +197,8 @@ if __name__ == "__main__":
|
|
151
197
|
table.align["Users"] = "l"
|
152
198
|
table.align["User Classes"] = "l"
|
153
199
|
table.align["Spawn Rate"] = "l"
|
200
|
+
table.align["Fixed Users"] = "l"
|
201
|
+
table.align["Iteration"] = "c"
|
154
202
|
table.align["Ramp-Up (avg/min/max) (ms)"] = "c"
|
155
203
|
table.align["Ramp-Down (avg/min/max) (ms)"] = "c"
|
156
204
|
table.add_rows(
|
@@ -160,22 +208,23 @@ if __name__ == "__main__":
|
|
160
208
|
f"{user_count:,}",
|
161
209
|
number_of_user_classes,
|
162
210
|
f"{spawn_rate:,}",
|
211
|
+
"50%" if fixed_users else "0%",
|
212
|
+
iteration,
|
163
213
|
cpu_ramp_up,
|
164
214
|
cpu_ramp_down,
|
165
215
|
]
|
166
|
-
for (worker_count, user_count, number_of_user_classes, spawn_rate), (
|
216
|
+
for (worker_count, user_count, number_of_user_classes, spawn_rate, fixed_users, iteration), (
|
167
217
|
cpu_ramp_up,
|
168
218
|
cpu_ramp_down,
|
169
219
|
) in results.items()
|
170
220
|
]
|
171
221
|
)
|
172
222
|
print()
|
173
|
-
print()
|
174
|
-
print()
|
175
223
|
print(table)
|
176
224
|
|
177
|
-
|
178
|
-
|
225
|
+
if args.save_output:
|
226
|
+
with open(f"results-dispatch-benchmarks-{int(now)}.txt", "w") as file:
|
227
|
+
file.write(table.get_string())
|
179
228
|
|
180
|
-
|
181
|
-
|
229
|
+
with open(f"results-dispatch-benchmarks-{int(now)}.json", "w") as file:
|
230
|
+
file.write(table.get_json_string())
|
@@ -148,7 +148,8 @@ SequentialTaskSet class
|
|
148
148
|
=======================
|
149
149
|
|
150
150
|
:py:class:`SequentialTaskSet <locust.SequentialTaskSet>` is a TaskSet whose tasks will be executed
|
151
|
-
in the order that they are declared.
|
151
|
+
in the order that they are declared. If the *<Task : int>* dictionary is used, each task will be repeated by the amount
|
152
|
+
given by the integer at the point of declaration. It is possible to nest SequentialTaskSets
|
152
153
|
within a TaskSet and vice versa.
|
153
154
|
|
154
155
|
For example, the following code will request URLs /1-/4 in order, and then repeat.
|
@@ -164,8 +165,9 @@ For example, the following code will request URLs /1-/4 in order, and then repea
|
|
164
165
|
self.client.get("/1")
|
165
166
|
self.client.get("/2")
|
166
167
|
|
167
|
-
# you can still use the tasks attribute to specify a list of tasks
|
168
|
+
# you can still use the tasks attribute to specify a list or dict of tasks
|
168
169
|
tasks = [function_task]
|
170
|
+
# tasks = {function_task: 1}
|
169
171
|
|
170
172
|
@task
|
171
173
|
def last_task(self):
|
@@ -12,5 +12,5 @@ __version__: str
|
|
12
12
|
__version_tuple__: VERSION_TUPLE
|
13
13
|
version_tuple: VERSION_TUPLE
|
14
14
|
|
15
|
-
__version__ = version = '2.29.2.
|
16
|
-
__version_tuple__ = version_tuple = (2, 29, 2, '
|
15
|
+
__version__ = version = '2.29.2.dev32'
|
16
|
+
__version_tuple__ = version_tuple = (2, 29, 2, 'dev32')
|
@@ -34,6 +34,26 @@ class TestTaskSet(LocustTestCase):
|
|
34
34
|
self.assertRaises(RescheduleTask, lambda: l.run())
|
35
35
|
self.assertEqual([1, 2, 3], log)
|
36
36
|
|
37
|
+
def test_task_sequence_with_dictionary(self):
|
38
|
+
log = []
|
39
|
+
|
40
|
+
def t1(self):
|
41
|
+
log.append(1)
|
42
|
+
|
43
|
+
def t2(self):
|
44
|
+
log.append(2)
|
45
|
+
|
46
|
+
def t3(self):
|
47
|
+
log.append(3)
|
48
|
+
self.interrupt(reschedule=False)
|
49
|
+
|
50
|
+
class MyTaskSequence(SequentialTaskSet):
|
51
|
+
tasks = {t1: 3, t2: 2, t3: 1}
|
52
|
+
|
53
|
+
l = MyTaskSequence(self.locust)
|
54
|
+
self.assertRaises(RescheduleTask, lambda: l.run())
|
55
|
+
self.assertEqual([1, 1, 1, 2, 2, 3], log)
|
56
|
+
|
37
57
|
def test_task_sequence_with_methods(self):
|
38
58
|
log = []
|
39
59
|
|
@@ -1,6 +1,6 @@
|
|
1
1
|
from locust.exception import LocustError
|
2
2
|
|
3
|
-
import
|
3
|
+
from itertools import cycle
|
4
4
|
|
5
5
|
from .task import TaskSet, TaskSetMeta
|
6
6
|
|
@@ -26,8 +26,12 @@ class SequentialTaskSetMeta(TaskSetMeta):
|
|
26
26
|
# compared to methods declared with @task
|
27
27
|
if isinstance(value, list):
|
28
28
|
new_tasks.extend(value)
|
29
|
+
elif isinstance(value, dict):
|
30
|
+
for task, weight in value.items():
|
31
|
+
for _ in range(weight):
|
32
|
+
new_tasks.append(task)
|
29
33
|
else:
|
30
|
-
raise ValueError("
|
34
|
+
raise ValueError("The 'tasks' attribute can only be set to list or dict")
|
31
35
|
|
32
36
|
if "locust_task_weight" in dir(value):
|
33
37
|
# method decorated with @task
|
@@ -52,13 +56,11 @@ class SequentialTaskSet(TaskSet, metaclass=SequentialTaskSetMeta):
|
|
52
56
|
|
53
57
|
def __init__(self, *args, **kwargs):
|
54
58
|
super().__init__(*args, **kwargs)
|
55
|
-
self.
|
59
|
+
self._task_cycle = cycle(self.tasks)
|
56
60
|
|
57
61
|
def get_next_task(self):
|
58
62
|
if not self.tasks:
|
59
63
|
raise LocustError(
|
60
64
|
"No tasks defined. Use the @task decorator or set the 'tasks' attribute of the SequentialTaskSet"
|
61
65
|
)
|
62
|
-
|
63
|
-
self._task_index += 1
|
64
|
-
return task
|
66
|
+
return next(self._task_cycle)
|