neoload 1.3.18__tar.gz → 1.3.19.dev2__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.
Files changed (219) hide show
  1. neoload-1.3.19.dev2/PKG-INFO +597 -0
  2. neoload-1.3.19.dev2/README.md +558 -0
  3. neoload-1.3.19.dev2/examples/as-code-demo/default.yaml +140 -0
  4. neoload-1.3.19.dev2/neoload/commands/__init__.py +2 -0
  5. neoload-1.3.19.dev2/neoload/commands/checkvu.py +98 -0
  6. neoload-1.3.19.dev2/neoload/commands/validate.py +19 -0
  7. neoload-1.3.19.dev2/neoload/neoload_cli_lib/checkvu_runner.py +189 -0
  8. neoload-1.3.19.dev2/neoload/neoload_cli_lib/schema_validation.py +327 -0
  9. {neoload-1.3.18 → neoload-1.3.19.dev2}/neoload/neoload_cli_lib/user_data.py +22 -2
  10. neoload-1.3.19.dev2/neoload/version.py +1 -0
  11. neoload-1.3.19.dev2/neoload.egg-info/PKG-INFO +597 -0
  12. {neoload-1.3.18 → neoload-1.3.19.dev2}/neoload.egg-info/SOURCES.txt +10 -0
  13. neoload-1.3.19.dev2/tests/commands/report/conftest.py +17 -0
  14. neoload-1.3.19.dev2/tests/commands/test_checkvu.py +207 -0
  15. {neoload-1.3.18 → neoload-1.3.19.dev2}/tests/commands/test_validate.py +30 -5
  16. {neoload-1.3.18 → neoload-1.3.19.dev2}/tests/conftest.py +2 -1
  17. {neoload-1.3.18 → neoload-1.3.19.dev2}/tests/neoload_cli_lib/test_SchemaValidation.py +1 -1
  18. neoload-1.3.19.dev2/tests/neoload_cli_lib/test_etag_caching.py +59 -0
  19. neoload-1.3.19.dev2/tests/neoload_cli_lib/test_include_resolution.py +203 -0
  20. neoload-1.3.19.dev2/tests/neoload_cli_lib/test_validator_selection.py +50 -0
  21. neoload-1.3.19.dev2/tests/neoload_projects/circular_includes/a.yaml +3 -0
  22. neoload-1.3.19.dev2/tests/neoload_projects/circular_includes/b.yaml +3 -0
  23. {neoload-1.3.18 → neoload-1.3.19.dev2}/tests/neoload_projects/invalid_to_schema.yaml +0 -2
  24. {neoload-1.3.18 → neoload-1.3.19.dev2}/tests/test_readme.py +1 -1
  25. neoload-1.3.18/PKG-INFO +0 -572
  26. neoload-1.3.18/README.md +0 -533
  27. neoload-1.3.18/neoload/commands/__init__.py +0 -2
  28. neoload-1.3.18/neoload/commands/validate.py +0 -29
  29. neoload-1.3.18/neoload/neoload_cli_lib/schema_validation.py +0 -153
  30. neoload-1.3.18/neoload/version.py +0 -1
  31. neoload-1.3.18/neoload.egg-info/PKG-INFO +0 -572
  32. {neoload-1.3.18 → neoload-1.3.19.dev2}/.github/workflows/python-integration-tests.yml +0 -0
  33. {neoload-1.3.18 → neoload-1.3.19.dev2}/.github/workflows/python-package.yml +0 -0
  34. {neoload-1.3.18 → neoload-1.3.19.dev2}/.github/workflows/python-post-release-changelog-pr.yml +0 -0
  35. {neoload-1.3.18 → neoload-1.3.19.dev2}/.github/workflows/python-release.yml +0 -0
  36. {neoload-1.3.18 → neoload-1.3.19.dev2}/.gitignore +0 -0
  37. {neoload-1.3.18 → neoload-1.3.19.dev2}/.travis.yml +0 -0
  38. {neoload-1.3.18 → neoload-1.3.19.dev2}/CHANGELOG.md +0 -0
  39. {neoload-1.3.18 → neoload-1.3.19.dev2}/LICENSE +0 -0
  40. {neoload-1.3.18 → neoload-1.3.19.dev2}/MANIFEST.in +0 -0
  41. {neoload-1.3.18 → neoload-1.3.19.dev2}/examples/docker/Dockerfile +0 -0
  42. {neoload-1.3.18 → neoload-1.3.19.dev2}/examples/pipelines/aws/.nlignore +0 -0
  43. {neoload-1.3.18 → neoload-1.3.19.dev2}/examples/pipelines/aws/buildspec.yaml +0 -0
  44. {neoload-1.3.18 → neoload-1.3.19.dev2}/examples/pipelines/azure_devops/.nlignore +0 -0
  45. {neoload-1.3.18 → neoload-1.3.19.dev2}/examples/pipelines/azure_devops/Azure_DevOps_Pipeline_NeoLoad_CLI.jpg +0 -0
  46. {neoload-1.3.18 → neoload-1.3.19.dev2}/examples/pipelines/azure_devops/Azure_DevOps_Pipeline_NeoLoad_SLA_jUnit.jpg +0 -0
  47. {neoload-1.3.18 → neoload-1.3.19.dev2}/examples/pipelines/azure_devops/README.md +0 -0
  48. {neoload-1.3.18 → neoload-1.3.19.dev2}/examples/pipelines/azure_devops/neoload-cli-docker.yml +0 -0
  49. {neoload-1.3.18 → neoload-1.3.19.dev2}/examples/pipelines/azure_devops/neoload-cli-dyninfra.yml +0 -0
  50. {neoload-1.3.18 → neoload-1.3.19.dev2}/examples/pipelines/bamboo-specs/.nlignore +0 -0
  51. {neoload-1.3.18 → neoload-1.3.19.dev2}/examples/pipelines/bamboo-specs/Bamboo_Pipeline_NeoLoad_SLA_jUnit.jpg +0 -0
  52. {neoload-1.3.18 → neoload-1.3.19.dev2}/examples/pipelines/bamboo-specs/README.md +0 -0
  53. {neoload-1.3.18 → neoload-1.3.19.dev2}/examples/pipelines/bamboo-specs/bamboo-v1.yaml +0 -0
  54. {neoload-1.3.18 → neoload-1.3.19.dev2}/examples/pipelines/bamboo-specs/bamboo-v2.yaml +0 -0
  55. {neoload-1.3.18 → neoload-1.3.19.dev2}/examples/pipelines/github/neoload-github-actions-demo.yml +0 -0
  56. {neoload-1.3.18 → neoload-1.3.19.dev2}/examples/pipelines/gitlab/.nlignore +0 -0
  57. {neoload-1.3.18 → neoload-1.3.19.dev2}/examples/pipelines/gitlab/openshift.gitlab-ci.yml +0 -0
  58. {neoload-1.3.18 → neoload-1.3.19.dev2}/examples/pipelines/jenkins/Jenkinsfile_dyninfra +0 -0
  59. {neoload-1.3.18 → neoload-1.3.19.dev2}/examples/pipelines/jenkins/Jenkinsfile_slafails +0 -0
  60. {neoload-1.3.18 → neoload-1.3.19.dev2}/neoload/__init__.py +0 -0
  61. {neoload-1.3.18 → neoload-1.3.19.dev2}/neoload/__main__.py +0 -0
  62. {neoload-1.3.18 → neoload-1.3.19.dev2}/neoload/commands/config.py +0 -0
  63. {neoload-1.3.18 → neoload-1.3.19.dev2}/neoload/commands/docker.py +0 -0
  64. {neoload-1.3.18 → neoload-1.3.19.dev2}/neoload/commands/fastfail.py +0 -0
  65. {neoload-1.3.18 → neoload-1.3.19.dev2}/neoload/commands/login.py +0 -0
  66. {neoload-1.3.18 → neoload-1.3.19.dev2}/neoload/commands/logout.py +0 -0
  67. {neoload-1.3.18 → neoload-1.3.19.dev2}/neoload/commands/logs.py +0 -0
  68. {neoload-1.3.18 → neoload-1.3.19.dev2}/neoload/commands/logs_url.py +0 -0
  69. {neoload-1.3.18 → neoload-1.3.19.dev2}/neoload/commands/project.py +0 -0
  70. {neoload-1.3.18 → neoload-1.3.19.dev2}/neoload/commands/report.py +0 -0
  71. {neoload-1.3.18 → neoload-1.3.19.dev2}/neoload/commands/run.py +0 -0
  72. {neoload-1.3.18 → neoload-1.3.19.dev2}/neoload/commands/status.py +0 -0
  73. {neoload-1.3.18 → neoload-1.3.19.dev2}/neoload/commands/stop.py +0 -0
  74. {neoload-1.3.18 → neoload-1.3.19.dev2}/neoload/commands/test_results.py +0 -0
  75. {neoload-1.3.18 → neoload-1.3.19.dev2}/neoload/commands/test_settings.py +0 -0
  76. {neoload-1.3.18 → neoload-1.3.19.dev2}/neoload/commands/wait.py +0 -0
  77. {neoload-1.3.18 → neoload-1.3.19.dev2}/neoload/commands/workspaces.py +0 -0
  78. {neoload-1.3.18 → neoload-1.3.19.dev2}/neoload/commands/zones.py +0 -0
  79. {neoload-1.3.18 → neoload-1.3.19.dev2}/neoload/neoload_cli_lib/__init__.py +0 -0
  80. {neoload-1.3.18 → neoload-1.3.19.dev2}/neoload/neoload_cli_lib/bad_as_code_exception.py +0 -0
  81. {neoload-1.3.18 → neoload-1.3.19.dev2}/neoload/neoload_cli_lib/cli_exception.py +0 -0
  82. {neoload-1.3.18 → neoload-1.3.19.dev2}/neoload/neoload_cli_lib/config_global.py +0 -0
  83. {neoload-1.3.18 → neoload-1.3.19.dev2}/neoload/neoload_cli_lib/displayer.py +0 -0
  84. {neoload-1.3.18 → neoload-1.3.19.dev2}/neoload/neoload_cli_lib/docker_lib.py +0 -0
  85. {neoload-1.3.18 → neoload-1.3.19.dev2}/neoload/neoload_cli_lib/filtering.py +0 -0
  86. {neoload-1.3.18 → neoload-1.3.19.dev2}/neoload/neoload_cli_lib/hooks.py +0 -0
  87. {neoload-1.3.18 → neoload-1.3.19.dev2}/neoload/neoload_cli_lib/logs_tools.py +0 -0
  88. {neoload-1.3.18 → neoload-1.3.19.dev2}/neoload/neoload_cli_lib/logs_traduction_map.py +0 -0
  89. {neoload-1.3.18 → neoload-1.3.19.dev2}/neoload/neoload_cli_lib/name_resolver.py +0 -0
  90. {neoload-1.3.18 → neoload-1.3.19.dev2}/neoload/neoload_cli_lib/neoLoad_project.py +0 -0
  91. {neoload-1.3.18 → neoload-1.3.19.dev2}/neoload/neoload_cli_lib/paths.py +0 -0
  92. {neoload-1.3.18 → neoload-1.3.19.dev2}/neoload/neoload_cli_lib/rest_crud.py +0 -0
  93. {neoload-1.3.18 → neoload-1.3.19.dev2}/neoload/neoload_cli_lib/running_tools.py +0 -0
  94. {neoload-1.3.18 → neoload-1.3.19.dev2}/neoload/neoload_cli_lib/tools.py +0 -0
  95. {neoload-1.3.18 → neoload-1.3.19.dev2}/neoload/resources/__init__.py +0 -0
  96. {neoload-1.3.18 → neoload-1.3.19.dev2}/neoload/resources/jinja/__init__.py +0 -0
  97. {neoload-1.3.18 → neoload-1.3.19.dev2}/neoload/resources/jinja/builtin_console_summary.j2 +0 -0
  98. {neoload-1.3.18 → neoload-1.3.19.dev2}/neoload/resources/jinja/builtin_transactions_csv.j2 +0 -0
  99. {neoload-1.3.18 → neoload-1.3.19.dev2}/neoload/resources/jinja/common/common.js +0 -0
  100. {neoload-1.3.18 → neoload-1.3.19.dev2}/neoload/resources/jinja/common/external_data.html.j2 +0 -0
  101. {neoload-1.3.18 → neoload-1.3.19.dev2}/neoload/resources/jinja/common/general_details.html.j2 +0 -0
  102. {neoload-1.3.18 → neoload-1.3.19.dev2}/neoload/resources/jinja/common/header.j2 +0 -0
  103. {neoload-1.3.18 → neoload-1.3.19.dev2}/neoload/resources/jinja/common/hits_per_second.html.j2 +0 -0
  104. {neoload-1.3.18 → neoload-1.3.19.dev2}/neoload/resources/jinja/common/running_vus.html.j2 +0 -0
  105. {neoload-1.3.18 → neoload-1.3.19.dev2}/neoload/resources/jinja/common/styles.css +0 -0
  106. {neoload-1.3.18 → neoload-1.3.19.dev2}/neoload/resources/jinja/common/transactions.html.j2 +0 -0
  107. {neoload-1.3.18 → neoload-1.3.19.dev2}/neoload/resources/jinja/common/workload_characteristics.html.j2 +0 -0
  108. {neoload-1.3.18 → neoload-1.3.19.dev2}/neoload/resources/jinja/custom_transactions_export.j2 +0 -0
  109. {neoload-1.3.18 → neoload-1.3.19.dev2}/neoload/resources/jinja/sample-custom-report.html.j2 +0 -0
  110. {neoload-1.3.18 → neoload-1.3.19.dev2}/neoload/resources/jinja/sample-trends-report.html.j2 +0 -0
  111. {neoload-1.3.18 → neoload-1.3.19.dev2}/neoload/resources/jinja/trends/general_details.html.j2 +0 -0
  112. {neoload-1.3.18 → neoload-1.3.19.dev2}/neoload/resources/jinja/trends/transaction_trends.html.j2 +0 -0
  113. {neoload-1.3.18 → neoload-1.3.19.dev2}/neoload/resources/jinja/trends/trends.js +0 -0
  114. {neoload-1.3.18 → neoload-1.3.19.dev2}/neoload/version_manager.py +0 -0
  115. {neoload-1.3.18 → neoload-1.3.19.dev2}/neoload.egg-info/dependency_links.txt +0 -0
  116. {neoload-1.3.18 → neoload-1.3.19.dev2}/neoload.egg-info/entry_points.txt +0 -0
  117. {neoload-1.3.18 → neoload-1.3.19.dev2}/neoload.egg-info/requires.txt +0 -0
  118. {neoload-1.3.18 → neoload-1.3.19.dev2}/neoload.egg-info/top_level.txt +0 -0
  119. {neoload-1.3.18 → neoload-1.3.19.dev2}/notes/PSB_20200421_TODO.txt +0 -0
  120. {neoload-1.3.18 → neoload-1.3.19.dev2}/notes/acceptance.txt +0 -0
  121. {neoload-1.3.18 → neoload-1.3.19.dev2}/pull_request_template.md +0 -0
  122. {neoload-1.3.18 → neoload-1.3.19.dev2}/pytest.ini +0 -0
  123. {neoload-1.3.18 → neoload-1.3.19.dev2}/requirements.txt +0 -0
  124. {neoload-1.3.18 → neoload-1.3.19.dev2}/resources/as-code.latest.schema.json +0 -0
  125. {neoload-1.3.18 → neoload-1.3.19.dev2}/setup.cfg +0 -0
  126. {neoload-1.3.18 → neoload-1.3.19.dev2}/setup.py +0 -0
  127. {neoload-1.3.18 → neoload-1.3.19.dev2}/sonar-project.properties +0 -0
  128. {neoload-1.3.18 → neoload-1.3.19.dev2}/tests/__init__.py +0 -0
  129. {neoload-1.3.18 → neoload-1.3.19.dev2}/tests/commands/docker/test_docker_cleanups.py +0 -0
  130. {neoload-1.3.18 → neoload-1.3.19.dev2}/tests/commands/docker/test_docker_connections.py +0 -0
  131. {neoload-1.3.18 → neoload-1.3.19.dev2}/tests/commands/docker/test_docker_hooks.py +0 -0
  132. {neoload-1.3.18 → neoload-1.3.19.dev2}/tests/commands/fastfail/test_fastfail_slas.py +0 -0
  133. {neoload-1.3.18 → neoload-1.3.19.dev2}/tests/commands/project/test_upload.py +0 -0
  134. {neoload-1.3.18 → neoload-1.3.19.dev2}/tests/commands/project/test_upload_with_password.py +0 -0
  135. {neoload-1.3.18 → neoload-1.3.19.dev2}/tests/commands/report/test_report.py +0 -0
  136. {neoload-1.3.18 → neoload-1.3.19.dev2}/tests/commands/report/test_report_json_output.py +0 -0
  137. {neoload-1.3.18 → neoload-1.3.19.dev2}/tests/commands/report/test_report_templates.py +0 -0
  138. {neoload-1.3.18 → neoload-1.3.19.dev2}/tests/commands/report/test_report_transactions.py +0 -0
  139. {neoload-1.3.18 → neoload-1.3.19.dev2}/tests/commands/report/test_report_trends.py +0 -0
  140. {neoload-1.3.18 → neoload-1.3.19.dev2}/tests/commands/report/test_trends_json_output.py +0 -0
  141. {neoload-1.3.18 → neoload-1.3.19.dev2}/tests/commands/report/test_trends_templates.py +0 -0
  142. {neoload-1.3.18 → neoload-1.3.19.dev2}/tests/commands/status/test_status_with_names.py +0 -0
  143. {neoload-1.3.18 → neoload-1.3.19.dev2}/tests/commands/test_config.py +0 -0
  144. {neoload-1.3.18 → neoload-1.3.19.dev2}/tests/commands/test_login.py +0 -0
  145. {neoload-1.3.18 → neoload-1.3.19.dev2}/tests/commands/test_logout.py +0 -0
  146. {neoload-1.3.18 → neoload-1.3.19.dev2}/tests/commands/test_logs/test_logs.py +0 -0
  147. {neoload-1.3.18 → neoload-1.3.19.dev2}/tests/commands/test_logs_url.py +0 -0
  148. {neoload-1.3.18 → neoload-1.3.19.dev2}/tests/commands/test_results/test_result_delete.py +0 -0
  149. {neoload-1.3.18 → neoload-1.3.19.dev2}/tests/commands/test_results/test_result_ls.py +0 -0
  150. {neoload-1.3.18 → neoload-1.3.19.dev2}/tests/commands/test_results/test_result_patch.py +0 -0
  151. {neoload-1.3.18 → neoload-1.3.19.dev2}/tests/commands/test_results/test_result_put.py +0 -0
  152. {neoload-1.3.18 → neoload-1.3.19.dev2}/tests/commands/test_run.py +0 -0
  153. {neoload-1.3.18 → neoload-1.3.19.dev2}/tests/commands/test_settings/test_create.py +0 -0
  154. {neoload-1.3.18 → neoload-1.3.19.dev2}/tests/commands/test_settings/test_createorpatch.py +0 -0
  155. {neoload-1.3.18 → neoload-1.3.19.dev2}/tests/commands/test_settings/test_delete.py +0 -0
  156. {neoload-1.3.18 → neoload-1.3.19.dev2}/tests/commands/test_settings/test_ls.py +0 -0
  157. {neoload-1.3.18 → neoload-1.3.19.dev2}/tests/commands/test_settings/test_patch.py +0 -0
  158. {neoload-1.3.18 → neoload-1.3.19.dev2}/tests/commands/test_settings/test_put.py +0 -0
  159. {neoload-1.3.18 → neoload-1.3.19.dev2}/tests/commands/wait/test_wait.py +0 -0
  160. {neoload-1.3.18 → neoload-1.3.19.dev2}/tests/commands/workspaces/test_workspace_ls.py +0 -0
  161. {neoload-1.3.18 → neoload-1.3.19.dev2}/tests/commands/workspaces/test_workspace_use.py +0 -0
  162. {neoload-1.3.18 → neoload-1.3.19.dev2}/tests/commands/zones/test_zones.py +0 -0
  163. {neoload-1.3.18 → neoload-1.3.19.dev2}/tests/helpers/__init__.py +0 -0
  164. {neoload-1.3.18 → neoload-1.3.19.dev2}/tests/helpers/test_utils.py +0 -0
  165. {neoload-1.3.18 → neoload-1.3.19.dev2}/tests/integration/expected/fastfail.log +0 -0
  166. {neoload-1.3.18 → neoload-1.3.19.dev2}/tests/integration/expected/junit-sla.xml +0 -0
  167. {neoload-1.3.18 → neoload-1.3.19.dev2}/tests/integration/expected/run.log +0 -0
  168. {neoload-1.3.18 → neoload-1.3.19.dev2}/tests/integration/expected/summary.txt +0 -0
  169. {neoload-1.3.18 → neoload-1.3.19.dev2}/tests/integration/runAllScripts.sh +0 -0
  170. {neoload-1.3.18 → neoload-1.3.19.dev2}/tests/integration/scripts/cleanup.sh +0 -0
  171. {neoload-1.3.18 → neoload-1.3.19.dev2}/tests/integration/scripts/project.upload.test.sh +0 -0
  172. {neoload-1.3.18 → neoload-1.3.19.dev2}/tests/integration/scripts/results.delete.test.sh +0 -0
  173. {neoload-1.3.18 → neoload-1.3.19.dev2}/tests/integration/scripts/results.patch.test.sh +0 -0
  174. {neoload-1.3.18 → neoload-1.3.19.dev2}/tests/integration/scripts/results.put.test.sh +0 -0
  175. {neoload-1.3.18 → neoload-1.3.19.dev2}/tests/integration/scripts/run.fastfail.test.sh +0 -0
  176. {neoload-1.3.18 → neoload-1.3.19.dev2}/tests/integration/scripts/run.oneliner.test.sh +0 -0
  177. {neoload-1.3.18 → neoload-1.3.19.dev2}/tests/integration/scripts/run.test.sh +0 -0
  178. {neoload-1.3.18 → neoload-1.3.19.dev2}/tests/integration/scripts/settings.create.delete.test.sh +0 -0
  179. {neoload-1.3.18 → neoload-1.3.19.dev2}/tests/integration/scripts/settings.patch.test.sh +0 -0
  180. {neoload-1.3.18 → neoload-1.3.19.dev2}/tests/integration/scripts/settings.put.test.sh +0 -0
  181. {neoload-1.3.18 → neoload-1.3.19.dev2}/tests/integration/scripts/validate.test.sh +0 -0
  182. {neoload-1.3.18 → neoload-1.3.19.dev2}/tests/integration/scripts/wait.test.sh +0 -0
  183. {neoload-1.3.18 → neoload-1.3.19.dev2}/tests/integration/scripts/zones.ls.test.sh +0 -0
  184. {neoload-1.3.18 → neoload-1.3.19.dev2}/tests/neoload_cli_lib/test_displayer.py +0 -0
  185. {neoload-1.3.18 → neoload-1.3.19.dev2}/tests/neoload_cli_lib/test_docker.py +0 -0
  186. {neoload-1.3.18 → neoload-1.3.19.dev2}/tests/neoload_cli_lib/test_filtering.py +0 -0
  187. {neoload-1.3.18 → neoload-1.3.19.dev2}/tests/neoload_cli_lib/test_rest_crud.py +0 -0
  188. {neoload-1.3.18 → neoload-1.3.19.dev2}/tests/neoload_cli_lib/test_running_tools.py +0 -0
  189. {neoload-1.3.18 → neoload-1.3.19.dev2}/tests/neoload_cli_lib/test_tools.py +0 -0
  190. {neoload-1.3.18 → neoload-1.3.19.dev2}/tests/neoload_cli_lib/test_user_data.py +0 -0
  191. {neoload-1.3.18 → neoload-1.3.19.dev2}/tests/neoload_projects/.nlignore +0 -0
  192. {neoload-1.3.18 → neoload-1.3.19.dev2}/tests/neoload_projects/broken_yaml.yaml +0 -0
  193. {neoload-1.3.18 → neoload-1.3.19.dev2}/tests/neoload_projects/empty.yaml +0 -0
  194. {neoload-1.3.18 → neoload-1.3.19.dev2}/tests/neoload_projects/example_1/.gitlab-ci.yml +0 -0
  195. {neoload-1.3.18 → neoload-1.3.19.dev2}/tests/neoload_projects/example_1/.nlignore +0 -0
  196. {neoload-1.3.18 → neoload-1.3.19.dev2}/tests/neoload_projects/example_1/data/cities.csv +0 -0
  197. {neoload-1.3.18 → neoload-1.3.19.dev2}/tests/neoload_projects/example_1/default.yaml +0 -0
  198. {neoload-1.3.18 → neoload-1.3.19.dev2}/tests/neoload_projects/example_1/paths/geosearch_get.yaml +0 -0
  199. {neoload-1.3.18 → neoload-1.3.19.dev2}/tests/neoload_projects/example_1/slas/prod.yaml +0 -0
  200. {neoload-1.3.18 → neoload-1.3.19.dev2}/tests/neoload_projects/example_1/slas/uat.yaml +0 -0
  201. {neoload-1.3.18 → neoload-1.3.19.dev2}/tests/neoload_projects/example_1.zip +0 -0
  202. {neoload-1.3.18 → neoload-1.3.19.dev2}/tests/neoload_projects/example_2.zip +0 -0
  203. {neoload-1.3.18 → neoload-1.3.19.dev2}/tests/neoload_projects/simpledemo.yml +0 -0
  204. {neoload-1.3.18 → neoload-1.3.19.dev2}/tests/resources/__init__.py +0 -0
  205. {neoload-1.3.18 → neoload-1.3.19.dev2}/tests/resources/expected_neoload_junit_slas.xml +0 -0
  206. {neoload-1.3.18 → neoload-1.3.19.dev2}/tests/resources/expected_summary_text_no_sla.txt +0 -0
  207. {neoload-1.3.18 → neoload-1.3.19.dev2}/tests/resources/expected_summary_text_with_sla.txt +0 -0
  208. {neoload-1.3.18 → neoload-1.3.19.dev2}/tests/resources/jinja/__init__.py +0 -0
  209. {neoload-1.3.18 → neoload-1.3.19.dev2}/tests/resources/report/expected_custom_report.html +0 -0
  210. {neoload-1.3.18 → neoload-1.3.19.dev2}/tests/resources/report/expected_custom_report_filtered.html +0 -0
  211. {neoload-1.3.18 → neoload-1.3.19.dev2}/tests/resources/report/expected_custom_transactions.csv +0 -0
  212. {neoload-1.3.18 → neoload-1.3.19.dev2}/tests/resources/report/expected_report.json +0 -0
  213. {neoload-1.3.18 → neoload-1.3.19.dev2}/tests/resources/report/expected_report_filtered.json +0 -0
  214. {neoload-1.3.18 → neoload-1.3.19.dev2}/tests/resources/report/expected_template_transactions.json +0 -0
  215. {neoload-1.3.18 → neoload-1.3.19.dev2}/tests/resources/report/expected_template_transactions_csv.csv +0 -0
  216. {neoload-1.3.18 → neoload-1.3.19.dev2}/tests/resources/report/expected_template_trends.html +0 -0
  217. {neoload-1.3.18 → neoload-1.3.19.dev2}/tests/resources/report/expected_trends.json +0 -0
  218. {neoload-1.3.18 → neoload-1.3.19.dev2}/tests/resources/report/raw_expected_custom_report.html +0 -0
  219. {neoload-1.3.18 → neoload-1.3.19.dev2}/tests/resources/report/raw_expected_report.json +0 -0
@@ -0,0 +1,597 @@
1
+ Metadata-Version: 2.4
2
+ Name: neoload
3
+ Version: 1.3.19.dev2
4
+ Summary: A command-line native utility for launching and observing NeoLoad performance tests
5
+ Home-page: https://github.com/Neotys-Labs/neoload-cli
6
+ Author: Neotys
7
+ Author-email:
8
+ License: Apache 2.0
9
+ Description-Content-Type: text/markdown
10
+ License-File: LICENSE
11
+ Requires-Dist: click>=7
12
+ Requires-Dist: pyconfig
13
+ Requires-Dist: appdirs
14
+ Requires-Dist: requests>=2.25.1
15
+ Requires-Dist: jsonschema
16
+ Requires-Dist: PyYAML>=5
17
+ Requires-Dist: junit_xml
18
+ Requires-Dist: termcolor
19
+ Requires-Dist: coloredlogs
20
+ Requires-Dist: gitignorefile
21
+ Requires-Dist: jinja2
22
+ Requires-Dist: python-dateutil
23
+ Requires-Dist: tqdm
24
+ Requires-Dist: requests_toolbelt
25
+ Requires-Dist: urllib3>=1.26.5
26
+ Requires-Dist: docker
27
+ Requires-Dist: pyparsing
28
+ Requires-Dist: simplejson
29
+ Requires-Dist: colorama
30
+ Requires-Dist: importlib-resources
31
+ Dynamic: author
32
+ Dynamic: description
33
+ Dynamic: description-content-type
34
+ Dynamic: home-page
35
+ Dynamic: license
36
+ Dynamic: license-file
37
+ Dynamic: requires-dist
38
+ Dynamic: summary
39
+
40
+ # NeoLoad CLI [![Python package](https://github.com/Neotys-Labs/neoload-cli/actions/workflows/python-package.yml/badge.svg?branch=master)](https://github.com/Neotys-Labs/neoload-cli/actions/workflows/python-package.yml)
41
+
42
+ ## Overview
43
+
44
+ This command-line interface lets you launch and monitor performance tests on the NeoLoad Web platform. Because NeoLoad supports many deployment models (SaaS, self-hosted, cloud or local containers, etc.), the configuration and test execution parameters depend on your licensing and infrastructure setup.
45
+
46
+
47
+ | Property | Value |
48
+ | ---------------- | ---------------- |
49
+ | Maturity | Stable |
50
+ | Author | Tricentis |
51
+ | License | [BSD 2-Clause "Simplified"](https://github.com/Neotys-Labs/neoload-cli/blob/master/LICENSE) |
52
+ | NeoLoad Licensing | FREE, Professional, or Enterprise edition |
53
+ | Supported versions | Tested with NeoLoad Web from version [2.3.2](https://neoload.saas.neotys.com) |
54
+ | Download Binaries | See the [latest release on PyPI](https://pypi.org/project/neoload) |
55
+
56
+ ## TL;DR ... What
57
+ This guide shows you how to:
58
+ 1. create API load tests as code (YAML)
59
+ 2. run them from any environment
60
+ 3. visualize the test results in web dashboards
61
+
62
+ ## TL;DR ... How
63
+ ```
64
+ pip3 install neoload
65
+ neoload login $NLW_TOKEN \
66
+ test-settings --zone $NLW_ZONE_DYNAMIC --lgs 5 --scenario sanityScenario createorpatch NewTest1 \
67
+ project --path tests/neoload_projects/example_1 upload NewTest1 \
68
+ run
69
+ ```
70
+ NOTE: On the Windows command line, replace the `\` line-continuation characters above with `^`.
71
+
72
+ ## Contents
73
+
74
+ - [Prerequisites](#prerequisites)
75
+ - [Installation](#installation)
76
+ - [Login to NeoLoad Web](#login-to-neoload-web)
77
+ - [Setup a test](#setup-a-test)
78
+ - [Setup resources in NeoLoad Web](#setup-resources-in-neoload-web)
79
+ - [Define a test](#define-a-test)
80
+ - [Upload a NeoLoad project](#upload-a-neoload-project)
81
+ - [Excluding files from the project upload](#excluding-files-from-the-project-upload)
82
+ - [Run a test](#run-a-test)
83
+ - [Stop a running test](#stop-a-running-test)
84
+ - [Reporting](#reporting)
85
+ - [View results](#view-results)
86
+ - [Exporting Transaction CSV data](#exporting-transaction-csv-data)
87
+ - [View zones](#view-zones)
88
+ - [Create local Docker infrastructure to run a test](#create-local-docker-infrastructure-to-run-a-test)
89
+ - [Examples](#examples)
90
+ - [As-Code Demo Project](#as-code-demo-project)
91
+ - [Continuous Testing Examples](#continuous-testing-examples)
92
+ - [Support for fast-fail based on SLAs](#support-for-fast-fail-based-on-slas)
93
+ - [Packaging the CLI with Build Agents](#packaging-the-cli-with-build-agents)
94
+ - [IDE Integrations](#ide-integrations)
95
+ - [Contributing](#contributing)
96
+
97
+ ## Prerequisites
98
+ The CLI requires **Python 3**.
99
+ - Download and install Python 3 for **Windows** from [Python.org](https://www.python.org/downloads/).
100
+ - Make sure you check the option *Add Python to the environment variables*.
101
+ - Install pip: ```python -m pip install -U pip```
102
+ - Download and install Python 3 for **macOS** from [Python.org - Python 3 on macOS](https://docs.python-guide.org/starting/install3/osx/).
103
+
104
+ Optional: install Docker if you want to host the test infrastructure on your machine (this feature is not supported with Docker for Windows).
105
+
106
+ ## Installation
107
+ ```
108
+ pip3 install neoload
109
+ neoload --help
110
+ ```
111
+
112
+ NOTE: if you receive SSL download errors when running the command above, you may also need to install the trusted root certificates with:
113
+ ```
114
+ pip3 install certifi
115
+ ```
116
+
117
+ ## Login to NeoLoad Web
118
+ The NeoLoad CLI uses the NeoLoad Web APIs for most operations, so you must log in before running any commands.
119
+ ```
120
+ neoload login [TOKEN]
121
+ neoload login --url http://your-onpremise-neoload-api.com/ --workspace "Default Workspace" your-token
122
+ ```
123
+ By default, the CLI connects to NeoLoad Web SaaS to lease a license. \
124
+ For a self-hosted Enterprise license, you must specify the NeoLoad Web **API URL** with `--url`.
125
+
126
+ The CLI stores data locally, such as the API URL, token, workspace ID, and the test ID you are currently working on. **Commands can be chained!**
127
+ ```
128
+ neoload status # Displays stored data
129
+ ```
130
+
131
+ ## Setup a test
132
+ ### Optionally choose a workspace to work with
133
+ ```
134
+ Usage: neoload workspaces [OPTIONS] [[ls|use]] [NAME_OR_ID]
135
+ Help: neoload workspaces --help
136
+ neoload workspaces use "Default Workspace"
137
+ ```
138
+ You can select your workspace at login or with the `use` sub-command. If no workspace is specified, the "Default Workspace" is used. \
139
+ **/!\\** Zones are shared between workspaces.
140
+
141
+
142
+ ### Setup resources in NeoLoad Web
143
+ Running a test requires an infrastructure defined in the NeoLoad Web *Zones* section ([see the documentation on how to manage zones](https://documentation.tricentis.com/nlweb/latest/en/content/reference_guide/resources_zones.htm)).
144
+ At a minimum, you need either a dynamic or a static zone containing one controller and one load generator. The simplest approach is to add resources to the "Default zone", since the CLI uses it by default.
145
+
146
+ ### Define a test
147
+ A NeoLoad Web test contains the test configuration and the list of its test results. You can analyze transaction values across the most recent test results to detect regressions.
148
+ ```
149
+ Usage: neoload test-settings [OPTIONS] [[ls|create|put|patch|delete|use|createorpatch]] [NAME]
150
+ Help: neoload test-settings --help
151
+ neoload test-settings --zone defaultzone --lgs 5 --scenario sanityScenario create NewTest1
152
+ ```
153
+ You can optionally define:
154
+ - which scenario of the NeoLoad project to use
155
+ - the test-settings description
156
+ - the controller and load generator zone to use (defaults to `defaultzone`)
157
+ - how many load generators to use in the zone (defaults to 1 LG on `defaultzone`)
158
+ - advanced users with multiple zones that have available resources can use: ```--zone my_controller_zone --lgs lg_zoneA:2,lg_zoneB:3```
159
+
160
+ To work with an existing test and chain commands against it:
161
+ ```
162
+ neoload test-settings use NewTest1
163
+ neoload test-settings use 4a5e7707-75c0-4106-bbd4-68962ac7f2b3
164
+ ```
165
+
166
+ ### Upload a NeoLoad project
167
+ For basic project examples, see the [`tests/neoload_projects` folder on GitHub](https://github.com/Neotys-Labs/neoload-cli/tree/master/tests/neoload_projects).
168
+
169
+ To upload a NeoLoad project (a ZIP file, a folder or a standalone as-code file) into a test-settings:
170
+ ```
171
+ Usage: neoload project [OPTIONS] [up|upload|meta] NAME_OR_ID
172
+ Help: neoload project --help
173
+ neoload project --path tests/neoload_projects/example_1/ upload
174
+ ```
175
+ You must indicate which test the project should be uploaded to, either by:
176
+ * running this command first:
177
+ <pre><code>neoload test-settings use NewTest1</code></pre>
178
+ * or by appending the name or ID of the test to the `project` command:
179
+ <pre><code>neoload project --path tests/neoload_projects/example_1/ upload NewTest1</code></pre>
180
+ :warning: If the test has no scenario, or if the configured scenario does not exist in the project, the "Custom" scenario is selected by default (10 VUs for 5 minutes).
181
+
182
+ To validate the syntax and schema of the as-code project YAML files:
183
+ ```
184
+ neoload validate sample_projects/example_1/default.yaml
185
+ ```
186
+
187
+ ### Excluding files from the project upload
188
+ If you upload a project directory that contains YAML files which are not NeoLoad as-code (such as `.gitlab-ci.yml`), you must create a `.nlignore` file (using the same syntax as `.gitignore`) to exclude those files from the upload. Otherwise, NeoLoad Web will try to parse them as NeoLoad as-code files and fail.
189
+
190
+ For details, see the GitLab and Azure pipeline examples.
191
+
192
+ ## Run a test
193
+ This command runs a test. It produces blocking, unbuffered output describing the execution progress, including current data points.
194
+ When the test completes, it displays a summary along with the SLAs that passed and failed.
195
+ ```
196
+ Usage: neoload run [OPTIONS] [NAME_OR_ID]
197
+ Help: neoload run --help
198
+ neoload run \ # Runs the currently selected test-settings (see neoload status and neoload test-settings use)
199
+ --as-code default.yaml,slas/uat.yaml \
200
+ --scenario scenario1
201
+ --name "MyCustomTestName_${JOB_ID}" \
202
+ --description "A custom test description containing hashtags like #latest or #issueNum"
203
+ ```
204
+ - `--detached` starts the test and returns immediately. Logs are available in NeoLoad Web (follow the URL).
205
+ - `--as-code` specifies the as-code YAML files to use for the test. They must already be uploaded with the project.
206
+ - `--scenario` specifies the name of the scenario to run. The scenario must be declared either in an as-code YAML file or in the project; otherwise the NeoLoad Web "Custom" scenario is used (10 VUs for 5 minutes).
207
+ - The test result name and description can be customized to include CI-specific details (e.g. CI job, build number, etc.).
208
+ - Reservations can be used with either a reservation ID, or a reservation duration combined with a number of virtual users.
209
+
210
+ When running in interactive console mode, the NeoLoad CLI automatically opens your system's default browser to display the live test results. \
211
+ Pressing `Ctrl+C` causes the CLI to attempt to stop the test gracefully.
212
+
213
+ ### Stop a running test
214
+ ```
215
+ neoload stop # Sends the stop signal to the test and waits until it ends.
216
+ ```
217
+
218
+ ## CheckVU an as-code project
219
+ This command runs a CheckVU on an as-code project: it executes a single virtual user to verify that the project runs. It is meant to support fast iteration on as-code projects (generate -> checkvu -> fix).
220
+
221
+ It delegates to a standalone headless CheckVU JAR and streams the JAR's output and exit code directly.
222
+
223
+ ```
224
+ Usage: neoload checkvu [OPTIONS] PROJECT_FILE
225
+ Help: neoload checkvu --help
226
+ neoload checkvu default.yaml
227
+ neoload checkvu -u myUser default.yaml
228
+ ```
229
+ - `PROJECT_FILE` is a path to an as-code yaml file. The CLI validates it against the as-code schema first (same as `neoload validate`), using `-s, --as-code-schema` to override the default schema.
230
+ - `-e, --engine-jar <path-or-url>` resolves the CheckVU JAR: a local file path or a download URL. If omitted, a previously cached JAR is reused, otherwise a default URL is used to download the latest JAR.
231
+ - `-j, --java` selects the java executable; by default `JAVA_HOME/bin/java` then `java` on the PATH. Java 21+ is required and verified before running.
232
+ - `-w, --work-dir <path>` sets the directory used for engine files and logs. Defaults to a temporary directory deleted afterwards unless `--keep-temp-work-dir` is set; a directory you supply yourself is never deleted.
233
+ - `--app-proxy`, `--app-proxy-username` and `--app-proxy-bypass` configure the proxy used for application traffic. The proxy password is set with `NEOLOAD_CHECK_VU_APP_PROXY_PASSWORD` environment variable instead so it never shows up in the process list or CI logs.
234
+ - `--controller-properties` and `--load-generator-properties` are advanced options to merge a `.properties` file into the JAR's embedded `controller.properties` / `agent.properties`.
235
+
236
+ ## Reporting
237
+
238
+ The NeoLoad CLI provides basic support for viewing and exporting test results.
239
+
240
+ ### View results
241
+ ```
242
+ Usage: neoload test-results [OPTIONS] [[ls|summary|junitsla|put|patch|delete|use]] [NAME]
243
+ Help: neoload test-results --help
244
+ neoload test-results ls # Lists test results
245
+ neoload test-results use # Remembers the test result you want to work on.
246
+ neoload test-results summary # JSON result summary, including SLAs
247
+ neoload test-results junitsla # Outputs the summary as a JUnit XML file
248
+ ```
249
+ Test metadata such as name, description, and status can be modified after the test is complete.
250
+
251
+ To filter test results by project, scenario, or status:
252
+ ```
253
+ neoload test-results --filter "project=MyProject;scenario=fullTest" ls
254
+ neoload test-results --filter "status=TERMINATED|qualityStatus=FAILED" ls
255
+ ```
256
+ NOTE: you can use either a semicolon or a pipe as the separator, but not both in the same filter.
257
+
258
+ To select a specific test result so that subsequent commands can be chained against it:
259
+ ```
260
+ neoload test-results use 4a5e7707-75c0-4106-bbd4-68962ac7f2b3
261
+ ```
262
+
263
+ Detailed logs and results are available on NeoLoad Web. To get the URL of the current result:
264
+ ```
265
+ neoload logs-url # The URL of the test in NeoLoad Web
266
+ ```
267
+
268
+ ### The test-results vs. report subcommands
269
+
270
+ The `test-results` subcommand is intended for direct operational queries against high-level API data.
271
+
272
+ The `report` subcommand is intended to simplify common data exporting needs and to provide templating capabilities over a standard, correlated data model. Unlike `test-results`, the `report` subcommand can be used to both generate and transform test result data.
273
+
274
+ :warning: The `report` subcommand can be **slow** (up to several hours) on results that contain many transactions or monitors.
275
+
276
+ ### Exporting Transaction CSV data
277
+ ```
278
+ Usage: neoload report [OPTIONS] [NAME]
279
+ Help: neoload report --help
280
+ neoload report --template builtin:transactions-csv "test_result_name_or_id" > temp.csv
281
+ ```
282
+
283
+ ### Filtering export data by timespan
284
+ In many load tests, the ramp-up and spin-down periods are not relevant to aggregate statistics. For example, while a system is warming up, it may produce higher-than-expected latencies until a steady state is reached.
285
+
286
+ The NeoLoad CLI therefore lets you export specific time ranges by providing a timespan filter.
287
+
288
+ ```
289
+ neoload report --template builtin:transactions-csv --filter "timespan=5m-95%"
290
+ neoload report --template builtin:transactions-csv --filter "timespan=15%"
291
+ neoload report --template builtin:transactions-csv --filter "timespan=-90%"
292
+ ```
293
+
294
+ The timespan format is `[Time]-[Time]`, where each `[Time]` is either a human-readable duration or a percentage of the total test duration.
295
+
296
+ The human-readable duration format combines hours, minutes, and seconds, for example `1h5m30s` or just `5m`.
297
+
298
+ Omitting the end `[Time]` filters the results from the specified time to the end of the test.
299
+
300
+ Similarly, omitting the start `[Time]` filters the results from the beginning of the test to the specified end time.
301
+
302
+ ### Filtering export data by element
303
+ It is often useful to narrow analysis and statistics down to a specific group of activities, such as login processes across multiple workflows (user paths) or other key business transactions.
304
+
305
+ The NeoLoad CLI therefore lets you export specific transactions whose name, parent, or user path name matches a given value or pattern.
306
+
307
+ ```
308
+ neoload report --template builtin:transactions-csv --filter "elements=Login"
309
+ ```
310
+ You can filter to specific transactions or requests by passing `elements` followed by a pipe-delimited list of element GUIDs, full names, or partial name matches. The values can also be Python-compatible regular expressions.
311
+
312
+ ### Combining timespan and element filters
313
+ ```
314
+ neoload report --template builtin:transactions-csv --filter "timespan=50%-95%;elements=AddToCart"
315
+ ```
316
+ The timespan and elements filters can be combined to compute statistics for specific elements within a precise portion of the test. In the example above, the report includes elements that contain `AddToCart` in their name, user path, or parent element, and the aggregates are calculated from halfway through the test to almost the very end.
317
+
318
+ ### Exporting all test data and using custom templates
319
+
320
+ If you want to use multiple templates to create separate output files for the same test data, dump the test result data first using the standard JSON schema:
321
+ ```
322
+ neoload report --out-file ~/Downloads/temp.json
323
+ ```
324
+ NOTE: by default, this queries all entity data for the test results and will trigger multiple API calls, depending on the structure of the user paths and monitoring data in the test result set.
325
+
326
+ You can then produce multiple output files from a single data snapshot:
327
+ ```
328
+ neoload report --json-in ~/Downloads/temp.json \
329
+ --template builtin:transactions-csv \
330
+ --out-file ~/Downloads/temp.csv
331
+
332
+ neoload report --json-in ~/Downloads/temp.json \
333
+ --template /path/to/a/jinja/template.j2 \
334
+ --out-file ~/Downloads/temp.html
335
+ ```
336
+
337
+ NOTE: built-in reports produce a reduced-scope JSON data model and are therefore faster than exporting all test data for various templates and output formats.
338
+
339
+ ### Working with large result sets
340
+
341
+ In the context of the CLI, a "large result set" means several hundred transactions, with several load generators, running for several hours.
342
+
343
+ The `report` subcommand retrieves a large amount of data from the NeoLoad Web API and is not recommended for large result sets, as it may take several hours to complete and can fail.
344
+
345
+ The `report` subcommand fetches all the `values` and `timeseries points` for every statistic from the NeoLoad Web API, for each transaction and monitor. \
346
+ It makes 2 API calls per transaction and 1 API call per monitor. Up to 10 calls run in parallel (configurable via the `NL_MAX_WORKERS` environment variable). \
347
+ On NeoLoad Web SaaS, the rate limit of 300 calls per minute may be reached, in which case the CLI will adapt and slow down accordingly.
348
+
349
+ To see which NeoLoad Web API calls are made, set the CLI log level to debug: `neoload --debug report`.
350
+
351
+ ## View zones
352
+ ```
353
+ neoload zones --human
354
+ Help: neoload zones --help
355
+ ```
356
+ Displays a human-readable list of all static and dynamic zones registered in NeoLoad Web, along with the resources attached to each (controllers and load generators).
357
+
358
+ ## Create local Docker infrastructure to run a test [EXPERIMENTAL]
359
+
360
+ ***WARNING: Docker features are not officially supported by Tricentis as they rely heavily on your local Docker setup and environment. This command is intended only for local/dev test scenarios, to simplify infrastructure requirements.***
361
+
362
+ In certain environments, such as a local development workstation or a Docker-in-Docker CI build node, it is useful to "bring your own infrastructure". In other words, when no controller and load generators are already available in a zone, you can spin them up with Docker before the test starts. Here is an all-in-one example:
363
+
364
+ ```
365
+ neoload docker install
366
+
367
+ neoload login $NLW_TOKEN \
368
+ test-settings --lgs 2 --scenario sanityScenario create NewTest1 \
369
+ project --path tests/neoload_projects/example_1 upload \
370
+ run
371
+ ```
372
+
373
+ `docker install` adds an extra step to the `run` command. This step is triggered when the controller zone defined in the test-settings matches `docker.zone` (default: `defaultzone`).
374
+ When triggered, it launches one controller along with the number of load generators specified in the test-settings, inside `docker.zone`.
375
+ The containers are removed at the end of the test.
376
+
377
+
378
+ You can also launch the Docker containers manually with `neoload docker up` and remove them with `neoload docker down`.
379
+ In this case, the number of controllers and load generators is taken from `docker.controller.default_count` (default: 1) and `docker.lg.default_count` (default: 2) respectively.
380
+
381
+
382
+ ```
383
+ Usage: neoload docker [OPTIONS] [up|down|clean|forget|install|uninstall|status]
384
+ Help: neoload docker --help
385
+
386
+
387
+ neoload docker up / down # start or delete container depend on configuration
388
+ neoload docker install/uninstall # add/remove hooks on run command to up when the controller zone is same and zone is empty. Shut down at the end of test running.
389
+ neoload docker forget # remove container from the launched list. That avoid to be removed with down command.
390
+ neoload docker clean # remove all container created by neoload-cli even if it was forgotten.
391
+ neoload docker status # display configuration and general status.
392
+
393
+ Options:
394
+ --no-wait Do not wait for controller and load generator in zones api
395
+ --help Show this message and exit.
396
+
397
+ Configuration:
398
+ - docker.controller.image (default: neotys/neoload-controller:latest)
399
+ - docker.controller.default_count (default: 1)
400
+ - docker.lg.image (default: neotys/neoload-loadgenerator:latest)
401
+ - docker.lg.default_count (default: 2)
402
+ - docker.zone (default: defaultzone)
403
+
404
+ ```
405
+
406
+ NOTE: the Docker CLI must be installed on the system for these commands to work. The CLI relies on whatever Docker daemon is configured. In a Docker-in-Docker context, this is detected automatically. On local workstations, installing Docker Desktop or Docker for Mac is sufficient.
407
+
408
+
409
+ ## CLI configuration
410
+ ```
411
+ neoload config ls
412
+ neoload config set docker.lg.default_count=1
413
+ Help: neoload config --help
414
+ ```
415
+ The configuration lets you customize the CLI's behavior. For now, it is only used by the `docker` command (see above).
416
+
417
+ ## Examples
418
+
419
+ ### As-Code Demo Project
420
+
421
+ [`examples/as-code-demo`](examples/as-code-demo) contains a NeoLoad As-Code YAML project that works out-of-the-box:
422
+ no NeoLoad Web project, no manual scenario setup - just point NeoLoad at
423
+ [`default.yaml`](examples/as-code-demo/default.yaml) and run.
424
+
425
+ Target: [Tricentis Demo Web Shop](https://demowebshop.tricentis.com/) (nopCommerce demo).
426
+
427
+ The `BuyAsGuest` user path walks through a typical guest purchase:
428
+
429
+ 1. Open the shop home page
430
+ 2. Browse a product category
431
+ 3. Add a product to the cart (quantity randomised per iteration via a variable)
432
+ 4. View the cart
433
+ 5. Check out as a guest
434
+ 6. View product details
435
+
436
+ It uses two variables (`product_id`, `quantity`) and a single population (`GuestShoppers`)
437
+
438
+ Run CheckVU against the project:
439
+ ```
440
+ neoload checkvu examples/as-code-demo/default.yaml
441
+ ```
442
+
443
+ Run the full test:
444
+ ```
445
+ neoload login $NLW_TOKEN \
446
+ test-settings --zone defaultzone --lgs 1 createorpatch DemoWebShopTest \
447
+ project --path examples/as-code-demo/default.yaml upload DemoWebShopTest \
448
+ run --scenario DemoWebShop
449
+ ```
450
+
451
+ ## Continuous Testing Examples
452
+ The main goal of the NeoLoad CLI is to standardize how load tests are executed across development, non-prod, and production environments.
453
+ The instructions above can be run from a contributor workstation, but they can also be easily translated to various continuous build and deployment platforms. Examples are provided for:
454
+
455
+ - [Jenkins](https://github.com/Neotys-Labs/neoload-cli/tree/master/examples/pipelines/jenkins)
456
+ - [GitHub](https://github.com/Neotys-Labs/neoload-cli/blob/master/examples/pipelines/github/neoload-github-actions-demo.yml)
457
+ - [Azure DevOps](https://github.com/Neotys-Labs/neoload-cli/tree/master/examples/pipelines/azure_devops)
458
+ - [GitLab](https://github.com/Neotys-Labs/neoload-cli/tree/master/examples/pipelines/gitlab)
459
+ - [AWS](https://github.com/Neotys-Labs/neoload-cli/tree/master/examples/pipelines/aws)
460
+ - [Bamboo](https://github.com/Neotys-Labs/neoload-cli/tree/master/examples/pipelines/bamboo-specs)
461
+
462
+
463
+ NB: when chaining commands, the return code of the whole chain is the return code of the **last command**. For that reason, you should not chain `run` with `test-results junitsla`.
464
+
465
+ NOTE: when combining NeoLoad projects with YAML-based pipeline declarations, see [Excluding files from the project upload](#excluding-files-from-the-project-upload) to make sure unnecessary artifacts are not included in the upload.
466
+
467
+ ### Support for fast-fail based on SLAs ###
468
+
469
+ Not every test succeeds. Sometimes environments are down, sometimes third-party services are unexpectedly slow. When such issues can be detected early, you don't want your build pipeline to wait for the full test duration to fail. Applying proper SLAs to your tests lets you monitor errors and latency while the test is running.
470
+
471
+ Consider the following SLA:
472
+
473
+ ```
474
+ sla_profiles:
475
+ - name: geo_3rdparty_sla
476
+ description: Avg Resp Time >=100ms >= 250ms for cached queries
477
+ thresholds:
478
+ - avg-resp-time warn >= 100ms fail >= 250ms per interval
479
+ - error-rate warn >= 5% fail >= 10% per test
480
+ ```
481
+
482
+ To fail the pipeline as soon as either of these thresholds is exceeded beyond a given percentage of the time, you need to:
483
+
484
+ - run the test in `--detached` mode so the test runs asynchronously
485
+ - use the `fastfail` command to monitor for early SLA violations and stop the test if needed
486
+ - finally, wait for the test results
487
+
488
+ Run the test in detached mode:
489
+
490
+ ```
491
+ neoload run \
492
+ --detached
493
+ ```
494
+
495
+ Then, immediately afterwards, run the `fastfail` command:
496
+ ```
497
+ neoload fastfail --max-failure 25 slas cur
498
+ ```
499
+
500
+ In this example, `25` represents the percentage of evaluations in which the SLA was violated. For instance, if an SLA-protected request was executed 50 times and the SLA failed 10 of those times, that is a 20% failure rate.
501
+
502
+ Finally, because the test was started in non-blocking mode, you must wait for the final test result:
503
+ ```
504
+ neoload wait cur
505
+ ```
506
+
507
+ [See here for a Jenkins pipeline example.](examples/pipelines/jenkins/Jenkinsfile_slafails)
508
+
509
+ ## Troubleshooting
510
+ ### Set debug log level
511
+ Use `neoload --debug ...` to show verbose logs from the neoload-cli.
512
+
513
+ ### Windows and non-UTF-8 characters
514
+ Windows uses ASCII as the default encoding, but the NeoLoad CLI requires UTF-8. \
515
+ Before running commands such as `neoload report` on Windows, you need to set the environment variable `set PYTHONUTF8=1`. \
516
+ For more information, see [the Windows UTF-8 mode docs](https://docs.python.org/3/using/windows.html#utf-8-mode) and [the os module docs](https://docs.python.org/3/library/os.html#utf8-mode).
517
+ Starting with Python 3.15, this is no longer necessary; see [PEP 686 – Make UTF-8 mode default](https://peps.python.org/pep-0686/).
518
+
519
+
520
+ ## Packaging the CLI with Build Agents
521
+ Many of the CI examples above install the NeoLoad CLI as one of the build steps. If you would rather bake the CLI directly into a build agent so it is ready to use during a job, see the following Docker example:
522
+
523
+ For Docker builds, [see the test harness Alpine-based Dockerfile](https://github.com/Neotys-Labs/neoload-cli/blob/master/examples/docker/Dockerfile).
524
+
525
+
526
+ ## IDE Integrations
527
+ Most of the work done in an IDE is creating and editing code, so we are mainly interested in being able to:
528
+ - easily write API tests in YAML (with automatic syntax validation)
529
+ - validate that tests do not contain unexpected errors, even at small scale
530
+ - run small (smoke) load tests locally so that code check-ins will work in CI/pipeline tests
531
+
532
+ The last two cases are already covered by the CLI itself, so our primary focus for IDE integrations is to accelerate test authoring by providing validation for the NeoLoad as-code DSL (Domain-Specific Language), and, in some cases, editor auto-complete.
533
+
534
+ Status of IDE / editor integrations:
535
+
536
+ | IDE / Editor | Syntax checks | Auto-complete | Setup steps
537
+ |:------------------:|:-------------:|:-------------:|:----------------:|
538
+ | Visual Studio Code | [x] | [x] | [See instructions](resources/ides/vscode_settings.json) |
539
+ | PyCharm | [x] | [x] | Mark the `neoload` directory as "Sources Root" |
540
+
541
+ ## Contributing
542
+ Feel free to fork this repo, make your changes, *test locally*, and then open a pull request.
543
+
544
+ ### Local verification
545
+
546
+ #### Tests
547
+ As part of your testing, run the built-in test suite with the following commands. \
548
+ NOTE: when testing on macOS, replace the semicolons (`;`) in `PYTHONPATH` with colons (`:`).
549
+
550
+ ```
551
+ pytest -v
552
+ pytest -v -m "not slow" # Skip slow tests
553
+
554
+ # Run against a real NeoLoad instance. Mocks are disabled.
555
+ pytest -v --token <your_personal_token> --url https://neoload-api.saas.neotys.com/ --makelivecalls
556
+
557
+ # Run the integration tests. These execute scripts using real neoload commands and assert the JSON output with jq.
558
+ # Requires at least 1 controller and 1 LG on the provided zone.
559
+ ./tests/integration/runAllScripts.sh <your_personal_token> --url https://neoload-api.saas.neotys.com/ defaultzone
560
+ ```
561
+
562
+ In addition, any contribution to the DSL validation functionality (for example, to the JSON schema or the `validate` command) should run the following tests locally before pushing:
563
+ ```
564
+ ./tests/neoload_projects/yaml_variants/validate_all.sh
565
+ ```
566
+ This command runs a series of NEGATIVE tests that ensure changes to the JSON schema or validation process correctly produce failures when the input is malformed in specific, common ways.
567
+
568
+ ### Release process (managed by the Tricentis NeoLoad team)
569
+
570
+ #### Auto-generating the changelog
571
+
572
+ Before tagging a release, merged PRs should update `CHANGELOG.md` using the following command:
573
+
574
+ ```
575
+ github_changelog_generator -u Neotys-Labs -p neoload-cli --token $GIT_CHANGELOG_GEN --exclude-tags-regex ".*(dev|rc).*" --add-sections '{"documentation":{"prefix":"**Documentation updates:**","labels":["documentation"]}}'
576
+ ```
577
+
578
+ This utility is a [Ruby-based gem](https://github.com/github-changelog-generator/github-changelog-generator) (also used in CI/Actions) that can be installed with:
579
+
580
+ ```
581
+ gem install github_changelog_generator
582
+ ```
583
+
584
+ #### Version management on PyPI
585
+ Given that X, Y, Z, and N are integers, versions on PyPI are named as follows: \
586
+ **Final release version = X.Y.Z** — example: *1.4.0*. Install it with ```pip install neoload``` \
587
+ **Release candidate version = X.Y.ZrcN** — example: *1.5.0rc1* for the next candidate version. Install it with ```pip install neoload --pre``` \
588
+ **Development version = X.Y.Z.devN** — example: *1.4.0.dev1* for a development version based on the final release 1.4.0. Install it with ```pip install neoload==1.4.0.dev1```
589
+
590
+ A release candidate version contains all the features planned for the release and is undergoing testing by the Quality Assurance team.
591
+
592
+ Development versions may contain work that is not planned by R&D and has not been tested by the Quality Assurance team. They should always be based on an official release, not on an upcoming one.
593
+
594
+ **Increment policy:**
595
+ - Increment the minor version for a major feature, such as a new top-level command.
596
+ - Increment the patch version for executable changes, such as fixing an existing feature, updating a subcommand of an existing top-level command, or updating the options of an existing command.
597
+ - No release is needed when the executable is not modified, for example when only updating automated CI tests, unit tests, the README, pipeline examples, or report templates.