5、结果生成部分:

  代理中获取的数据终写到一个csv文件中,在代理部分的执行函数完成后,读取这个文件的内容,生成相关的结果数据和图片(图片在python中倾向于使用matlibplot包)。终将其写成html的结果报告形式:

  重要代码:

 def generate_results(dir, test_name):
     print ' Generating Results...'
     try:
         merged_log = open(dir + '/agent_stats.csv', 'rb').readlines()  # this log contains commingled results from all agents
     except IOError:
         sys.stderr.write('ERROR: Can not find your results log file ')
     merged_error_log = merge_error_files(dir)   
 
     if len(merged_log) == 0:
         fh = open(dir + '/results.html', 'w')
         fh.write(r'<html><body><p>None of the agents finished successfully.  There is no data to report.</p></body></html> ')
         fh.close()
         sys.stdout.write('ERROR: None of the agents finished successfully.  There is no data to report. ')
         return
 
     timings = list_timings(merged_log)
     best_times, worst_times = best_and_worst_requests(merged_log)
     timer_group_stats = get_timer_groups(merged_log)
     timing_secs = [int(x[0]) for x in timings]  # grab just the secs (rounded-down)
     throughputs = calc_throughputs(timing_secs)  # dict of secs and throughputs
     throughput_stats = corestats.Stats(throughputs.values())
     resp_data_set = [x[1] for x in timings] # grab just the timings
     response_stats = corestats.Stats(resp_data_set)   
 
     # calc the stats and load up a dictionary with the results
     stats_dict = get_stats(response_stats, throughput_stats)   
 
     # get the pickled stats dictionaries we saved
     runtime_stats_dict, workload_dict = load_dat_detail(dir)
 
     # get the summary stats and load up a dictionary with the results 
     summary_dict = {}
     summary_dict['cur_time'] = time.strftime('%m/%d/%Y %H:%M:%S', time.localtime())
     summary_dict['duration'] = int(timings[-1][0] - timings[0][0]) + 1  # add 1 to round up
     summary_dict['num_agents'] = workload_dict['num_agents']
     summary_dict['req_count'] = len(timing_secs)
     summary_dict['err_count'] = len(merged_error_log)
     summary_dict['bytes_received'] = calc_bytes(merged_log)
 
     # write html report
     fh = open(dir + '/results.html', 'w')
     reportwriter.write_head_html(fh)
     reportwriter.write_starting_content(fh, test_name)
     reportwriter.write_summary_results(fh, summary_dict, workload_dict)
     reportwriter.write_stats_tables(fh, stats_dict)
     reportwriter.write_images(fh)
     reportwriter.write_timer_group_stats(fh, timer_group_stats)
     reportwriter.write_agent_detail_table(fh, runtime_stats_dict)
     reportwriter.write_best_worst_requests(fh, best_times, worst_times)
     reportwriter.write_closing_html(fh)
     fh.close()
     # response time graph
 def resp_graph(nested_resp_list, dir='./'):
     fig = figure(figsize=(8, 3))  # image dimensions
     ax = fig.add_subplot(111)
     ax.set_xlabel('Elapsed Time In Test (secs)', size='x-small')
     ax.set_ylabel('Response Time (secs)' , size='x-small')
     ax.grid(True, color='#666666')
     xticks(size='x-small')
     yticks(size='x-small')
     axis(xmin=0)
     x_seq = [item[0] for item in nested_resp_list]
     y_seq = [item[1] for item in nested_resp_list]
     ax.plot(x_seq, y_seq,
         color='blue', linestyle='-', linewidth=1.0, marker='o',
         markeredgecolor='blue', markerfacecolor='yellow', markersize=2.0)
     savefig(dir + 'response_time_graph.png')    
 
 # throughput graph
 def tp_graph(throughputs_dict, dir='./'):
     fig = figure(figsize=(8, 3))  # image dimensions
     ax = fig.add_subplot(111)
     ax.set_xlabel('Elapsed Time In Test (secs)', size='x-small')
     ax.set_ylabel('Requests Per Second (count)' , size='x-small')
     ax.grid(True, color='#666666')
     xticks(size='x-small')
     yticks(size='x-small')
     axis(xmin=0)
     keys = throughputs_dict.keys()
     keys.sort()
     values = []
     for key in keys:
         values.append(throughputs_dict[key])
     x_seq = keys
     y_seq = values
     ax.plot(x_seq, y_seq,
         color='red', linestyle='-', linewidth=1.0, marker='o',
         markeredgecolor='red', markerfacecolor='yellow', markersize=2.0)
     savefig(dir + 'throughput_graph.png')     try:  # graphing only works on systems with Matplotlib installed
         print 'Generating Graphs...'
         import graph
         graph.resp_graph(timings, dir=dir+'/')
         graph.tp_graph(throughputs, dir=dir+'/')
     except:
         sys.stderr.write('ERROR: Unable to generate graphs with Matplotlib ')
 
     print ' Done generating results. You can view your test at:'
 print '%s/results.html ' % dir

  对于项目的运行,既可以采取控制台方式,也可以提供给QA人员GUI的方式。Pylot中提供了很好的GUI支持,可以作为示例使用。实际上不建议使用GUI的方式,另外pylot中没有用户指定策略的支持,这个需要自己专门进行开发;另外是pylot中的类封装结构还不是很好,对以后的扩展来说还需要一定的更改。但是作为一般使用已经足够了,下面是pylot的终报告结果(只做实例使用)。