*Navigation trail:* \["JMeterProjectPages"\] - \["JMeterDevelopment"\] - \["JMeterDevelopment"\]/DeveloperDocumentation Wiki Markup
This page describes what happens when you start a test:
- First, the GUI-tree is converted into a non-GUI-tree of equivalent Test Elements.unmigrated-wiki-markup
- Next a \["JMeterEngine"\] is created, and the tree is delivered.
- The Engine then uses org.apache.jmeter.engine.PreCompiler (A HashTreeTraverser) to do some processing on the tree prior to the tree being cloned for each thread that will be run. In other words, the PreCompiler's changes will affect every thread. The PreCompiler, at this time, only replaces user-defined variables with their actual values (from the TestPlan GUI).
- Then, all the ThreadGroup branches are extracted from the tree.
- All TestListeners are found in the tree (TestListener is a specific interface. Each TestListener will be notified when the test starts).
Then, for each [ThreadGroup], the appropriate number of \["JMeterThread"\] objects are created and handed the [TestTree]. However, the tree is cloned (a shallow cloning), and every element in the tree that implements [PerThreadClonable] is cloned.unmigrated-wiki-markup Wiki Markup
- \["JMeterThread"\] takes over at that point.