Выбрать язык

Автоматическая генерация тестов для REST API: Эмпирическое исследование и анализ

Эмпирическое исследование 10 современных инструментов тестирования REST API на 20 реальных сервисах, анализирующее покрытие кода и обнаружение ошибок.
apismarket.org | PDF Size: 0.7 MB
Оценка: 4.5/5
Ваша оценка
Вы уже оценили этот документ
Обложка PDF-документа - Автоматическая генерация тестов для REST API: Эмпирическое исследование и анализ

Содержание

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. Ссылки

  1. 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.
  2. 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.
  3. Harman, M., & Jones, B. F. (2001). Search-based software engineering. Information and Software Technology.
  4. 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.
  5. Martin-Lopez, A., Segura, S., & Ruiz-Cortés, A. (2021). RESTest: Black-Box Testing of RESTful Web APIs. In Proceedings of ICSOC.
  6. Atlidakis, V., Godefroid, P., & Polishchuk, M. (2019). RESTler: Stateful REST API Fuzzing. In Proceedings of ICSE.
  7. Arcuri, A. (2019). RESTful API Automated Test Case Generation with EvoMaster. ACM Transactions on Software Engineering and Methodology.