mite 2.4.2__tar.gz → 2.4.4__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 (156) hide show
  1. {mite-2.4.2 → mite-2.4.4}/PKG-INFO +1 -1
  2. {mite-2.4.2 → mite-2.4.4}/mite/__main__.py +1 -0
  3. {mite-2.4.2 → mite-2.4.4}/mite/cli/test.py +69 -15
  4. {mite-2.4.2 → mite-2.4.4}/mite/config.py +2 -2
  5. {mite-2.4.2 → mite-2.4.4}/mite/logoutput.py +16 -4
  6. {mite-2.4.2 → mite-2.4.4}/mite.egg-info/PKG-INFO +1 -1
  7. {mite-2.4.2 → mite-2.4.4}/test/test_mite_amqp.py +4 -11
  8. {mite-2.4.2 → mite-2.4.4}/test/test_mite_kafka.py +2 -2
  9. {mite-2.4.2 → mite-2.4.4}/test-requirements.txt +1 -1
  10. {mite-2.4.2 → mite-2.4.4}/.dockerignore +0 -0
  11. {mite-2.4.2 → mite-2.4.4}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  12. {mite-2.4.2 → mite-2.4.4}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  13. {mite-2.4.2 → mite-2.4.4}/.github/pull_request_template.md +0 -0
  14. {mite-2.4.2 → mite-2.4.4}/.gitignore +0 -0
  15. {mite-2.4.2 → mite-2.4.4}/.isort.cfg +0 -0
  16. {mite-2.4.2 → mite-2.4.4}/.pre-commit-config.yaml +0 -0
  17. {mite-2.4.2 → mite-2.4.4}/.travis.yml +0 -0
  18. {mite-2.4.2 → mite-2.4.4}/CODE_OF_CONDUCT.md +0 -0
  19. {mite-2.4.2 → mite-2.4.4}/CONTRIBUTING.md +0 -0
  20. {mite-2.4.2 → mite-2.4.4}/DEV.md +0 -0
  21. {mite-2.4.2 → mite-2.4.4}/Dockerfile +0 -0
  22. {mite-2.4.2 → mite-2.4.4}/Dockerfile.perftest +0 -0
  23. {mite-2.4.2 → mite-2.4.4}/LICENSE +0 -0
  24. {mite-2.4.2 → mite-2.4.4}/MANIFEST.in +0 -0
  25. {mite-2.4.2 → mite-2.4.4}/README.md +0 -0
  26. {mite-2.4.2 → mite-2.4.4}/cd-scripts/cdBuild-1.sh +0 -0
  27. {mite-2.4.2 → mite-2.4.4}/cd-scripts/cdRelease.py +0 -0
  28. {mite-2.4.2 → mite-2.4.4}/cd-scripts/cdTagRelease.sh +0 -0
  29. {mite-2.4.2 → mite-2.4.4}/cd-scripts/runTests.sh +0 -0
  30. {mite-2.4.2 → mite-2.4.4}/cd.yml +0 -0
  31. {mite-2.4.2 → mite-2.4.4}/dev-requirements.txt +0 -0
  32. {mite-2.4.2 → mite-2.4.4}/docker_compose.yml +0 -0
  33. {mite-2.4.2 → mite-2.4.4}/docker_compose_monitoring.yml +0 -0
  34. {mite-2.4.2 → mite-2.4.4}/docs/Makefile +0 -0
  35. {mite-2.4.2 → mite-2.4.4}/docs/components.rst +0 -0
  36. {mite-2.4.2 → mite-2.4.4}/docs/conf.py +0 -0
  37. {mite-2.4.2 → mite-2.4.4}/docs/config.rst +0 -0
  38. {mite-2.4.2 → mite-2.4.4}/docs/design-deployment.rst +0 -0
  39. {mite-2.4.2 → mite-2.4.4}/docs/index.rst +0 -0
  40. {mite-2.4.2 → mite-2.4.4}/docs/journeys.rst +0 -0
  41. {mite-2.4.2 → mite-2.4.4}/docs/notes.txt +0 -0
  42. {mite-2.4.2 → mite-2.4.4}/docs/prometheus.rst +0 -0
  43. {mite-2.4.2 → mite-2.4.4}/docs/stats.rst +0 -0
  44. {mite-2.4.2 → mite-2.4.4}/docs/volume-model.rst +0 -0
  45. {mite-2.4.2 → mite-2.4.4}/grafana/Dockerfile +0 -0
  46. {mite-2.4.2 → mite-2.4.4}/grafana/config.ini +0 -0
  47. {mite-2.4.2 → mite-2.4.4}/grafana/provisioning/dashboards/dashboards.yml +0 -0
  48. {mite-2.4.2 → mite-2.4.4}/grafana/provisioning/dashboards/grafana_dashboard_template.json +0 -0
  49. {mite-2.4.2 → mite-2.4.4}/grafana/provisioning/dashboards/mite_docker.json +0 -0
  50. {mite-2.4.2 → mite-2.4.4}/grafana/provisioning/datasources/datasources.yml +0 -0
  51. {mite-2.4.2 → mite-2.4.4}/local/Makefile +0 -0
  52. {mite-2.4.2 → mite-2.4.4}/local/README.md +0 -0
  53. {mite-2.4.2 → mite-2.4.4}/local/demo.py +0 -0
  54. {mite-2.4.2 → mite-2.4.4}/local/run_mite.sh +0 -0
  55. {mite-2.4.2 → mite-2.4.4}/mite/__init__.py +0 -0
  56. {mite-2.4.2 → mite-2.4.4}/mite/cli/__init__.py +0 -0
  57. {mite-2.4.2 → mite-2.4.4}/mite/cli/cat.py +0 -0
  58. {mite-2.4.2 → mite-2.4.4}/mite/cli/collector.py +0 -0
  59. {mite-2.4.2 → mite-2.4.4}/mite/cli/common.py +0 -0
  60. {mite-2.4.2 → mite-2.4.4}/mite/cli/duplicator.py +0 -0
  61. {mite-2.4.2 → mite-2.4.4}/mite/cli/receiver.py +0 -0
  62. {mite-2.4.2 → mite-2.4.4}/mite/cli/stats.py +0 -0
  63. {mite-2.4.2 → mite-2.4.4}/mite/collector.py +0 -0
  64. {mite-2.4.2 → mite-2.4.4}/mite/context.py +0 -0
  65. {mite-2.4.2 → mite-2.4.4}/mite/controller.py +0 -0
  66. {mite-2.4.2 → mite-2.4.4}/mite/datapools.py +0 -0
  67. {mite-2.4.2 → mite-2.4.4}/mite/example.py +0 -0
  68. {mite-2.4.2 → mite-2.4.4}/mite/exceptions.py +0 -0
  69. {mite-2.4.2 → mite-2.4.4}/mite/har_to_mite.py +0 -0
  70. {mite-2.4.2 → mite-2.4.4}/mite/nanomsg.py +0 -0
  71. {mite-2.4.2 → mite-2.4.4}/mite/recorder.py +0 -0
  72. {mite-2.4.2 → mite-2.4.4}/mite/runner.py +0 -0
  73. {mite-2.4.2 → mite-2.4.4}/mite/scenario.py +0 -0
  74. {mite-2.4.2 → mite-2.4.4}/mite/stats.py +0 -0
  75. {mite-2.4.2 → mite-2.4.4}/mite/test.py +0 -0
  76. {mite-2.4.2 → mite-2.4.4}/mite/utils.py +0 -0
  77. {mite-2.4.2 → mite-2.4.4}/mite/volume_model.py +0 -0
  78. {mite-2.4.2 → mite-2.4.4}/mite/web/__init__.py +0 -0
  79. {mite-2.4.2 → mite-2.4.4}/mite/web/prometheus.py +0 -0
  80. {mite-2.4.2 → mite-2.4.4}/mite/zmq.py +0 -0
  81. {mite-2.4.2 → mite-2.4.4}/mite.egg-info/SOURCES.txt +0 -0
  82. {mite-2.4.2 → mite-2.4.4}/mite.egg-info/dependency_links.txt +0 -0
  83. {mite-2.4.2 → mite-2.4.4}/mite.egg-info/entry_points.txt +0 -0
  84. {mite-2.4.2 → mite-2.4.4}/mite.egg-info/requires.txt +0 -0
  85. {mite-2.4.2 → mite-2.4.4}/mite.egg-info/top_level.txt +0 -0
  86. {mite-2.4.2 → mite-2.4.4}/mite_amqp/__init__.py +0 -0
  87. {mite-2.4.2 → mite-2.4.4}/mite_browser/__init__.py +0 -0
  88. {mite-2.4.2 → mite-2.4.4}/mite_finagle/README.md +0 -0
  89. {mite-2.4.2 → mite-2.4.4}/mite_finagle/__init__.py +0 -0
  90. {mite-2.4.2 → mite-2.4.4}/mite_finagle/mux.py +0 -0
  91. {mite-2.4.2 → mite-2.4.4}/mite_finagle/stats.py +0 -0
  92. {mite-2.4.2 → mite-2.4.4}/mite_finagle/tests/__init__.py +0 -0
  93. {mite-2.4.2 → mite-2.4.4}/mite_finagle/tests/conftest.py +0 -0
  94. {mite-2.4.2 → mite-2.4.4}/mite_finagle/tests/foo_service/Foo-remote +0 -0
  95. {mite-2.4.2 → mite-2.4.4}/mite_finagle/tests/foo_service/Foo.py +0 -0
  96. {mite-2.4.2 → mite-2.4.4}/mite_finagle/tests/foo_service/__init__.py +0 -0
  97. {mite-2.4.2 → mite-2.4.4}/mite_finagle/tests/foo_service/constants.py +0 -0
  98. {mite-2.4.2 → mite-2.4.4}/mite_finagle/tests/foo_service/ttypes.py +0 -0
  99. {mite-2.4.2 → mite-2.4.4}/mite_finagle/tests/foo_service.thrift +0 -0
  100. {mite-2.4.2 → mite-2.4.4}/mite_finagle/tests/test_integration.py +0 -0
  101. {mite-2.4.2 → mite-2.4.4}/mite_finagle/tests/test_mux.py +0 -0
  102. {mite-2.4.2 → mite-2.4.4}/mite_finagle/tests/test_thrift.py +0 -0
  103. {mite-2.4.2 → mite-2.4.4}/mite_finagle/thrift.py +0 -0
  104. {mite-2.4.2 → mite-2.4.4}/mite_http/__init__.py +0 -0
  105. {mite-2.4.2 → mite-2.4.4}/mite_http/stats.py +0 -0
  106. {mite-2.4.2 → mite-2.4.4}/mite_kafka/__init__.py +0 -0
  107. {mite-2.4.2 → mite-2.4.4}/mite_kafka/mite_kafka_example.py +0 -0
  108. {mite-2.4.2 → mite-2.4.4}/mite_kafka/stats.py +0 -0
  109. {mite-2.4.2 → mite-2.4.4}/mite_selenium/__init__.py +0 -0
  110. {mite-2.4.2 → mite-2.4.4}/mite_selenium/stats.py +0 -0
  111. {mite-2.4.2 → mite-2.4.4}/mite_websocket/__init__.py +0 -0
  112. {mite-2.4.2 → mite-2.4.4}/prometheus/Dockerfile +0 -0
  113. {mite-2.4.2 → mite-2.4.4}/prometheus/prometheus_config_docker.yml +0 -0
  114. {mite-2.4.2 → mite-2.4.4}/prometheus/prometheus_config_template.yml +0 -0
  115. {mite-2.4.2 → mite-2.4.4}/pyproject.toml +0 -0
  116. {mite-2.4.2 → mite-2.4.4}/requirements.txt +0 -0
  117. {mite-2.4.2 → mite-2.4.4}/setup.cfg +0 -0
  118. {mite-2.4.2 → mite-2.4.4}/setup.py +0 -0
  119. {mite-2.4.2 → mite-2.4.4}/test/legacy.py +0 -0
  120. {mite-2.4.2 → mite-2.4.4}/test/mocks/mock_collector.py +0 -0
  121. {mite-2.4.2 → mite-2.4.4}/test/mocks/mock_context.py +0 -0
  122. {mite-2.4.2 → mite-2.4.4}/test/mocks/mock_direct_receiver.py +0 -0
  123. {mite-2.4.2 → mite-2.4.4}/test/mocks/mock_direct_runner_transport.py +0 -0
  124. {mite-2.4.2 → mite-2.4.4}/test/mocks/mock_recorder_msg_http.py +0 -0
  125. {mite-2.4.2 → mite-2.4.4}/test/mocks/mock_selenium.py +0 -0
  126. {mite-2.4.2 → mite-2.4.4}/test/mocks/mock_sender.py +0 -0
  127. {mite-2.4.2 → mite-2.4.4}/test/perf/.gitignore +0 -0
  128. {mite-2.4.2 → mite-2.4.4}/test/perf/http_server.py +0 -0
  129. {mite-2.4.2 → mite-2.4.4}/test/perf/http_server_aiohttp.py +0 -0
  130. {mite-2.4.2 → mite-2.4.4}/test/perf/mite_perftest.py +0 -0
  131. {mite-2.4.2 → mite-2.4.4}/test/perf/perftest.py +0 -0
  132. {mite-2.4.2 → mite-2.4.4}/test/perf/run-perftest.sh +0 -0
  133. {mite-2.4.2 → mite-2.4.4}/test/perf/test-requirements.txt +0 -0
  134. {mite-2.4.2 → mite-2.4.4}/test/test.har +0 -0
  135. {mite-2.4.2 → mite-2.4.4}/test/test_collector.py +0 -0
  136. {mite-2.4.2 → mite-2.4.4}/test/test_config.py +0 -0
  137. {mite-2.4.2 → mite-2.4.4}/test/test_context.py +0 -0
  138. {mite-2.4.2 → mite-2.4.4}/test/test_controller.py +0 -0
  139. {mite-2.4.2 → mite-2.4.4}/test/test_datapools.py +0 -0
  140. {mite-2.4.2 → mite-2.4.4}/test/test_har_to_mite.py +0 -0
  141. {mite-2.4.2 → mite-2.4.4}/test/test_logging.py +0 -0
  142. {mite-2.4.2 → mite-2.4.4}/test/test_mite_browser.py +0 -0
  143. {mite-2.4.2 → mite-2.4.4}/test/test_mite_http.py +0 -0
  144. {mite-2.4.2 → mite-2.4.4}/test/test_mite_utils.py +0 -0
  145. {mite-2.4.2 → mite-2.4.4}/test/test_mite_websockets.py +0 -0
  146. {mite-2.4.2 → mite-2.4.4}/test/test_prometheus_mite.py +0 -0
  147. {mite-2.4.2 → mite-2.4.4}/test/test_recorder.py +0 -0
  148. {mite-2.4.2 → mite-2.4.4}/test/test_runner.py +0 -0
  149. {mite-2.4.2 → mite-2.4.4}/test/test_runner_tracker.py +0 -0
  150. {mite-2.4.2 → mite-2.4.4}/test/test_scenario.py +0 -0
  151. {mite-2.4.2 → mite-2.4.4}/test/test_stats.py +0 -0
  152. {mite-2.4.2 → mite-2.4.4}/test/test_volume_model.py +0 -0
  153. {mite-2.4.2 → mite-2.4.4}/test/test_webdriver.py +0 -0
  154. {mite-2.4.2 → mite-2.4.4}/test/test_work_tracker.py +0 -0
  155. {mite-2.4.2 → mite-2.4.4}/test.har +0 -0
  156. {mite-2.4.2 → mite-2.4.4}/tox.ini +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: mite
