-
Notifications
You must be signed in to change notification settings - Fork 14
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add initial documents and first tests
- Loading branch information
Showing
5 changed files
with
280 additions
and
3 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
jmeter.log |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,4 +1,26 @@ | ||
drupal-jmeter-tricks | ||
==================== | ||
# Drupal JMeter Tricks # | ||
|
||
## Requirements ## | ||
|
||
- JMeter 2.7+ [[Download](https://jmeter.apache.org/download_jmeter.cgi)] | ||
- JMeter Plugins [[Download](https://code.google.com/p/jmeter-plugins/)] | ||
- A Drupal 7 site | ||
|
||
## Contents ## | ||
|
||
- *tests.jmx* => Sample JMeter test script with multiple thread groups to illustrate different techniques | ||
- *users.csv* => Sample user dictionary file | ||
- *urls.csv* => Sample list of URLs to test against | ||
|
||
## Explanations ## | ||
|
||
There are a few configuration settings that require specific note here - | ||
|
||
1. XPath query used to detect a Drupal error message - | ||
|
||
`//div[contains(concat(' ',normalize-space(@class),' '),' messages ') and contains(concat(' ',normalize-space(@class),' '),' error ')]` | ||
|
||
1. Choosing a random item from a JMeter list returned by the XPath Post Processor - | ||
|
||
`${__V(node_links_${__Random(1,${node_links_matchNr})})}` | ||
|
||
Tricks for using JMeter with Drupal |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,252 @@ | ||
<?xml version="1.0" encoding="UTF-8"?> | ||
<jmeterTestPlan version="1.2" properties="2.3"> | ||
<hashTree> | ||
<TestPlan guiclass="TestPlanGui" testclass="TestPlan" testname="Drupal JMeter Tricks" enabled="true"> | ||
<stringProp name="TestPlan.comments">https://github.com/erikwebb/drupal-jmeter-tricks</stringProp> | ||
<boolProp name="TestPlan.functional_mode">false</boolProp> | ||
<boolProp name="TestPlan.serialize_threadgroups">false</boolProp> | ||
<elementProp name="TestPlan.user_defined_variables" elementType="Arguments" guiclass="ArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true"> | ||
<collectionProp name="Arguments.arguments"/> | ||
</elementProp> | ||
<stringProp name="TestPlan.user_define_classpath"></stringProp> | ||
</TestPlan> | ||
<hashTree> | ||
<ConfigTestElement guiclass="HttpDefaultsGui" testclass="ConfigTestElement" testname="HTTP Request Defaults" enabled="true"> | ||
<elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true"> | ||
<collectionProp name="Arguments.arguments"/> | ||
</elementProp> | ||
<stringProp name="HTTPSampler.domain">localhost</stringProp> | ||
<stringProp name="HTTPSampler.port">8082</stringProp> | ||
<stringProp name="HTTPSampler.connect_timeout"></stringProp> | ||
<stringProp name="HTTPSampler.response_timeout"></stringProp> | ||
<stringProp name="HTTPSampler.protocol"></stringProp> | ||
<stringProp name="HTTPSampler.contentEncoding"></stringProp> | ||
<stringProp name="HTTPSampler.path"></stringProp> | ||
<stringProp name="HTTPSampler.concurrentPool">4</stringProp> | ||
</ConfigTestElement> | ||
<hashTree/> | ||
<CookieManager guiclass="CookiePanel" testclass="CookieManager" testname="HTTP Cookie Manager" enabled="true"> | ||
<collectionProp name="CookieManager.cookies"/> | ||
<boolProp name="CookieManager.clearEachIteration">false</boolProp> | ||
</CookieManager> | ||
<hashTree/> | ||
<XPathAssertion guiclass="XPathAssertionGui" testclass="XPathAssertion" testname="Drupal - No Error Messages" enabled="true"> | ||
<stringProp name="TestPlan.comments">Checks for printed messages matching the default error class.</stringProp> | ||
<boolProp name="XPath.negate">true</boolProp> | ||
<stringProp name="XPath.xpath">//div[contains(concat(' ',normalize-space(@class),' '),' messages ') and contains(concat(' ',normalize-space(@class),' '),' error ')]</stringProp> | ||
<boolProp name="XPath.validate">false</boolProp> | ||
<boolProp name="XPath.whitespace">false</boolProp> | ||
<boolProp name="XPath.tolerant">false</boolProp> | ||
<boolProp name="XPath.namespace">false</boolProp> | ||
</XPathAssertion> | ||
<hashTree/> | ||
<ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="Drupal Login" enabled="true"> | ||
<stringProp name="ThreadGroup.on_sample_error">continue</stringProp> | ||
<elementProp name="ThreadGroup.main_controller" elementType="LoopController" guiclass="LoopControlPanel" testclass="LoopController" testname="Loop Controller" enabled="true"> | ||
<boolProp name="LoopController.continue_forever">false</boolProp> | ||
<stringProp name="LoopController.loops">1</stringProp> | ||
</elementProp> | ||
<stringProp name="ThreadGroup.num_threads">1</stringProp> | ||
<stringProp name="ThreadGroup.ramp_time">1</stringProp> | ||
<longProp name="ThreadGroup.start_time">1345260332000</longProp> | ||
<longProp name="ThreadGroup.end_time">1345260332000</longProp> | ||
<boolProp name="ThreadGroup.scheduler">false</boolProp> | ||
<stringProp name="ThreadGroup.duration"></stringProp> | ||
<stringProp name="ThreadGroup.delay"></stringProp> | ||
</ThreadGroup> | ||
<hashTree> | ||
<CSVDataSet guiclass="TestBeanGUI" testclass="CSVDataSet" testname="CSV Data Set Config" enabled="true"> | ||
<stringProp name="delimiter">,</stringProp> | ||
<stringProp name="fileEncoding"></stringProp> | ||
<stringProp name="filename">users.csv</stringProp> | ||
<boolProp name="quotedData">false</boolProp> | ||
<boolProp name="recycle">true</boolProp> | ||
<stringProp name="shareMode">All threads</stringProp> | ||
<boolProp name="stopThread">false</boolProp> | ||
<stringProp name="variableNames">name,pass</stringProp> | ||
</CSVDataSet> | ||
<hashTree/> | ||
<HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Login Request" enabled="true"> | ||
<elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true"> | ||
<collectionProp name="Arguments.arguments"> | ||
<elementProp name="form_id" elementType="HTTPArgument"> | ||
<boolProp name="HTTPArgument.always_encode">false</boolProp> | ||
<stringProp name="Argument.value">user_login</stringProp> | ||
<stringProp name="Argument.metadata">=</stringProp> | ||
<boolProp name="HTTPArgument.use_equals">true</boolProp> | ||
<stringProp name="Argument.name">form_id</stringProp> | ||
</elementProp> | ||
<elementProp name="name" elementType="HTTPArgument"> | ||
<boolProp name="HTTPArgument.always_encode">false</boolProp> | ||
<stringProp name="Argument.value">${name}</stringProp> | ||
<stringProp name="Argument.metadata">=</stringProp> | ||
<boolProp name="HTTPArgument.use_equals">true</boolProp> | ||
<stringProp name="Argument.name">name</stringProp> | ||
</elementProp> | ||
<elementProp name="pass" elementType="HTTPArgument"> | ||
<boolProp name="HTTPArgument.always_encode">false</boolProp> | ||
<stringProp name="Argument.value">${pass}</stringProp> | ||
<stringProp name="Argument.metadata">=</stringProp> | ||
<boolProp name="HTTPArgument.use_equals">true</boolProp> | ||
<stringProp name="Argument.name">pass</stringProp> | ||
</elementProp> | ||
<elementProp name="op" elementType="HTTPArgument"> | ||
<boolProp name="HTTPArgument.always_encode">false</boolProp> | ||
<stringProp name="Argument.value">Log in</stringProp> | ||
<stringProp name="Argument.metadata">=</stringProp> | ||
<boolProp name="HTTPArgument.use_equals">true</boolProp> | ||
<stringProp name="Argument.name">op</stringProp> | ||
</elementProp> | ||
</collectionProp> | ||
</elementProp> | ||
<stringProp name="HTTPSampler.domain"></stringProp> | ||
<stringProp name="HTTPSampler.port"></stringProp> | ||
<stringProp name="HTTPSampler.connect_timeout"></stringProp> | ||
<stringProp name="HTTPSampler.response_timeout"></stringProp> | ||
<stringProp name="HTTPSampler.protocol"></stringProp> | ||
<stringProp name="HTTPSampler.contentEncoding"></stringProp> | ||
<stringProp name="HTTPSampler.path">/user</stringProp> | ||
<stringProp name="HTTPSampler.method">POST</stringProp> | ||
<boolProp name="HTTPSampler.follow_redirects">true</boolProp> | ||
<boolProp name="HTTPSampler.auto_redirects">false</boolProp> | ||
<boolProp name="HTTPSampler.use_keepalive">true</boolProp> | ||
<boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> | ||
<boolProp name="HTTPSampler.monitor">false</boolProp> | ||
<stringProp name="HTTPSampler.embedded_url_re"></stringProp> | ||
</HTTPSamplerProxy> | ||
<hashTree/> | ||
</hashTree> | ||
<ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="Select From A List" enabled="true"> | ||
<stringProp name="ThreadGroup.on_sample_error">continue</stringProp> | ||
<elementProp name="ThreadGroup.main_controller" elementType="LoopController" guiclass="LoopControlPanel" testclass="LoopController" testname="Loop Controller" enabled="true"> | ||
<boolProp name="LoopController.continue_forever">false</boolProp> | ||
<stringProp name="LoopController.loops">5</stringProp> | ||
</elementProp> | ||
<stringProp name="ThreadGroup.num_threads">1</stringProp> | ||
<stringProp name="ThreadGroup.ramp_time">1</stringProp> | ||
<longProp name="ThreadGroup.start_time">1345260969000</longProp> | ||
<longProp name="ThreadGroup.end_time">1345260969000</longProp> | ||
<boolProp name="ThreadGroup.scheduler">false</boolProp> | ||
<stringProp name="ThreadGroup.duration"></stringProp> | ||
<stringProp name="ThreadGroup.delay"></stringProp> | ||
</ThreadGroup> | ||
<hashTree> | ||
<HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Default Drupal Homepage" enabled="true"> | ||
<elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true"> | ||
<collectionProp name="Arguments.arguments"/> | ||
</elementProp> | ||
<stringProp name="HTTPSampler.domain"></stringProp> | ||
<stringProp name="HTTPSampler.port"></stringProp> | ||
<stringProp name="HTTPSampler.connect_timeout"></stringProp> | ||
<stringProp name="HTTPSampler.response_timeout"></stringProp> | ||
<stringProp name="HTTPSampler.protocol"></stringProp> | ||
<stringProp name="HTTPSampler.contentEncoding"></stringProp> | ||
<stringProp name="HTTPSampler.path">/node</stringProp> | ||
<stringProp name="HTTPSampler.method">GET</stringProp> | ||
<boolProp name="HTTPSampler.follow_redirects">true</boolProp> | ||
<boolProp name="HTTPSampler.auto_redirects">false</boolProp> | ||
<boolProp name="HTTPSampler.use_keepalive">true</boolProp> | ||
<boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> | ||
<boolProp name="HTTPSampler.monitor">false</boolProp> | ||
<stringProp name="HTTPSampler.embedded_url_re"></stringProp> | ||
</HTTPSamplerProxy> | ||
<hashTree/> | ||
<XPathExtractor guiclass="XPathExtractorGui" testclass="XPathExtractor" testname="Select Node URL" enabled="true"> | ||
<stringProp name="TestPlan.comments">Choose a node URL based on the title links of each node</stringProp> | ||
<stringProp name="XPathExtractor.default"></stringProp> | ||
<stringProp name="XPathExtractor.refname">node_links</stringProp> | ||
<stringProp name="XPathExtractor.xpathQuery">//div[@id="content"]//h2/a/@href</stringProp> | ||
<boolProp name="XPathExtractor.validate">false</boolProp> | ||
<boolProp name="XPathExtractor.tolerant">false</boolProp> | ||
<boolProp name="XPathExtractor.namespace">false</boolProp> | ||
</XPathExtractor> | ||
<hashTree/> | ||
<HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="View Random Node Page" enabled="true"> | ||
<elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true"> | ||
<collectionProp name="Arguments.arguments"/> | ||
</elementProp> | ||
<stringProp name="HTTPSampler.domain"></stringProp> | ||
<stringProp name="HTTPSampler.port"></stringProp> | ||
<stringProp name="HTTPSampler.connect_timeout"></stringProp> | ||
<stringProp name="HTTPSampler.response_timeout"></stringProp> | ||
<stringProp name="HTTPSampler.protocol"></stringProp> | ||
<stringProp name="HTTPSampler.contentEncoding"></stringProp> | ||
<stringProp name="HTTPSampler.path">${__V(node_links_${__Random(1,${node_links_matchNr})})}</stringProp> | ||
<stringProp name="HTTPSampler.method">GET</stringProp> | ||
<boolProp name="HTTPSampler.follow_redirects">true</boolProp> | ||
<boolProp name="HTTPSampler.auto_redirects">false</boolProp> | ||
<boolProp name="HTTPSampler.use_keepalive">true</boolProp> | ||
<boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> | ||
<boolProp name="HTTPSampler.monitor">false</boolProp> | ||
<stringProp name="HTTPSampler.embedded_url_re"></stringProp> | ||
<stringProp name="TestPlan.comments">Select a random item from the ${node_links} variable.</stringProp> | ||
</HTTPSamplerProxy> | ||
<hashTree/> | ||
</hashTree> | ||
<ResultCollector guiclass="SummaryReport" testclass="ResultCollector" testname="Summary Report" enabled="true"> | ||
<boolProp name="ResultCollector.error_logging">false</boolProp> | ||
<objProp> | ||
<name>saveConfig</name> | ||
<value class="SampleSaveConfiguration"> | ||
<time>true</time> | ||
<latency>true</latency> | ||
<timestamp>true</timestamp> | ||
<success>true</success> | ||
<label>true</label> | ||
<code>true</code> | ||
<message>true</message> | ||
<threadName>true</threadName> | ||
<dataType>true</dataType> | ||
<encoding>false</encoding> | ||
<assertions>true</assertions> | ||
<subresults>true</subresults> | ||
<responseData>false</responseData> | ||
<samplerData>false</samplerData> | ||
<xml>true</xml> | ||
<fieldNames>false</fieldNames> | ||
<responseHeaders>false</responseHeaders> | ||
<requestHeaders>false</requestHeaders> | ||
<responseDataOnError>false</responseDataOnError> | ||
<saveAssertionResultsFailureMessage>false</saveAssertionResultsFailureMessage> | ||
<assertionsResultsToSave>0</assertionsResultsToSave> | ||
<bytes>true</bytes> | ||
</value> | ||
</objProp> | ||
<stringProp name="filename"></stringProp> | ||
</ResultCollector> | ||
<hashTree/> | ||
<ResultCollector guiclass="ViewResultsFullVisualizer" testclass="ResultCollector" testname="View Results Tree" enabled="true"> | ||
<boolProp name="ResultCollector.error_logging">false</boolProp> | ||
<objProp> | ||
<name>saveConfig</name> | ||
<value class="SampleSaveConfiguration"> | ||
<time>true</time> | ||
<latency>true</latency> | ||
<timestamp>true</timestamp> | ||
<success>true</success> | ||
<label>true</label> | ||
<code>true</code> | ||
<message>true</message> | ||
<threadName>true</threadName> | ||
<dataType>true</dataType> | ||
<encoding>false</encoding> | ||
<assertions>true</assertions> | ||
<subresults>true</subresults> | ||
<responseData>false</responseData> | ||
<samplerData>false</samplerData> | ||
<xml>true</xml> | ||
<fieldNames>false</fieldNames> | ||
<responseHeaders>false</responseHeaders> | ||
<requestHeaders>false</requestHeaders> | ||
<responseDataOnError>false</responseDataOnError> | ||
<saveAssertionResultsFailureMessage>false</saveAssertionResultsFailureMessage> | ||
<assertionsResultsToSave>0</assertionsResultsToSave> | ||
<bytes>true</bytes> | ||
</value> | ||
</objProp> | ||
<stringProp name="filename"></stringProp> | ||
</ResultCollector> | ||
<hashTree/> | ||
</hashTree> | ||
</hashTree> | ||
</jmeterTestPlan> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,2 @@ | ||
admin,admin | ||
user,user |