Exemplo n.º 1
0
    def test_weight_locusts(self):
        maxDiff = 2048

        class BaseLocust(Locust):
            pass

        class L1(BaseLocust):
            weight = 101

        class L2(BaseLocust):
            weight = 99

        class L3(BaseLocust):
            weight = 100

        runner = LocustRunner(Environment(options=mocked_options()),
                              locust_classes=[L1, L2, L3])
        self.assert_locust_class_distribution({
            L1: 10,
            L2: 9,
            L3: 10
        }, runner.weight_locusts(29))
        self.assert_locust_class_distribution({
            L1: 10,
            L2: 10,
            L3: 10
        }, runner.weight_locusts(30))
        self.assert_locust_class_distribution({
            L1: 11,
            L2: 10,
            L3: 10
        }, runner.weight_locusts(31))
Exemplo n.º 2
0
    def test_weight_locusts(self):
        maxDiff = 2048

        class BaseLocust(Locust):
            class task_set(TaskSet):
                pass

        class L1(BaseLocust):
            weight = 101

        class L2(BaseLocust):
            weight = 99

        class L3(BaseLocust):
            weight = 100

        runner = LocustRunner([L1, L2, L3], mocked_options())
        self.assert_locust_class_distribution({
            L1: 10,
            L2: 9,
            L3: 10
        }, runner.weight_locusts(29))
        self.assert_locust_class_distribution({
            L1: 10,
            L2: 10,
            L3: 10
        }, runner.weight_locusts(30))
        self.assert_locust_class_distribution({
            L1: 11,
            L2: 10,
            L3: 10
        }, runner.weight_locusts(31))
Exemplo n.º 3
0
    def setUp(self):
        super(TestWebUIAuth, self).setUp()

        parser = get_parser(default_config_files=[])
        options = parser.parse_args(["--web-auth", "john:doe"])
        self.runner = LocustRunner(self.environment)
        self.stats = self.runner.stats
        self.web_ui = self.environment.create_web_ui(
            "127.0.0.1", 0, auth_credentials=options.web_auth)
        self.web_ui.app.view_functions["request_stats"].clear_cache()
        gevent.sleep(0.01)
        self.web_port = self.web_ui.server.server_port
Exemplo n.º 4
0
    def test_weight_locusts_fewer_amount_than_locust_classes(self):
        class BaseLocust(Locust):
            class task_set(TaskSet): pass
        class L1(BaseLocust):
            weight = 101
        class L2(BaseLocust):
            weight = 99
        class L3(BaseLocust):
            weight = 100

        runner = LocustRunner([L1, L2, L3], mocked_options())
        self.assertEqual(1, len(runner.weight_locusts(1)))
        self.assert_locust_class_distribution({L1:1},  runner.weight_locusts(1))
Exemplo n.º 5
0
    def setUp(self):
        super(TestWebUI, self).setUp()

        parser = get_parser(default_config_files=[])
        self.environment.options = parser.parse_args([])
        self.runner = LocustRunner(self.environment, [])
        self.stats = self.runner.stats

        self.web_ui = WebUI(self.environment)
        self.web_ui.app.view_functions["request_stats"].clear_cache()

        gevent.spawn(lambda: self.web_ui.start("127.0.0.1", 0))
        gevent.sleep(0.01)
        self.web_port = self.web_ui.server.server_port
Exemplo n.º 6
0
    def setUp(self):
        # Prevent args passed to test runner from being passed to Locust
        del sys.argv[1:]

        locust.events = Events()
        self.environment = Environment(events=locust.events,
                                       catch_exceptions=False)
        self.runner = LocustRunner(self.environment, [])

        # When running the tests in Python 3 we get warnings about unclosed sockets.
        # This causes tests that depends on calls to sys.stderr to fail, so we'll
        # suppress those warnings. For more info see:
        # https://github.com/requests/requests/issues/1882
        try:
            warnings.filterwarnings(action="ignore",
                                    message="unclosed <socket object",
                                    category=ResourceWarning)
        except NameError:
            # ResourceWarning doesn't exist in Python 2, but since the warning only appears
            # on Python 3 we don't need to mock it. Instead we can happily ignore the exception
            pass

        # set up mocked logging handler
        self._logger_class = MockedLoggingHandler()
        self._logger_class.setLevel(logging.INFO)
        self._root_log_handlers = [h for h in logging.root.handlers]
        [logging.root.removeHandler(h) for h in logging.root.handlers]
        logging.root.addHandler(self._logger_class)
        logging.root.setLevel(logging.INFO)
        self.mocked_log = MockedLoggingHandler
