using AddInPlugin.Setting;
|
using OpenTap;
|
using OpenTap.Addin.Entity;
|
using OpenTap.Addin.Util;
|
using Scriban;
|
using Scriban.Runtime;
|
using System;
|
using System.Collections.Generic;
|
using System.IO;
|
using System.Reflection;
|
using System.Text.Json.Serialization;
|
|
namespace AddInPlugin
|
{
|
public class ReportData
|
{
|
public string Name { get; set; }
|
public string StartTime { get; set; }
|
public string EndTime { get; set; }
|
public Verdict Verdict { get; set; }
|
public string Consuming { get; set; }
|
public List<ReportDetail> Parameters { get; set; }
|
}
|
|
public class TestReport
|
{
|
public string Name { get; set; }
|
public Verdict Verdict { get; set; }
|
public string StartTime { get; set; }
|
public string EndTime { get; set; }
|
public string CreateTime { get; set; }
|
public List<ReportData> Steps { get; set; } = new List<ReportData>();
|
}
|
|
public class HtmlReportListener : ReportListener
|
{
|
private static string templateStr;
|
|
private TestReport report;
|
|
public static string ReadEmbeddedResource(string resourceName)
|
{
|
// resourceName 格式: "命名空间.文件夹.文件名.txt"
|
// 例如: "MyApp.Templates.test_report_template.txt"
|
|
var assembly = Assembly.GetExecutingAssembly();
|
|
using (Stream stream = assembly.GetManifestResourceStream(resourceName))
|
{
|
if (stream == null)
|
{
|
// 调试:列出所有可用的资源名称
|
var allResources = assembly.GetManifestResourceNames();
|
throw new FileNotFoundException(
|
$"资源 '{resourceName}' 未找到。可用资源: {string.Join(", ", allResources)}");
|
}
|
|
using (StreamReader reader = new StreamReader(stream))
|
{
|
return reader.ReadToEnd();
|
}
|
}
|
}
|
|
|
static HtmlReportListener()
|
{
|
templateStr = ReadEmbeddedResource("AddInPlugin.html_report_template.txt");
|
}
|
|
public HtmlReportListener(string name) : base(name)
|
{
|
|
}
|
|
public override IResultListener CreateChild()
|
{
|
var res = new HtmlReportListener($"{Name}_Child")
|
{
|
RootPlanRun = this.RootPlanRun
|
};
|
|
if (this.Root == null)
|
{
|
res.Root = this;
|
}
|
else
|
{
|
res.Root = this.Root;
|
}
|
return res;
|
}
|
|
private void WriteReport()
|
{
|
string file = Path.Combine(StationSettings.Current.ReportPath, $"{CurrentPlanRun.TestPlanName}_{CurrentPlanRun.StartTime.ToString("yyyyMMddHHmmssfff")}.html");
|
var template = Template.Parse(templateStr);
|
report.CreateTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff");
|
|
var context = new TemplateContext();
|
context.LoopLimit = 0;
|
var scriptObject = new ScriptObject();
|
scriptObject.Import(report);
|
context.PushGlobal(scriptObject);
|
var result = template.Render(context);
|
File.WriteAllText(file, result);
|
}
|
|
protected override void PlanStarted()
|
{
|
lock (this)
|
{
|
report = new TestReport
|
{
|
Name = $"{CurrentPlanRun.TestPlanName} 测试报告",
|
StartTime = $"开始时间:{CurrentPlanRun.StartTime.ToString("yyyy-MM-dd HH:mm:ss.fff")}",
|
Verdict = CurrentPlanRun.Verdict,
|
EndTime = "-"
|
};
|
}
|
}
|
|
protected override void StepComplated(TestStepRun stepRun)
|
{
|
lock (this)
|
{
|
if (stepRun.Report != null)
|
{
|
var reportData = new ReportData
|
{
|
Name = stepRun.TestStepPath,
|
StartTime = $"开始时间:{stepRun.Report.StartTime.ToString("yyyy-MM-dd HH:mm:ss.fff")}",
|
EndTime = $"开始时间:{stepRun.Report.EndTime.ToString("yyyy-MM-dd HH:mm:ss.fff")}",
|
Consuming = $"耗时:{(stepRun.Report.EndTime - stepRun.Report.StartTime).TotalSeconds:N2}s",
|
Verdict = stepRun.Verdict,
|
Parameters = stepRun.Report.Details
|
};
|
report.Steps.Add(reportData);
|
WriteReport();
|
}
|
}
|
}
|
|
protected override void PlanComplated()
|
{
|
lock (this)
|
{
|
report.Verdict = CurrentPlanRun.Verdict;
|
report.EndTime = $"结束时间:{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}";
|
WriteReport();
|
}
|
}
|
}
|
}
|