Как модульные тесты Guava генерируются автоматически?


31

В Гуаве автоматически создаются тестовые случаи :

В Гуаве огромное количество модульных тестов: по состоянию на июль 2012 года пакет guava-tests включает более 286 000 отдельных тестовых случаев. Большинство из них генерируются автоматически , а не пишутся от руки, но тестовое покрытие Guava очень тщательно, особенно для com.google.common.collect.

Как они сформировались? Какие методы и технологии были использованы для разработки и создания их?


Я помню выступление какого-то гугл-чувака, который затронул эту тему.
Понятия не имею,

3
В пакете com.google.common.collect.testing есть много классов с именем «Generator», что делает его похожим на фреймворк для генерации тестов. Есть также подпакеты с классами, задокументированными как «скелеты» или «базовые классы» для тестов ...
gnat

1
@gnat Да, я был уверен, что где-то видел. Например, com.google.common.collect.testing.features показывает параметры / ограничения, которым должен удовлетворять класс коллекции, и контрольный пример представляет собой их комбинацию. Таким образом, они могут параметризовать тестирование
dzieciou


Вопрос привлек большое внимание сообщества, но пока не дал разумного ответа, поэтому я последовал предложению Мартина и разместил его здесь: sqa.stackexchange.com/questions/5214/… .
dzieciou

Ответы:


8

Большая часть этой массы тестов предназначена для реализации коллекций Guava. Они написали общие тесты, которые всесторонне тестируют интерфейсы коллекции, и это генерирует набор для реализации. Смотрите, например, классы , называемых CollectionAddAllTester, ListIndexOfTester.

Все это поддерживается библиотекой testlib, которая поставляется как часть Guava. Это довольно общее. Он поддерживает написание общих тестов для любого интерфейса (не только коллекции). Вы можете указать Features возможных реализаций и протестировать их (например, если ваш набор немодифицируем, вы ожидаете другого результата set.add()), и при запуске тестов вы указываете, какие функции поддерживает ваша реализация.

Он основан на JUnit 3, а не 4. Обычно у вас есть класс, расширяющий TestCaseполный набор именованных методов testSomething(), и JUnit выполняет их рефлексивно. Библиотека testlib подключается к выполнению этих тестов, поэтому жизненный цикл выглядит следующим образом:

  • Для каждой реализации вы хотите протестировать
  • Для каждого (применимого) метода испытаний
  • Создать TestCaseэкземпляр
  • Инициализируйте TestSubjectGenerator- это интерфейс testlib, который вы расширяете, где вы фактически создаете объект тестирования
  • Рефлексивно запустите метод испытаний. Во время этого метода getSubjectGenerator()дает доступ к испытуемому

Ключевой бит является дополнительным этапом инициализации, который позволяет им вводить конкретного тестируемого в общий тестовый пример.

Я написал пост о том, как написать testlib, генерирующий наборы для ваших собственных интерфейсов.

(Также опубликовано на тот же вопрос на сайте sqa .)


6

Есть генераторы модульных тестов. Например, в мире .NET что-то вроде Microsoft Pex может сделать это.

Например, Microsoft Pex на основе анализа кода пытается использовать все возможные значения в качестве аргументов для метода. Ожидается, что некоторые аргументы позволят методу генерировать исключение. Такие вещи могут автоматически тесты, созданные для. Статические значения, такие как пустая строка, которая возвращается в определенных случаях, также могут быть автоматически проверены.


2
Это случайное тестирование, полезное только для тестирования отрицательного пути (исключения, неверный ввод, сбои, тайм-аут). Я полагаю, что они также создали тесты на удачный путь, и для этого требуется больше дизайна, а не просто запуск инструмента статического анализа.
dzieciou

И я знаю, что есть способы и инструменты для генерации теста на счастливый путь (например, посмотрите этот ответ ), но мне интересно, как это было сделано в конкретном случае с
Гуавой
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.