3
- Version: 2.4.2
3
+ Version: 2.4.4
4
4
  Summary: A Python Performance Testing Framework
5
5
  Home-page: https://github.com/sky-uk/mite/
6
6
  Classifier: License :: OSI Approved :: MIT License
@@ -97,6 +97,7 @@ Options:
97
97
  --mean-response-time-threshold=THRESHOLD Set the mean response time accepted before setting exit status to 1 [default: 0]
98
98
  --standard-deviation-response-time-threshold=THRESHOLD Set the response time standard deviation accepted before setting exit status to 1 [default: 0]
99
99
  --standard-deviation-req-sec-threshold=THRESHOLD Set the request per second standard deviation accepted before setting exit status to 1 [default: 0]
100
+ --benchmark-percentiles=NEW_VALUE Percentiles(int):threshold(int in milliseconds) pairs separated by commas [default: 50:0,90:0,98:0,99:0]
100
101
  """
101
102
  import asyncio
102
103
  import logging
@@ -128,6 +128,10 @@ async def controller_report(controller, receiver):
128
128
  controller.report(receiver.recieve)
129
129
 
130
130
 
131
+ def time_unit_format(number):
132
+ return f"{number * 1000:.2f}ms" if number < 1 else f"{number:.3f}s"
133
+
134
+
131
135
  def test_scenarios(test_name, opts, scenarios, config_manager):
132
136
  scenario_manager = _create_scenario_manager(opts)
133
137
  for journey_spec, datapool, volumemodel in scenarios:
@@ -191,6 +195,16 @@ def test_scenarios(test_name, opts, scenarios, config_manager):
191
195
 
192
196
  if opts.get("--report"):
193
197
  benchmark_report(http_stats_output)
198
+ for (
199
+ percentile,
200
+ threshold,
201
+ result,
202
+ ) in http_stats_output.percentiles_list_resp_time_store:
203
+ if threshold != 0 and result * 1000 >= threshold:
204
+ has_error = True
205
+ logging.error(
206
+ f"Response time at {percentile}th percentile exceeded {threshold}ms: {time_unit_format(result)}"
207
+ )
194
208
 
195
209
  # Ensure any open files get closed
196
210
  del receiver._raw_listeners
@@ -207,25 +221,62 @@ def human_readable_bytes(size):
207
221
  return size, "PB"
208
222
 
209
223
 
224
+ def colorise_result(result, threshold):
225
+ formatted_result = time_unit_format(result)
226
+ if threshold != 0:
227
+ result_ms = result * 1000
228
+ if result_ms >= threshold:
229
+ return f"\033[91m{formatted_result}\033[0m" # red
230
+ else:
231
+ return f"\033[92m{formatted_result}\033[0m" # green
232
+ return formatted_result
233
+
234
+
210
235
  def benchmark_report(http_stats_output):
211
- table = PrettyTable()
212
- table.field_names = ["Metric", "Avg", "Min", "Max", "Std Dev", "+/- Std Dev"]
213
- number_format = (
214
- lambda number: f"{number / 1000:.2f}K" if number >= 1000 else f"{number:.2f}"
215
- )
236
+ perctile_thresh_results_list = http_stats_output.percentiles_list_resp_time_store
216
237
 
217
- table.add_row(
238
+ percentiles_headers = [
239
+ f"{int(percentile[0])} %tile" for percentile in perctile_thresh_results_list
240
+ ]
241
+ standard_headers = ["", "Avg", "Min", "Max", "Std Dev", "+/- Std Dev"]
242
+
243
+ latency_table = PrettyTable()
244
+ latency_table.field_names = standard_headers + percentiles_headers
245
+
246
+ latency_table.add_row(
218
247
  [
219
248
  "Latency",
220
- f"{http_stats_output.mean_resp_time * 1000:.2f}ms",
221
- f"{http_stats_output._resp_time_min * 1000:.2f}ms",
222
- f"{http_stats_output._resp_time_max * 1000:.2f}ms",
223
- f"{http_stats_output.resp_time_standard_deviation * 1000:.2f}ms",
249
+ time_unit_format(http_stats_output.mean_resp_time),
250
+ time_unit_format(http_stats_output._resp_time_min),
251
+ time_unit_format(http_stats_output._resp_time_max),
252
+ time_unit_format(http_stats_output.resp_time_standard_deviation),
224
253
  f"{http_stats_output.resp_time_within_standard_deviation:.2f}%",
225
- ]
254
+ *[
255
+ colorise_result(result, threshold)
256
+ for _, threshold, result in perctile_thresh_results_list
257
+ ],
258
+ ],
259
+ divider=True,
226
260
  )
227
261
 
228
- table.add_row(
262
+ if any(threshold[1] != 0 for threshold in perctile_thresh_results_list):
263
+ latency_table.add_row(
264
+ [
265
+ "Test Thresholds",
266
+ *["-" for _ in range(len(standard_headers) - 1)],
267
+ *[
268
+ f"{threshold[1]}ms" if threshold[1] != 0 else "-"
269
+ for threshold in perctile_thresh_results_list
270
+ ],
271
+ ],
272
+ )
273
+
274
+ requests_table = PrettyTable()
275
+ requests_table.field_names = standard_headers
276
+ number_format = (
277
+ lambda number: f"{number / 1000:.2f}K" if number >= 1000 else f"{number:.2f}"
278
+ )
279
+ requests_table.add_row(
229
280
  [
230
281
  "Req/Sec",
231
282
  number_format(http_stats_output.req_sec_mean),
@@ -236,11 +287,14 @@ def benchmark_report(http_stats_output):
236
287
  ]
237
288
  )
238
289
 
239
- table.align["Metric"] = "l"
240
290
  data_transfer, data_unit = human_readable_bytes(http_stats_output._data_transferred)
241
- print(table)
291
+ print("\n" + "=" * 20 + " MITE Benchmark Report " + "=" * 20, end="\n\n")
292
+ print(latency_table, end="\n\n")
293
+ print(requests_table, end="\n\n")
294
+ print("=" * 27 + " Summary " + "=" * 27)
242
295
  print(
243
- f"{http_stats_output._req_total} requests in {http_stats_output._scenarios_completed_time - http_stats_output._init_time:.2f}s, {data_transfer:.2f} {data_unit} data transferred"
296
+ f"{http_stats_output._req_total} requests in {http_stats_output._scenarios_completed_time - http_stats_output._init_time:.2f}s, {data_transfer:.2f} {data_unit} data transferred",
297
+ end="\n\n",
244
298
  )
245
299
 
246
300
 
@@ -46,10 +46,10 @@ def default_config_loader():
46
46
  for name, value in os.environ.items():
47
47
  if name.startswith("MITE_CONF_"):
48
48
  key_name = name[10:]
49
- logger.info(f'Setting config "{key_name}" from environment variable')
49
+ logger.debug(f'Setting config "{key_name}" from environment variable')
50
50
  result[key_name] = value
51
51
  if name.startswith("MITE_EVAL_CONF_"):
52
52
  key_name = name[15:]
53
- logger.info(f'Setting config "{key_name}" by eval\'ing environment variable')
53
+ logger.debug(f'Setting config "{key_name}" by eval\'ing environment variable')
54
54
  result[key_name] = eval(value)
55
55
  return result
@@ -64,6 +64,7 @@ class GenericStatsOutput:
64
64
  self._data_transferred = 0
65
65
  self._standard_deviation = 0
66
66
  self._error_journeys = defaultdict(int)
67
+ self._benchmark_percentiles = opts.get("--benchmark-percentiles")
67
68
 
68
69
  def _pct(self, percentile):
69
70
  """Percentile calculation with linear interpolation.
