Esempio n. 1
0
        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("Статистические метрики для фазы преобразования ответов сервиса: данных нет");
                }
            }
        }
Esempio n. 2
0
        internal void WriteLogs(ConfigReportData configReportData)
        {
            ReportData ed = PrepareReportData(configReportData);

            WriteReportData(ed);
        }
Esempio n. 3
0
        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);
        }