RestAssured и TestNG Listener - определить request status code

Ребята, привет!

Столкнулась с такой проблемой, может кто подскажет, как решить.

Автоматизирую АРІ тести, и со временем их количество виросло к 800+. В каждом тесте один и тот же ендпоинт визиваеться 3-5 раз (e.g. my-host/createUser, my-host/createOrder, my-host/payOrder, my-host/deleteUser и т.д.)
АРІ SLA предвидит “5 failed tests from 10,000 requests sent”, но по факту тестов, которие падают из 504 ошибкой намного больше (24 из 876 - количество ендпоинт колов - в среднем до 5 тис, то есть по SLA должно било би упасть не больше 2-3 тестов). Девелопери фиксать ето не собираються (только пожалуйста не спрашивайте почему - зарубились, и нет, мол, ето не ошибка - делай что-то на своей стороне. Ну что ж, challenge accepted). Поетому я решила добавить лисенер для тестов, что б отловить количество таких 5хх тестов.
Проблема в том, что я никогда не встречала подобний лисенер и, к сожалению, не удалось нагуглить рабочий вариант.

В нашем фреймворке (Java + TestNG+ RestAssured) есть стандартний onTestFailure(ITestResult result) метод. Я нашла еще отдельний RestAssured лисенер:

public void onFailure(RequestSpecification requestSpecification, ResponseSpecification responseSpecification, Response response) {
		if(String.valueOf(response.statusCode()).startsWith("5")){
			log.info("Test failed with 5xx error: " + response.statusCode());
//			RestAssured.config = config().failureConfig(failureConfig().with().failureListeners(validationFailureListener));
		}
	}

	ResponseValidationFailureListener validationFailureListener = (reqSpec, respSpec, resp) -> {
		final ResponseSpecificationImpl respSpecImpl = (ResponseSpecificationImpl) respSpec;
		final LogRepository logRepo = respSpecImpl.getLogRepository();

		final String requestLog = logRepo.getRequestLog();

		//process requestLog
		final ByteArrayOutputStream outStream = new ByteArrayOutputStream();
		try {
			outStream.write(requestLog.getBytes());
		} catch (IOException e) {
			e.printStackTrace();
		}

		// put it back
		logRepo.registerRequestLog(outStream);
		respSpecImpl.setLogRepository(logRepo);
	};

Не знаю, есть
ли мне смисл использовать дополнительний код в validationFailureListener, так-как простого значения статус кода било би достаточно. Но, дело в том, что нет возможности добавить RestAssured лисенери к onTestFailure методу, так-как Override не отработает тогда:

onTestFailure(ITestResult result, RequestSpecification requestSpecification, ResponseSpecification responseSpecification, Response response) - не подходит :(

Может есть какой-нибудь способ обьеденить RestAssured и TestNG методи, что можно било использовать onTestFailure метод. Если же ви видите иной способ решения етой задачи - поделитесь пожалуйста :slight_smile:

Заранее всем благодарна!

Немогли бы вы описать чуть подробнее в чем именно ваша проблема.
Из описания выглядит так, у вас есть эндпоинты которые дают ответ 504, но при этом это не баг, но тест падает т.к все эндпоинты в сьюте валидируются на ответ допустим 200 ?

Хм… А чем плох стандартный TestNG листенер? Ваши тесты падают с конкрентной ошибкой - вот и парсите e.errorMessage() или как там его правильно :slight_smile: на конкретный код ошибки.
От себя могу добавить, что проблема может быть в слабости инфраструктуры, к примеру, cloudFlare какой-нить вполне может отдавать Вам 504 в случае перегруза.
Вам необходимо сделать 2 вещи:

  1. Написать нормальные тесты нагрузки и определить, что и когда падает и что получается при 504: есть ли нагрузка на CPU / память / БД и т.д. То есть, обложить тестовый энв мониторами и уже с нормальными эвиденсами идти общаться к разрабам.
  2. Если падают одни и те же тесты - возможно, дело-таки в функциональной части. Отловите, что и на каком моменте падает, гляньте логи на сервере.

То, чем Вы сейчас занимаетесь - это пытаетесь функциональными тестами решить очевидно нефункциональные ишью.

1 лайк