def _write_csv_files(environment, stats_base_name, full_history=False): """Spawn CVS writer and exit loop after first iteration.""" stats_writer = StatsCSVFileWriter(environment, PERCENTILES_TO_REPORT, stats_base_name, full_history=full_history) greenlet = gevent.spawn(stats_writer) gevent.sleep(_TEST_CSV_STATS_INTERVAL_WAIT_SEC) gevent.kill(greenlet) stats_writer.close_files()
def test_csv_stats_on_master_from_aggregated_stats(self): # Failing test for: https://github.com/locustio/locust/issues/1315 with mock.patch("locust.rpc.rpc.Server", mocked_rpc()) as server: environment = Environment() stats_writer = StatsCSVFileWriter( environment, PERCENTILES_TO_REPORT, self.STATS_BASE_NAME, full_history=True ) master = environment.create_master_runner(master_bind_host="*", master_bind_port=0) greenlet = gevent.spawn(stats_writer) gevent.sleep(_TEST_CSV_STATS_INTERVAL_WAIT_SEC) server.mocked_send(Message("client_ready", __version__, "fake_client")) master.stats.get("/", "GET").log(100, 23455) master.stats.get("/", "GET").log(800, 23455) master.stats.get("/", "GET").log(700, 23455) data = {"user_count": 1} environment.events.report_to_master.fire(client_id="fake_client", data=data) master.stats.clear_all() server.mocked_send(Message("stats", data, "fake_client")) s = master.stats.get("/", "GET") self.assertEqual(700, s.median_response_time) gevent.kill(greenlet) stats_writer.close_files() self.assertTrue(os.path.exists(self.STATS_FILENAME)) self.assertTrue(os.path.exists(self.STATS_HISTORY_FILENAME)) self.assertTrue(os.path.exists(self.STATS_FAILURES_FILENAME)) self.assertTrue(os.path.exists(self.STATS_EXCEPTIONS_FILENAME))
def test_csv_stats_writer_full_history(self): stats_writer = StatsCSVFileWriter(self.environment, PERCENTILES_TO_REPORT, self.STATS_BASE_NAME, full_history=True) self.runner.stats.log_request("GET", "/", 10, content_length=666) greenlet = gevent.spawn(stats_writer) gevent.sleep(_TEST_CSV_STATS_INTERVAL_WAIT_SEC) gevent.kill(greenlet) stats_writer.close_files() self.assertTrue(os.path.exists(self.STATS_FILENAME)) self.assertTrue(os.path.exists(self.STATS_HISTORY_FILENAME)) self.assertTrue(os.path.exists(self.STATS_FAILURES_FILENAME)) self.assertTrue(os.path.exists(self.STATS_EXCEPTIONS_FILENAME)) with open(self.STATS_HISTORY_FILENAME) as f: reader = csv.DictReader(f) rows = [r for r in reader] self.assertEqual(4, len(rows)) self.assertEqual("/", rows[0]["Name"]) self.assertEqual("Aggregated", rows[1]["Name"]) self.assertEqual("/", rows[2]["Name"]) self.assertEqual("Aggregated", rows[3]["Name"])
def test_user_count_in_csv_history_stats(self): start_time = int(time.time()) class TestUser(User): wait_time = constant(10) @task def t(self): self.environment.runner.stats.log_request("GET", "/", 10, 10) environment = Environment(user_classes=[TestUser]) stats_writer = StatsCSVFileWriter(environment, PERCENTILES_TO_REPORT, self.STATS_BASE_NAME, full_history=True) runner = environment.create_local_runner() # spawn a user every _TEST_CSV_STATS_INTERVAL_SEC second user_count = 15 spawn_rate = 5 assert 1 / 5 == _TEST_CSV_STATS_INTERVAL_SEC runner_greenlet = gevent.spawn(runner.start, user_count, spawn_rate) gevent.sleep(0.1) greenlet = gevent.spawn(stats_writer) gevent.sleep(user_count / spawn_rate) gevent.kill(greenlet) stats_writer.close_files() runner.stop() gevent.kill(runner_greenlet) with open(self.STATS_HISTORY_FILENAME) as f: reader = csv.DictReader(f) rows = [r for r in reader] self.assertEqual(2 * user_count, len(rows)) for i in range(int(user_count / spawn_rate)): for _ in range(spawn_rate): row = rows.pop(0) self.assertEqual("%i" % ((i + 1) * spawn_rate), row["User Count"]) self.assertEqual("/", row["Name"]) self.assertEqual("%i" % ((i + 1) * spawn_rate), row["Total Request Count"]) self.assertGreaterEqual(int(row["Timestamp"]), start_time) row = rows.pop(0) self.assertEqual("%i" % ((i + 1) * spawn_rate), row["User Count"]) self.assertEqual("Aggregated", row["Name"]) self.assertEqual("%i" % ((i + 1) * spawn_rate), row["Total Request Count"]) self.assertGreaterEqual(int(row["Timestamp"]), start_time)
def test_csv_stats_writer_full_history(self): stats_writer = StatsCSVFileWriter(self.environment, PERCENTILES_TO_REPORT, self.STATS_BASE_NAME, full_history=True) for i in range(10): self.runner.stats.log_request("GET", "/", 100, content_length=666) greenlet = gevent.spawn(stats_writer) gevent.sleep(10) for i in range(10): self.runner.stats.log_request("GET", "/", 10, content_length=666) gevent.sleep(5) gevent.sleep(_TEST_CSV_STATS_INTERVAL_WAIT_SEC) gevent.kill(greenlet) stats_writer.close_files() self.assertTrue(os.path.exists(self.STATS_FILENAME)) self.assertTrue(os.path.exists(self.STATS_HISTORY_FILENAME)) self.assertTrue(os.path.exists(self.STATS_FAILURES_FILENAME)) self.assertTrue(os.path.exists(self.STATS_EXCEPTIONS_FILENAME)) with open(self.STATS_HISTORY_FILENAME) as f: reader = csv.DictReader(f) rows = [r for r in reader] self.assertGreaterEqual(len(rows), 130) self.assertEqual("/", rows[0]["Name"]) self.assertEqual("Aggregated", rows[1]["Name"]) self.assertEqual("/", rows[2]["Name"]) self.assertEqual("Aggregated", rows[3]["Name"]) self.assertEqual("20", rows[-1]["Total Request Count"]) saw100 = False saw10 = False for row in rows: if not saw100 and row["95%"] == "100": saw100 = True elif saw100 and row["95%"] == "10": saw10 = True break self.assertTrue(saw100, "Never saw 95th percentile increase to 100") self.assertTrue(saw10, "Never saw 95th percentile decrease to 10")