private void WriteReportData(ReportData ed) { string dtPattern = "yyyy-MM-dd HH:mm:ss.fff"; string configFolder = Path.GetDirectoryName(ed.ConfigParameters.ConfigFile); string reportFile = Path.IsPathRooted(_config.TestPlan.ReportFile) ? _config.TestPlan.ReportFile : Path.Combine(configFolder, _config.TestPlan.ReportFile); using (StreamWriter sw = new StreamWriter(Path.Combine(configFolder, _config.TestPlan.ReportFile))) { sw.WriteLine("Конфигурация запуска приложения для нагрузочного тестирования:"); sw.WriteLine($"Конфигурационный файл: {ed.ConfigParameters.ConfigFile}"); sw.WriteLine($"Адрес вызова: {ed.ConfigParameters.Uri}"); sw.WriteLine($"Файл с шаблоном запроса: {ed.ConfigParameters.RequestTemplateFile}"); sw.WriteLine($"Файл с данными для генерации запросов: {ed.ConfigParameters.DataFile ?? "не задан"}"); sw.WriteLine($"Количество одновременных запросов: {ed.ConfigParameters.Threads}"); sw.WriteLine($"Папка для файлов с текстом запросов: {ed.ConfigParameters.TraceRequestFolder}"); sw.WriteLine($"Папка для файлов с текстом ответов (TCP): {ed.ConfigParameters.TraceResponseFolder}"); sw.WriteLine($"Папка для файлов с телом ответов (HTTP): {ed.ConfigParameters.TraceHttpResponseFolder}"); sw.WriteLine($"Папка для файлов с текстом ошибок при соединении или сетевом обмене: {ed.ConfigParameters.TraceErrorFolder}"); sw.WriteLine(); sw.WriteLine($"Общая инфомация о запуске приложения для нагрузочного тестирования:"); sw.WriteLine($"Начало работы: {ed.ExecutionReport.Started.ToString(dtPattern)}"); sw.WriteLine($"Завершение работы: {ed.ExecutionReport.Completed.ToString(dtPattern)}"); sw.WriteLine($"Общая продолжительность выполнения (мс): {ed.ExecutionReport.DurationInMilliseconds.Overall}"); sw.WriteLine($"Продолжительность фазы по подготовке к запуску теста (мс): {ed.ExecutionReport.DurationInMilliseconds.Prepare?.ToString() ?? "не выполнялась"}"); sw.WriteLine($"Продолжительность основной фазы тестирования нагрузки (мс): {ed.ExecutionReport.DurationInMilliseconds.RunTest?.ToString() ?? "не выполнялась"}"); sw.WriteLine($" в т.ч. открытие соединений к сервису (мс): {ed.ExecutionReport.DurationInMilliseconds.Connect?.ToString() ?? "не выполнялась"}"); sw.WriteLine($" в т.ч. отправка запросов и получение ответов (мс): {ed.ExecutionReport.DurationInMilliseconds.Request?.ToString() ?? "не выполнялась"}"); sw.WriteLine($"Продолжительность фазы по преобразованию ответов сервиса (мс): {ed.ExecutionReport.DurationInMilliseconds.Convert?.ToString() ?? "не выполнялась"}"); sw.WriteLine(); string firstResponseAppeared = (ed.TestMetrics.FirstResponseAppearedAfterTestStarted?.ToString() ?? "не выполнялось"); string lastResponseAppeared = (ed.TestMetrics.LastResponseAppearedAfterTestStarted?.ToString() ?? "не выполнялось"); sw.WriteLine($"Основные метрики нагрузочного тестирования:"); sw.WriteLine($"Успешных подключений: {ed.TestMetrics.SuccessOnConnect}"); sw.WriteLine($"Ошибок при подключении: {ed.TestMetrics.ErrorsOnConnect}"); sw.WriteLine($"Успешных запросов: {ed.TestMetrics.SuccessOnRequest}"); sw.WriteLine($"Ошибок при выполнении запроса: {ed.TestMetrics.ErrorsOnRequest}"); sw.WriteLine($"Время с начала тестирования до получения первой порции данных первого пришедшего ответа (мс): {firstResponseAppeared}"); sw.WriteLine($"Время с начала тестирования до получения первой порции данных последнего пришедшего ответа (мс): {lastResponseAppeared}"); sw.WriteLine(); if (ed.TestMetrics.ConnectDuration != null) { sw.WriteLine("Статистические метрики для фазы подключения к сервису:"); WritePhaseData(sw, ed.TestMetrics.ConnectDuration, "начала первого подключения", "окончания последнего подключения"); } else { sw.WriteLine("Статистические метрики для фазы подключения к сервису: данных нет"); } sw.WriteLine(); if (ed.TestMetrics.ConnectDuration != null) { sw.WriteLine("Статистические метрики для фазы отправки запроса к сервису:"); WritePhaseData(sw, ed.TestMetrics.SendDuration, "начала отправки первого запроса", "окончания отправки последнего запроса"); } else { sw.WriteLine("Статистические метрики для фазы отправки запроса к сервису: данных нет"); } sw.WriteLine(); if (ed.TestMetrics.ConnectDuration != null) { sw.WriteLine("Статистические метрики для фазы получения ответа от сервиса:"); WritePhaseData(sw, ed.TestMetrics.ReceiveDuration, "начала получения первого ответа", "окончания получения последнего ответа"); } else { sw.WriteLine("Статистические метрики для фазы получения ответа от сервиса: данных нет"); } sw.WriteLine(); if (ed.TestMetrics.ConnectDuration != null) { sw.WriteLine("Статистические метрики для фазы преобразования ответов сервиса:"); sw.WriteLine($"Успешных преобразований: {ed.ConvertMetrics.SuccessOnConvert}"); sw.WriteLine($"Ошибок при преобразованиях: {ed.ConvertMetrics.ErrorsOnConvert}"); WritePhaseData(sw, ed.ConvertMetrics.ConvertDuration, "начала первого преобразования", "окончания последнего преобразования"); } else { sw.WriteLine("Статистические метрики для фазы преобразования ответов сервиса: данных нет"); } } }
internal void WriteLogs(ConfigReportData configReportData) { ReportData ed = PrepareReportData(configReportData); WriteReportData(ed); }
private ReportData PrepareReportData(ConfigReportData crd) { ReportData ed = new ReportData(); ed.ConfigParameters = crd; long?prepare = GetDuration(EventType.PrepareTestStart, EventType.PrepareTestEnd); long?runTest = GetDuration(EventType.RunTestStart, EventType.RunTestEnd); long?connect = GetDuration(EventType.CreateThreadsAndConnectStart, EventType.CreateThreadsAndConnectEnd); long?request = GetDuration(EventType.SendRequestsStart, EventType.SendRequestsEnd); long?convert = GetDuration(EventType.Tcp2HttpResponsesConversionStart, EventType.Tcp2HttpResponsesConversionEnd); ExecutionReportDurationData dd = new ExecutionReportDurationData { Overall = _globalEvents.Last().GlobalElapsedMilliseconds, Prepare = prepare, RunTest = runTest, Connect = connect, Request = request, Convert = convert }; ed.ExecutionReport = new ExecutionReportData { Started = _globalStartDt, Completed = _globalEvents.Last().Dt, DurationInMilliseconds = dd }; int failedOnConnect = _wiDataList.Count(d => d.ConnectionFailed); int failedOnRequest = _wiDataList.Count(d => d.RequestFailed); int failedOnConvert = _wiDataList.Count(d => d.ConvertFailed); List <long> responsesAppearedTimes = _wiDataList.Select(d => d.Events.FirstOrDefault(e => e.Type == WiEventType.FirstBlockReceived)?.ElapsedMilliseconds) .Where(em => em.HasValue).Select(em => em.Value).ToList(); long?firstResponseAppeared = (responsesAppearedTimes.Count == 0 ? (long?)null : responsesAppearedTimes.Min()); long?lastResponseAppeared = (responsesAppearedTimes.Count == 0 ? (long?)null : responsesAppearedTimes.Max()); PhaseDurationData connectDuration = GetPhaseDurationData(WiEventType.Connection, WiEventType.Connected); PhaseDurationData sendDuration = GetPhaseDurationData(WiEventType.RequestStarted, WiEventType.RequestSent); PhaseDurationData receiveDuration = GetPhaseDurationData(WiEventType.RequestSent, WiEventType.Received); PhaseDurationData convertDuration = GetPhaseDurationData(WiEventType.ConversionStarted, WiEventType.ConversionCompleted); ed.TestMetrics = new TestMetricsData { SuccessOnConnect = crd.Threads - failedOnConnect, SuccessOnRequest = crd.Threads - failedOnConnect - failedOnRequest, ErrorsOnConnect = failedOnConnect, ErrorsOnRequest = failedOnRequest, ConnectDuration = connectDuration, SendDuration = sendDuration, ReceiveDuration = receiveDuration, FirstResponseAppearedAfterTestStarted = firstResponseAppeared, LastResponseAppearedAfterTestStarted = lastResponseAppeared }; ed.ConvertMetrics = new ConvertMetricsData { SuccessOnConvert = crd.Threads - failedOnConnect - failedOnRequest, ErrorsOnConvert = failedOnConvert, ConvertDuration = convertDuration }; return(ed); }