Exemplo n.º 7
0
 def test_host_value_from_locust_class(self):
     class MyLocust(Locust):
         host = "http://example.com"
     runners.locust_runner = LocustRunner([MyLocust], options=self.options)
     response = requests.get("http://127.0.0.1:%i/" % self.web_port)
     self.assertEqual(200, response.status_code)
     self.assertIn("http://example.com", response.content.decode("utf-8"))
     self.assertNotIn("setting this will override the host on all Locust classes", response.content.decode("utf-8"))
Exemplo n.º 8
0
 def setUp(self):
     super(TestWebUI, self).setUp()
     
     stats.global_stats.clear_all()
     runners.locust_runner = LocustRunner([], None, None, None, None)
     
     self._web_ui_server = wsgi.WSGIServer(('127.0.0.1', 0), web.app, log=None)
     gevent.spawn(lambda: self._web_ui_server.serve_forever())
     gevent.sleep(0.01)
     self.web_port = self._web_ui_server.server_port
Exemplo n.º 9
0
class TestWebUIAuth(LocustTestCase):
    def setUp(self):
        super(TestWebUIAuth, self).setUp()

        parser = get_parser(default_config_files=[])
        self.environment.options = parser.parse_args(
            ["--web-auth", "john:doe"])
        self.runner = LocustRunner(self.environment, [])
        self.stats = self.runner.stats
        self.web_ui = WebUI(self.environment,
                            self.environment.options.web_auth)
        self.web_ui.app.view_functions["request_stats"].clear_cache()
        gevent.spawn(lambda: self.web_ui.start("127.0.0.1", 0))
        gevent.sleep(0.01)
        self.web_port = self.web_ui.server.server_port

    def tearDown(self):
        super(TestWebUIAuth, self).tearDown()
        self.web_ui.stop()
        self.runner.quit()

    def test_index_with_basic_auth_enabled_correct_credentials(self):
        self.assertEqual(
            200,
            requests.get("http://127.0.0.1:%i/?ele=phino" % self.web_port,
                         auth=('john', 'doe')).status_code)

    def test_index_with_basic_auth_enabled_incorrect_credentials(self):
        self.assertEqual(
            401,
            requests.get("http://127.0.0.1:%i/?ele=phino" % self.web_port,
                         auth=('john', 'invalid')).status_code)

    def test_index_with_basic_auth_enabled_blank_credentials(self):
        self.assertEqual(
            401,
            requests.get("http://127.0.0.1:%i/?ele=phino" %
                         self.web_port).status_code)
Exemplo n.º 10
0
 def setUp(self):
     super(TestWebUI, self).setUp()
     
     stats.global_stats.clear_all()
     parser = parse_options(default_config_files=[])[0]
     self.options = parser.parse_args([])
     runners.locust_runner = LocustRunner([], self.options)
     
     web.request_stats.clear_cache()
     
     self._web_ui_server = pywsgi.WSGIServer(('127.0.0.1', 0), web.app, log=None)
     gevent.spawn(lambda: self._web_ui_server.serve_forever())
     gevent.sleep(0.01)
     self.web_port = self._web_ui_server.server_port
Exemplo n.º 11
0
 def test_kill_locusts(self):
     triggered = [False]
     class BaseLocust(Locust):
         wait_time = constant(1)
         class task_set(TaskSet):
             @task
             def trigger(self):
                 triggered[0] = True
     runner = LocustRunner([BaseLocust], mocked_options())
     runner.spawn_locusts(2, wait=False)
     self.assertEqual(2, len(runner.locusts))
     g1 = list(runner.locusts)[0]
     g2 = list(runner.locusts)[1]
     runner.kill_locusts(2)
     self.assertEqual(0, len(runner.locusts))
     self.assertTrue(g1.dead)
     self.assertTrue(g2.dead)
     self.assertTrue(triggered[0])
