Вступление
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.