1 | #!/usr/bin/env python |
---|
2 | # |
---|
3 | # Copyright (c) 2010-2011 Corey Goldberg (corey@goldb.org) |
---|
4 | # License: GNU LGPLv3 |
---|
5 | # |
---|
6 | # This file is part of Multi-Mechanize |
---|
7 | |
---|
8 | |
---|
9 | from xml.etree import ElementTree as ET |
---|
10 | |
---|
11 | |
---|
12 | |
---|
13 | def write_jmeter_output(mm_data, output_path): |
---|
14 | """ |
---|
15 | Take the list of ResponseStats objects and write a JMeter 2.1 |
---|
16 | formatted XML file to output_path. |
---|
17 | |
---|
18 | JMeter JTL file documentation: |
---|
19 | http://jakarta.apache.org/jmeter/usermanual/listeners.html |
---|
20 | """ |
---|
21 | root = ET.Element('testResults') |
---|
22 | root.set('version', "1.2") |
---|
23 | |
---|
24 | for test_transaction in mm_data: |
---|
25 | # each transaction might have multiple timers |
---|
26 | transaction_root = ET.SubElement(root, 'sample') |
---|
27 | # JMeter uses ms for time |
---|
28 | ms_trans_time = test_transaction.trans_time * 1000 |
---|
29 | transaction_root.set('t', '%d' % ms_trans_time) |
---|
30 | ms_timestamp = test_transaction.epoch_secs * 1000 |
---|
31 | transaction_root.set('ts', '%d' % ms_timestamp) |
---|
32 | transaction_root.set('lb', test_transaction.user_group_name) # label |
---|
33 | transaction_root.set('sc', '1') # sample count |
---|
34 | |
---|
35 | if test_transaction.error: |
---|
36 | transaction_root.set('ec', '1') # was an error |
---|
37 | transaction_root.set('s', 'false') # was an error |
---|
38 | # errors don't have custom_timers |
---|
39 | continue |
---|
40 | else: |
---|
41 | transaction_root.set('ec', '0') |
---|
42 | transaction_root.set('s', 'true') |
---|
43 | |
---|
44 | # parse the custom_timers and add each as a JMeter sub-sample |
---|
45 | for timer_name, timer_duration in test_transaction.custom_timers.items(): |
---|
46 | timer_duration = float(timer_duration) |
---|
47 | timer_element = ET.SubElement(transaction_root, 'sample') |
---|
48 | ms_trans_time = timer_duration * 1000 |
---|
49 | timer_element.set('t', '%d' % ms_trans_time) |
---|
50 | # subtimers don't have timestamps, so use the Transaction ts |
---|
51 | timer_element.set('ts', '%d' % ms_timestamp) |
---|
52 | timer_element.set('lb', timer_name) |
---|
53 | timer_element.set('sc', '1') |
---|
54 | timer_element.set('ec', '0') |
---|
55 | timer_element.set('s', 'true') |
---|
56 | |
---|
57 | tree = ET.ElementTree(root) |
---|
58 | tree.write(output_path + '/results.jtl') |
---|
59 | tree.write('last_results.jtl') |
---|