Exemplo n.º 12
0
class TestWebUI(LocustTestCase):
    def setUp(self):
        super(TestWebUI, self).setUp()

        parser = get_parser(default_config_files=[])
        self.environment.options = parser.parse_args([])
        self.runner = LocustRunner(self.environment, [])
        self.stats = self.runner.stats

        self.web_ui = WebUI(self.environment)
        self.web_ui.app.view_functions["request_stats"].clear_cache()

        gevent.spawn(lambda: self.web_ui.start("127.0.0.1", 0))
        gevent.sleep(0.01)
        self.web_port = self.web_ui.server.server_port

    def tearDown(self):
        super(TestWebUI, self).tearDown()
        self.web_ui.stop()
        self.runner.quit()

    def test_web_ui_reference_on_environment(self):
        self.assertEqual(self.web_ui, self.environment.web_ui)

    def test_web_ui_no_runner(self):
        env = Environment()
        web_ui = WebUI(env)
        try:
            gevent.spawn(lambda: web_ui.start("127.0.0.1", 0))
            gevent.sleep(0.01)
            response = requests.get("http://127.0.0.1:%i/" %
                                    web_ui.server.server_port)
            self.assertEqual(500, response.status_code)
            self.assertEqual(
                "Error: Locust Environment does not have any runner",
                response.text)
        finally:
            web_ui.stop()

    def test_index(self):
        self.assertEqual(
            200,
            requests.get("http://127.0.0.1:%i/" % self.web_port).status_code)

    def test_stats_no_data(self):
        self.assertEqual(
            200,
            requests.get("http://127.0.0.1:%i/stats/requests" %
                         self.web_port).status_code)

    def test_stats(self):
        self.stats.log_request("GET", "/<html>", 120, 5612)
        response = requests.get("http://127.0.0.1:%i/stats/requests" %
                                self.web_port)
        self.assertEqual(200, response.status_code)

        data = json.loads(response.text)
        self.assertEqual(2, len(data["stats"]))  # one entry plus Aggregated
        self.assertEqual("/<html>", data["stats"][0]["name"])
        self.assertEqual("/&lt;html&gt;", data["stats"][0]["safe_name"])
        self.assertEqual("GET", data["stats"][0]["method"])
        self.assertEqual(120, data["stats"][0]["avg_response_time"])

        self.assertEqual("Aggregated", data["stats"][1]["name"])
        self.assertEqual(1, data["stats"][1]["num_requests"])
        self.assertEqual(120, data["stats"][1]["avg_response_time"])

    def test_stats_cache(self):
        self.stats.log_request("GET", "/test", 120, 5612)
        response = requests.get("http://127.0.0.1:%i/stats/requests" %
                                self.web_port)
        self.assertEqual(200, response.status_code)
        data = json.loads(response.text)
        self.assertEqual(2, len(data["stats"]))  # one entry plus Aggregated

        # add another entry
        self.stats.log_request("GET", "/test2", 120, 5612)
        data = json.loads(
            requests.get("http://127.0.0.1:%i/stats/requests" %
                         self.web_port).text)
        self.assertEqual(2,
                         len(data["stats"]))  # old value should be cached now

        self.web_ui.app.view_functions["request_stats"].clear_cache()

        data = json.loads(
            requests.get("http://127.0.0.1:%i/stats/requests" %
                         self.web_port).text)
        self.assertEqual(3,
                         len(data["stats"]))  # this should no longer be cached

    def test_stats_rounding(self):
        self.stats.log_request("GET", "/test", 1.39764125, 2)
        self.stats.log_request("GET", "/test", 999.9764125, 1000)
        response = requests.get("http://127.0.0.1:%i/stats/requests" %
                                self.web_port)
        self.assertEqual(200, response.status_code)

        data = json.loads(response.text)
        self.assertEqual(1, data["stats"][0]["min_response_time"])
        self.assertEqual(1000, data["stats"][0]["max_response_time"])

    def test_request_stats_csv(self):
        self.stats.log_request("GET", "/test2", 120, 5612)
        response = requests.get("http://127.0.0.1:%i/stats/requests/csv" %
                                self.web_port)
        self.assertEqual(200, response.status_code)

    def test_failure_stats_csv(self):
        self.stats.log_error("GET", "/", Exception("Error1337"))
        response = requests.get("http://127.0.0.1:%i/stats/failures/csv" %
                                self.web_port)
        self.assertEqual(200, response.status_code)

    def test_request_stats_with_errors(self):
        self.stats.log_error("GET", "/", Exception("Error1337"))
        response = requests.get("http://127.0.0.1:%i/stats/requests" %
                                self.web_port)
        self.assertEqual(200, response.status_code)
        self.assertIn("Error1337", response.text)

    def test_reset_stats(self):
        try:
            raise Exception(u"A cool test exception")
        except Exception as e:
            tb = sys.exc_info()[2]
            self.runner.log_exception("local", str(e),
                                      "".join(traceback.format_tb(tb)))
            self.runner.log_exception("local", str(e),
                                      "".join(traceback.format_tb(tb)))

        self.stats.log_request("GET", "/test", 120, 5612)
        self.stats.log_error("GET", "/", Exception("Error1337"))

        response = requests.get("http://127.0.0.1:%i/stats/reset" %
                                self.web_port)

        self.assertEqual(200, response.status_code)

        self.assertEqual({}, self.stats.errors)
        self.assertEqual({}, self.runner.exceptions)

        self.assertEqual(0, self.stats.get("/", "GET").num_requests)
        self.assertEqual(0, self.stats.get("/", "GET").num_failures)
        self.assertEqual(0, self.stats.get("/test", "GET").num_requests)
        self.assertEqual(0, self.stats.get("/test", "GET").num_failures)

    def test_exceptions(self):
        try:
            raise Exception(u"A cool test exception")
        except Exception as e:
            tb = sys.exc_info()[2]
            self.runner.log_exception("local", str(e),
                                      "".join(traceback.format_tb(tb)))
            self.runner.log_exception("local", str(e),
                                      "".join(traceback.format_tb(tb)))

        response = requests.get("http://127.0.0.1:%i/exceptions" %
                                self.web_port)
        self.assertEqual(200, response.status_code)
        self.assertIn("A cool test exception", response.text)

        response = requests.get("http://127.0.0.1:%i/stats/requests" %
                                self.web_port)
        self.assertEqual(200, response.status_code)

    def test_exceptions_csv(self):
        try:
            raise Exception("Test exception")
        except Exception as e:
            tb = sys.exc_info()[2]
            self.runner.log_exception("local", str(e),
                                      "".join(traceback.format_tb(tb)))
            self.runner.log_exception("local", str(e),
                                      "".join(traceback.format_tb(tb)))

        response = requests.get("http://127.0.0.1:%i/exceptions/csv" %
                                self.web_port)
        self.assertEqual(200, response.status_code)

        reader = csv.reader(StringIO(response.text))
        rows = []
        for row in reader:
            rows.append(row)

        self.assertEqual(2, len(rows))
        self.assertEqual("Test exception", rows[1][1])
        self.assertEqual(2, int(rows[1][0]), "Exception count should be 2")

    def test_swarm_host_value_specified(self):
        class MyLocust(Locust):
            wait_time = constant(1)

            @task(1)
            def my_task(self):
                pass

        self.environment.locust_classes = [MyLocust]
        response = requests.post(
            "http://127.0.0.1:%i/swarm" % self.web_port,
            data={
                "locust_count": 5,
                "hatch_rate": 5,
                "host": "https://localhost"
            },
        )
        self.assertEqual(200, response.status_code)
        self.assertEqual("https://localhost", response.json()["host"])
        self.assertEqual(self.environment.host, "https://localhost")

    def test_swarm_host_value_not_specified(self):
        class MyLocust(Locust):
            wait_time = constant(1)

            @task(1)
            def my_task(self):
                pass

        self.runner.locust_classes = [MyLocust]
        response = requests.post(
            "http://127.0.0.1:%i/swarm" % self.web_port,
            data={
                'locust_count': 5,
                'hatch_rate': 5
            },
        )
        self.assertEqual(200, response.status_code)
        self.assertEqual(None, response.json()["host"])
        self.assertEqual(self.environment.host, None)

    def test_host_value_from_locust_class(self):
        class MyLocust(Locust):
            host = "http://example.com"

        self.environment.runner.locust_classes = [MyLocust]
        response = requests.get("http://127.0.0.1:%i/" % self.web_port)
        self.assertEqual(200, response.status_code)
        self.assertIn("http://example.com", response.content.decode("utf-8"))
        self.assertNotIn(
            "setting this will override the host on all Locust classes",
            response.content.decode("utf-8"))

    def test_host_value_from_multiple_locust_classes(self):
        class MyLocust(Locust):
            host = "http://example.com"

        class MyLocust2(Locust):
            host = "http://example.com"

        self.environment.runner.locust_classes = [MyLocust, MyLocust2]
        response = requests.get("http://127.0.0.1:%i/" % self.web_port)
        self.assertEqual(200, response.status_code)
        self.assertIn("http://example.com", response.content.decode("utf-8"))
        self.assertNotIn(
            "setting this will override the host on all Locust classes",
            response.content.decode("utf-8"))

    def test_host_value_from_multiple_locust_classes_different_hosts(self):
        class MyLocust(Locust):
            host = None

        class MyLocust2(Locust):
            host = "http://example.com"

        self.environment.runner.locust_classes = [MyLocust, MyLocust2]
        response = requests.get("http://127.0.0.1:%i/" % self.web_port)
        self.assertEqual(200, response.status_code)
        self.assertNotIn("http://example.com",
                         response.content.decode("utf-8"))
        self.assertIn(
            "setting this will override the host on all Locust classes",
            response.content.decode("utf-8"))

    def test_swarm_in_step_load_mode(self):
        class MyLocust(Locust):
            wait_time = constant(1)

            @task(1)
            def my_task(self):
                pass

        self.environment.locust_classes = [MyLocust]
        self.environment.step_load = True
        response = requests.post("http://127.0.0.1:%i/swarm" % self.web_port,
                                 data={
                                     "locust_count": 5,
                                     "hatch_rate": 2,
                                     "step_locust_count": 2,
                                     "step_duration": "2m"
                                 })
        self.assertEqual(200, response.status_code)
        self.assertIn("Step Load Mode", response.text)