Содержание
1. Введение
За последнее десятилетие наблюдается значительный рост веб-API, особенно RESTful API, следующих архитектурному стилю REpresentational State Transfer. Современные веб-сервисы регулярно предоставляют REST API для доступа клиентов к их функциональности, что стимулирует развитие многочисленных методов и инструментов автоматизированного тестирования.
Данное исследование решает задачу сравнения инструментов тестирования REST API, которые оценивались в разных условиях с различными метриками. Мы представляем первое комплексное эмпирическое исследование, которое систематически идентифицирует как академические, так и промышленные инструменты, анализирует характеристики кода, влияющие на производительность инструментов, проводит углубленный анализ ошибок и определяет конкретные направления будущих исследований.
10 оцененных инструментов
Включая академические и промышленные инструменты
20 реальных сервисов
RESTful API с открытым исходным кодом в качестве бенчмарков
2 ключевые метрики
Покрытие кода и обнаруженные уникальные ошибки
2. Методология
2.1 Выбор инструментов
Мы провели тщательный поиск литературы, который выявил 8 академических инструментов и 11 промышленных инструментов. После применения критериев отбора, включая доступность, документацию и статус поддержки, мы выбрали 10 современных инструментов для комплексной оценки.
2.2 Бенчмарк-сервисы
Наш бенчмарк состоит из 20 RESTful-сервисов, отобранных из связанных работ и поиска на GitHub. Критерии отбора включали:
- Реализация на Java/Kotlin с открытым исходным кодом
- Наличие спецификации OpenAPI
- Минимальная зависимость от внешних ресурсов
- Реальное использование и сложность
2.3 Метрики оценки
Мы оценивали инструменты с использованием двух основных метрик:
- Покрытие кода: Покрытие строк, покрытие ветвей и покрытие методов, измеряемые с помощью JaCoCo
- Обнаружение ошибок: Уникальные вызванные ошибки, классифицированные по типу и серьезности
3. Результаты эксперимента
3.1 Анализ покрытия кода
Наши результаты показывают значительные вариации в покрытии кода, достигнутом разными инструментами. Лучшие инструменты достигли до 78% покрытия строк, в то время как другие с трудом достигали 30%. Покрытие было особенно сложным для кода обработки ошибок и сложной бизнес-логики.
Рисунок 1: Сравнение покрытия кода для 10 инструментов тестирования. Инструменты, использующие эволюционные алгоритмы и символьное выполнение, стабильно превосходили подходы случайного тестирования.
3.2 Обнаружение ошибок
Инструменты выявили 247 уникальных ошибок в бенчмарк-сервисах. Типы ошибок включали:
- HTTP 500 Internal Server Errors (42%)
- HTTP 400 Bad Request (28%)
- Исключения нулевого указателя (15%)
- Утечки ресурсов (8%)
- Другие исключения (7%)
3.3 Сравнение инструментов
Ни один инструмент не доминировал по всем метрикам. Инструменты преуспели в разных областях:
- EvoMaster: Лучшее общее покрытие
- RESTler: Наиболее эффективен для тестирования stateful API
- Schemathesis: Отлично подходит для валидации схем
4. Технический анализ
4.1 Математическая модель
Задача генерации тестов может быть формализована как задача оптимизации. Пусть $T$ — множество тестовых случаев, $C$ — критерий покрытия, а $F$ — множество ошибок. Цель — максимизировать:
$$\max_{T} \left( \alpha \cdot \text{cov}(T, C) + \beta \cdot \sum_{f \in F} \mathbb{1}_{f \text{ detected by } T} \right)$$
где $\alpha$ и $\beta$ — весовые коэффициенты, а $\text{cov}(T, C)$ измеряет, насколько хорошо тестовый набор $T$ удовлетворяет критерию покрытия $C$.
4.2 Реализация алгоритма
Упрощенный псевдокод для генерации тестов REST API:
function generateTests(apiSpec, maxTime):
testSuite = initializeTestSuite()
population = initializePopulation(apiSpec)
while timeElapsed < maxTime:
for individual in population:
testCase = decodeIndividual(individual)
coverage, failures = executeTest(testCase, apiSpec)
fitness = calculateFitness(coverage, failures)
updateIndividualFitness(individual, fitness)
population = selectAndReproduce(population)
population = mutatePopulation(population, apiSpec)
testSuite.updateBestTests(population)
return testSuite.getBestTests()
5. Перспективы развития
На основе наших результатов мы определяем несколько перспективных направлений исследований:
- Гибридные подходы: Комбинирование нескольких стратегий тестирования
- Машинное обучение: Использование ML для предсказания перспективных тестовых входных данных
- Контейнеризация: Улучшенная обработка внешних зависимостей
- Тестирование безопасности: Расширение для обнаружения уязвимостей безопасности API
Оригинальный анализ
Данное эмпирическое исследование представляет значительный прогресс в исследованиях тестирования REST API, предоставляя первое комплексное сравнение как академических, так и промышленных инструментов. Результаты показывают, что, хотя был достигнут существенный прогресс, остается значительный потенциал для улучшений, особенно в достижении стабильно высокого покрытия кода в различных реализациях API.
Методология исследования соответствует установленным практикам эмпирической разработки программного обеспечения, аналогично строгим подходам оценки, наблюдаемым в фундаментальных работах, таких как статья CycleGAN (Zhu et al., 2017), которая систематически сравнивала несколько генеративных моделей. Однако, в отличие от фокуса CycleGAN на трансляции изображений, данная работа решает уникальные задачи тестирования REST API, включая stateful-взаимодействия и сложные зависимости данных.
Ключевое понимание — это компромисс между различными стратегиями тестирования. Инструменты на основе эволюционных алгоритмов, аналогичные используемым в search-based software testing (Harman & Jones, 2001), продемонстрировали превосходное покрытие, но требовали больше вычислительных ресурсов. Это перекликается с выводами из IEEE Transactions on Software Engineering относительно ресурсоемкости сложных подходов к тестированию.
Анализ ошибок показывает, что текущие инструменты особенно эффективны в обнаружении простых ошибок реализации, но испытывают трудности со сложными ошибками бизнес-логики. Это ограничение отражает проблемы, выявленные в анализе ограничений автоматизированного тестирования в ACM Computing Surveys (Barr et al., 2015), где семантическое понимание остается значительным барьером.
В перспективе, интеграция больших языковых моделей для генерации тестов, как исследуется в недавних работах Google Research и Microsoft Research, может решить некоторые текущие ограничения. Однако, как отмечается в препринте arXiv исследователями из Стэнфорда и MIT, необходима тщательная валидация, чтобы гарантировать, что такие подходы обобщаются для различных паттернов API.
Вклад исследования в установление стандартизированных бенчмарков особенно ценен, аналогично эффекту ImageNet в компьютерном зрении. Предоставляя общую структуру оценки, эта работа позволяет проводить более значимые сравнения и ускоряет прогресс в области, потенциально влияя на будущую разработку инструментов как в академических, так и в промышленных условиях.
6. Ссылки
- Kim, M., Xin, Q., Sinha, S., & Orso, A. (2022). Automated Test Generation for REST APIs: No Time to Rest Yet. In Proceedings of ISSTA '22.
- Zhu, J. Y., Park, T., Isola, P., & Efros, A. A. (2017). Unpaired Image-to-Image Translation using Cycle-Consistent Adversarial Networks. In Proceedings of ICCV.
- Harman, M., & Jones, B. F. (2001). Search-based software engineering. Information and Software Technology.
- Barr, E. T., Harman, M., McMinn, P., Shahbaz, M., & Yoo, S. (2015). The Oracle Problem in Software Testing: A Survey. IEEE Transactions on Software Engineering.
- Martin-Lopez, A., Segura, S., & Ruiz-Cortés, A. (2021). RESTest: Black-Box Testing of RESTful Web APIs. In Proceedings of ICSOC.
- Atlidakis, V., Godefroid, P., & Polishchuk, M. (2019). RESTler: Stateful REST API Fuzzing. In Proceedings of ICSE.
- Arcuri, A. (2019). RESTful API Automated Test Case Generation with EvoMaster. ACM Transactions on Software Engineering and Methodology.