@@ -157,6 +158,17 @@ class GenericStatsOutput:
157
158
  journey_name = message.get("journey")
158
159
  self._error_journeys[journey_name] += 1
159
160
 
161
+ @property
162
+ def percentiles_list_resp_time_store(self):
163
+ percentiles = self._benchmark_percentiles.split(",")
164
+ percentiles_thresholds_list = [
165
+ (int(p.split(":")[0]), int(p.split(":")[1])) for p in percentiles
166
+ ]
167
+ if not self._resp_time_store:
168
+ return []
169
+ quantiles = statistics.quantiles(self._resp_time_store, n=100)
170
+ return [(p[0], p[1], quantiles[p[0] - 1]) for p in percentiles_thresholds_list]
171
+
160
172
  @property
161
173
  def mean_resp_time(self):
162
174
  if not self._resp_time_store:
@@ -165,15 +177,15 @@ class GenericStatsOutput:
165
177
 
166
178
  @property
167
179
  def max_resp_time_recent(self):
168
- if not self._resp_time_recent:
180
+ if not self._resp_time_store:
169
181
  return 0
170
- return max(self._resp_time_recent)
182
+ return max(self._resp_time_store)
171
183
 
172
184
  @property
173
185
  def min_resp_time_recent(self):
174
- if not self._resp_time_recent:
186
+ if not self._resp_time_store:
175
187
  return 0
