Статьи

Как добиться отчетности CSV в SoapUI (с открытым исходным кодом)

Вступление

SoapUI — это инструмент, предназначенный для тестирования веб-сервисов. Он направлен на функциональное тестирование, нагрузку и тестирование безопасности веб-сервисов SOAP и REST. Это продукт SmartBear и поставляется в следующих 2 вариантах:

  • SoapUI OS (с открытым исходным кодом)
  • SoapUI Pro (Лицензионный)

SoapUI OS — бесплатная версия, доступная для скачивания и использования. Ниже приведен список некоторых основных функций, которых ему не хватает по сравнению с SoapUI Pro (лицензионная версия):

  • сбор информации
  • тестовая отладка
  • утверждение без кода
  • генерация внешних отчетов на основе результатов тестового прогона

Эта статья посвящена созданию внешних отчетов на основе результатов тестового запуска в SoapUI OS.

Случай использования

Команда проекта работает с ОС SoapUI для функционального тестирования веб-сервисов в их приложении. Следующая структура создана для тестирования приложения с использованием SoapUI OS.

В качестве результата теста клиент хочет, чтобы команда проекта сформировала отчет о результатах теста. Сгенерированный отчет должен быть в формате .csv и содержать следующую информацию:

  • Набор тестов, Тестовый набор, Шаг теста, Тип шага, Статус шага, Сообщение о результате, Дата выполнения
  • Отправленный запрос и полученный ответ для каждого теста должны храниться локально вместе с отчетом.

Из-за отсутствия встроенной функции отчетности в SoapUI OS, альтернативный подход должен быть реализован с использованием объекта testRunner.

Объект testRunner может получить доступ ко всей модели проекта и содержит всю информацию о тестовом примере и результатах теста.

В тестовом примере SoapUI можно добавить шаг скрипта Groovy, чтобы извлечь результаты тестового примера из объекта testRunner и сгенерировать отчет в формате .csv.

Ниже приведены шаги, необходимые для создания отчета:

  • В существующем проекте SoapUI создайте новый Test Suite с именем: Library
  • Отключите набор тестов библиотеки, чтобы избежать его выполнения вместе с проектом
  • Создайте новый тестовый набор с именем: Reporting_Utility внутри набора тестов.
  • Добавьте шаг сценария Groovy с именем: GenerateCSVReport в тестовом примере.
  • Напишите следующий скрипт в GenerateCSVReport:
// Try-catch block to handle exceptions
try {

// 1. Create a "SoapUIResults" folder in the project path 
      // Retrieve the project root folder
      def projectPath = new com.eviware.soapui.support.GroovyUtils(context).projectPath

      // Specify a folder inside project root to store the results
      String folderPath = projectPath + "/SoapUIResults";

      // Create a File object for the specified path
      def resultFolder = new File(folderPath);

      // Check for existence of folder and create a folder
      if(!resultFolder.exists())
      {
        resultFolder.mkdirs();
      }

/* ------------------------------------------------------------------------------- */

// 2. Create a subfolder (with timestamp) to store the request-response local copy 
      // Retrieve the latest execution date-time
      Date d = new Date();
      def executionDate = d.format("dd-MMM-yyyy HH_mm");

      // Specify the subfolder path with name Request-Response_CurrentTimeStamp
      String subfolderPath1 = folderPath+ "/Request-Response_"+executionDate;

      // Create this sub-folder
      new File(subfolderPath1).mkdirs();

/* ------------------------------------------------------------------------------- */

// 3. Create another subfolder "CSV Reports" to store the reports file 
      // Specify the subfolder path with name CSV Reports
      String subfolderPath2 = folderPath+ "/CSV Reports";

      // Create this sub-folder
      new File(subfolderPath2).mkdirs();

/* ------------------------------------------------------------------------------- */

// 4. Create a Report.csv file inside the CSV Reports folder 
      // Create a File object for Report csv file (with timestamp)
      def reportFile = new File(subfolderPath2, "Report_"+executionDate+".csv");

      // Check for existence of report file and create a file
      if(!reportFile.exists())
      {
        reportFile.createNewFile();
        // Create required column names in the report file
        reportFile.write('"Test Suite","Test Case","Test Step","Step Type","Step Status",'
                        +'"Result message","Execution Date"');
      }
/* ------------------------------------------------------------------------------- */
// 5. Inserting data in the file
      // Iterate over all the test steps results
  for(stepResult in testRunner.getResults())
  {
    // Retrieve Test Suite name
   def testSuite = testRunner.testCase.testSuite.name;
   // Retrieve Test Case name
   def testCase = testRunner.testCase.name;
   // Retrieve Test Step
   def testStep = stepResult.getTestStep();
   // Retrieve Test Step name
   def testStepName = testStep.name
   // Retrieve Test Step type
   def type = testStep.config.type
   // Retrieve Test Step status
   def status = stepResult.getStatus()

   // Creating new line in report file
   reportFile.append('\n');

   // Write all the necessary information in the file
   reportFile.append('"' + testSuite + '",');
   reportFile.append('"' + testCase + '",');
   reportFile.append('"' + testStepName + '",');
   reportFile.append('"' + type + '",');
   reportFile.append('"' + status + '",');

   // Retrieve the test result messages
   reportFile.append('"');
   for(resMessage in stepResult.getMessages())
   {
     // Write messages and separate multiple messages by new line
     reportFile.append('Message:' + resMessage + '\n');
   }
   reportFile.append('",');

   //Write executionDate in the file
   reportFile.append('"' + executionDate + '",');
/* ------------------------------------------------------------------------------- */
// 6. Extract the request and response and save it to external file
      // Verify if the test step type is request: SOAP project or restrequest: REST project
        if((type=="request").or(type=="restrequest"))
        {
          // Extract the request from the test step
          def extRequest = testStep.properties["Request"].value;    

      // Create a file in the reports folder and write the request
      // Naming convention: request_TestSuiteName_TestCaseName_TestStepName.txt
      def requestFile=subfolderPath1+"/request_"+testSuite+"_"+testCase+"_"+testStepName+".txt";
      def rqfile = new File(requestFile);
      rqfile.write(extRequest, "UTF-8");

      // Extract the response from the test step
      def extResponse = stepResult.getResponseContent();    

      // Create a file in the reports folder and write the response
      // Naming convention: response_TestSuiteName_TestCaseName_TestStepName.txt
      def responseFile=subfolderPath1+"/response_"+testSuite+"_"+testCase+"_"+testStepName+".txt";
      def rsfile = new File(responseFile);
      rsfile.write(extResponse, "UTF-8");
     }
   }
 }
catch(exc)
{
   log.error("Exception happened: " + exc.toString());
}

To generate the report, GenerateCSVReport must be executed after each test case execution by following the steps given below:

  • Open the “TearDown Script” section for each test case from the test case window by clicking on the button as shown below:
  • In the opened “TearDown Script” section, following line of code is written to call GenerateCSVReport
// Code to execute the GenerateCSVReport test step
testRunner.testCase.testSuite.project.testSuites["Library"].testCases["Reporting_Utility"].
testSteps["GenerateCSVReport"].run(testRunner, context);
  • Execute the SoapUI Project

Post-execution, observe project directory for the newly created folder SoapUIResults.

Inside the sub-folders of SoapUIResults, observe the files for the saved request and response and CSV Report file as shown below:

Usage

This technique of generating reports using groovy can be used for SOAP, as well as REST project.

GenerateCSVReport test step can be customized to generate a report and populate data, based on specific requirements.