void runTestOn(final PerfTest perfTest, GrinderProperties grinderProperties, final SingleConsole singleConsole) {
		// start target monitor
		for (OnTestLifeCycleRunnable run : pluginManager.getEnabledModulesByClass(OnTestLifeCycleRunnable.class, getDefaultTestLifeCyclePlugins())) {
			run.start(perfTest, perfTestService, config.getVersion());
		}

		// Run test
		perfTestService.markStatusAndProgress(perfTest, START_TESTING, "The test is ready to start.");
		// Add listener to detect abnormal condition and mark the perfTest

		singleConsole.addListener(stopReason -> {
			PerfTest fetchedPerftest = perfTestService.getOne(perfTest.getId());
			if (fetchedPerftest.getStatus().isStoppable()) {
				if (isValidStopReason(stopReason)) {
					return;
				}
				perfTestService.markAbnormalTermination(perfTest, stopReason);
				LOG.error(format(perfTest, "Abnormal test due to {}", stopReason.name()));
			}
		});

		long startTime = singleConsole.startTest(grinderProperties);
		perfTest.setStartTime(ofEpochMilli(startTime));
		addSamplingListeners(perfTest, singleConsole);
		perfTestService.markStatusAndProgress(perfTest, TESTING, "The test is started.");
		singleConsole.startSampling();
		LOG.info(format(perfTest, "Sampling is started"));
	}
Run a given {@link PerfTest} with the given {@link GrinderProperties} and
the {@link SingleConsole} .

@param perfTest          perftest
@param grinderProperties grinder properties
@param singleConsole     console to be used.
ngrinder-controller/src/main/java/org/ngrinder/perftest/service/PerfTestRunnable.java