176
- return min(self._resp_time_recent)
188
+ return min(self._resp_time_store)
177
189
 
178
190
  @property
179
191
  def req_sec_mean(self):
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: mite
3
- Version: 2.4.2
3
+ Version: 2.4.4
4
4
  Summary: A Python Performance Testing Framework
5
5
  Home-page: https://github.com/sky-uk/mite/
6
6
  Classifier: License :: OSI Approved :: MIT License
@@ -33,29 +33,22 @@ async def test_mite_amqp_decorator_uninstall():
33
33
 
34
34
 
35
35
  @pytest.mark.asyncio
36
- # FIXME new for 3.8
37
- # @unittest.mock.patch("aio_pika.connect")
38
- # FIXME this test fails under tox, passes(?) otherwise
39
- @pytest.mark.xfail(strict=False)
40
36
  async def test_mite_amqp_connect():
41
37
  context = MockContext()
42
38
  url = "amqp://foo.bar"
43
-
44
39
  connect_mock = AsyncMock()
45
40
 
46
41
  @mite_amqp
47
42
  async def dummy_journey(ctx):
48
43
  await ctx.amqp.connect(url)
49
44
 
50
- with patch("aio_pika.connect", new=connect_mock):
45
+ with patch("aio_pika.connect", side_effect=connect_mock):
51
46
  await dummy_journey(context)
