def _add_shaper(self, jmx): """ Add shaper :param jmx: JMX :return: """ if not self.load.duration: self.log.warning("You must set 'ramp-up' and/or 'hold-for' when using 'throughput' option") return etree_shaper = jmx.get_rps_shaper() if self.load.ramp_up: if isinstance(self.load.throughput, numeric_types) and self.load.duration: start_rps = self.load.throughput / float(self.load.duration) start_rps = max(start_rps, 0.001) # avoid zeroing start_rps = min(start_rps, 1.0) # avoid starting too fast else: start_rps = 1 if not self.load.steps: jmx.add_rps_shaper_schedule(etree_shaper, start_rps, self.load.throughput, self.load.ramp_up) else: step_h = self.load.throughput / self.load.steps step_w = float(self.load.ramp_up) / self.load.steps accum_time = 0 for step in range(1, self.load.steps + 1): jmx.add_rps_shaper_schedule(etree_shaper, step_h * step, step_h * step, step_w * step - accum_time) accum_time += cond_int(step_w * step - accum_time) if self.load.hold: jmx.add_rps_shaper_schedule(etree_shaper, self.load.throughput, self.load.throughput, self.load.hold) jmx.append(JMeterScenarioBuilder.TEST_PLAN_SEL, etree_shaper) jmx.append(JMeterScenarioBuilder.TEST_PLAN_SEL, etree.Element("hashTree"))