52
47
 
53
- connect_mock.assert_called_once_with(url, loop=asyncio.get_event_loop())
48
+ connect_mock.assert_awaited_once_with(url, loop=asyncio.get_event_loop())
54
49
 
55
50
 
56
51
  @pytest.mark.asyncio
57
- # FIXME this test fails under tox, passes(?) otherwise
58
- @pytest.mark.xfail(strict=False)
59
52
  async def test_mite_amqp_connect_robust():
60
53
  context = MockContext()
61
54
  url = "amqp://foo.bar"
@@ -66,10 +59,10 @@ async def test_mite_amqp_connect_robust():
66
59
  async def dummy_journey(ctx):
67
60
  await ctx.amqp.connect_robust(url)
68
61
 
69
- with patch("aio_pika.connect_robust", new=connect_mock):
62
+ with patch("aio_pika.connect_robust", side_effect=connect_mock):
70
63
  await dummy_journey(context)
71
64
 
72
- connect_mock.assert_called_once_with(url, loop=asyncio.get_event_loop())
65
+ connect_mock.assert_awaited_once_with(url, loop=asyncio.get_event_loop())
73
66
 
74
67
 
75
68
  def test_amqp_message():
@@ -41,7 +41,7 @@ async def test_create_producer():
41
41
  mock_context = MockContext()
42
42
 
43
43
  # Patch AIOKafkaProducer to return the mock
44
- with patch("aiokafka.AIOKafkaProducer.start", new_callable=producer_start_mock):
44
+ with patch("aiokafka.AIOKafkaProducer.start", side_effect=producer_start_mock):
45
45
  # Create an instance of _KafkaWrapper
46
46
  kafka_wrapper = KafkaProducer(mock_context)
47
47
  # Call the create_producer method
@@ -61,7 +61,7 @@ async def test_create_consumer():
61
61
 
62
62
  # Patch AIOKafkaConsumer to return the mock
63
63
 
64
- with patch("aiokafka.AIOKafkaConsumer.start", new_callable=consumer_start_mock):
64
+ with patch("aiokafka.AIOKafkaConsumer.start", side_effect=consumer_start_mock):
65
65
  # Create an instance of _KafkaWrapper
66
66
  kafka_wrapper = KafkaConsumer(mock_context)
67
67
  # Call the create_consumer method
@@ -13,5 +13,5 @@ pytest-cov
13
13
  pytest-httpbin
14
14
  pytest-httpserver
15
15
  sanic
16
- werkzeug==3.0.3
16
+ werkzeug==3.0.6
17
17
  uvloop==0.19.0
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes