Автоматизация создания модульного теста

11

Какие стратегии можно использовать для автоматизации создания юнит-тестов? На какие аспекты вам нужно обратить внимание в каждом классе, чтобы создать хотя бы скелетный тестовый набор?

Я понимаю, что комплексное автоматическое решение не практично, но я бы хотел немного ускорить создание тестов, создав каркас. Я не ищу примеры кода, просто, возможно, некоторые предложения о том, с чего начать, или примеры того, где что-то подобное было сделано, чтобы я мог видеть, как они подошли к этому и что может быть возможным.

Я особенно заинтересован в методах создания каркасов модульных тестов в PHP, который не предоставляет все инструменты, которые есть в других языках, например, полный хинтинг типа .

VirtuosiMedia
источник
Последняя Visual Studio - это все, что вам нужно ...
Работа

Ответы:

5

Ваша стратегия и каркас зависят, нетривиально, от того, какие тесты вы хотите сгенерировать, какой охват вы ищете, и от языка / среды, в которой вы работаете.

Довольно просто написать генератор тестов, который для языков, таких как C или Java, читает сигнатуры классов и автоматически генерирует тесты для стандартных угловых случаев (передача 0, 2 случайных значений, MAX_INT, MIN_INT, целочисленному аргументу, нули для обнуляемых значений). , и т.д...). Затем вы можете запустить сгенерированные тесты, записать результаты для каждого теста и вручную отфильтровать их, чтобы удалить ненужные, утвердить приемлемые результаты для тестов, которые прошли (чтобы они могли автоматически проходить с тех пор), и пометить как недействительные, которые не прошли ,

Вы можете дополнить это пометкой / комментированием / рефакторингом классов, чтобы помочь вашему генератору с дополнительными подсказками. У вас может быть тег, который перечисляет все возможные исключения, которые разрешено вызывать при вызове метода, или который дает уменьшенный диапазон допустимых целых чисел для целочисленного аргумента. Посмотрите на них как на сокращение для того, чтобы написать тесты самостоятельно.

Итак, вот некоторые компоненты, которые вы хотите посмотреть:

  • Компонент для автоматического анализа исходного кода / сигнатур функций / ручных аннотаций, создания стандартных тестовых случаев или схем / подписей для тестовых случаев, ожидающих завершения ввода.
  • Постоянно растущий / изменяющийся язык тегов / аннотаций / комментариев, который может переходить на любой уровень детализации (метод / класс / сигнатура / циклы while / и т. Д.), Представляющий подсказки автоматизированному построителю тестов. В идеале вы должны быть в состоянии играть с этим языком без необходимости перекодировать ваш фреймворк или какие-либо куски в нем
  • Автоматизированный тестовый прогон, с возможностью идентифицировать новые / старые тесты и записывать / тестировать «приемлемые» ответы для каждого теста. В идеале этот участник должен создать базу данных о тестовых прогонах, принятых / отклоненных результатах и ​​текущих приемлемых результатах для каждого теста.
  • Автоматизированный "объектный фейкер", который, учитывая имя класса и карту имен-> значений, может генерировать объект, имитирующий класс, возвращая настраиваемые данные для вызовов функций, средств доступа, открытых слотов данных и т. Д.

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

blueberryfields
источник
5

У меня еще не было возможности использовать его в приложениях значительного размера или сложности, но есть инструменты, в том числе Google CodePro AnalytiX , которые автоматизируют создание модульных тестов для приложений Java . Я также нашел коммерческий продукт Parasoft C ++ Test , который позволяет создавать модульные тесты C ++.

Эти приложения использовали эвристику для генерации тестовых случаев. Я не уверен, что есть одна структура, которую вы можете использовать для создания скелета, но есть конструкции, которые вы можете искать. Я стремлюсь сосредоточиться на циклах, условных выражениях ( ifблоках, switch/ caseутверждениях) и исключениях и создавать тестовые случаи, которые заставляют выполнять разные пути выполнения.

Я не сосредоточился бы на ускорении написания тестов, пытаясь создать каркас или шаблон, а скорее на улучшении анализа спецификации и / или реализации и написании высококачественных тестов. Возможность определения того, какие тесты приносят наибольшую пользу на ранних этапах, их написание и последующее заполнение отверстий, оказали бы большее влияние на производительность и качество.


Просто для того, чтобы обеспечить еще большую известность, Falcon опробовал CodePro над проектом и написал небольшую рекламу о своем опыте .

Томас Оуэнс
источник
Google CodePro Analytix звучит интересно. Но "Quis custodiet Ipsos Custodes?" Кто тестирует тесты? Это может использоваться только для резервного копирования существующего проекта с помощью модульных тестов и, вероятно, не обнаружит сбои, скорее, он предположит, что дефекты исправлены.
Сокол
@Falcon Вы не можете слепо доверять любому инструменту - это только вызовет больше головной боли. Я думаю, что совет прагматичного программиста «забота о вашем ремесле» применим здесь. CodePro содержит редактор тестов, который позволяет легко увидеть, какие значения передаются и каков ожидаемый результат, а затем внести в него изменения (а затем обновить сгенерированный тестовый код, чтобы отразить эти изменения).
Томас Оуэнс
Мне просто интересно, что в этом случае надежнее человека или машины. Я думаю, что эти сгенерированные тесты вызовут больше головной боли, чем тесты, написанные вручную. В идеале тест должен быть написан первым в любом случае. Но я обязательно попробую. Мне бы очень хотелось увидеть инструмент, который может генерировать тесты на основе формальных требований и метаданных, чтобы однажды связать систему.
Сокол
@Falcon Да, в идеале некоторые тесты должны быть написаны первыми, но пока у вас нет реализации и вы не можете выполнить тестирование в виде белого ящика, вы не обязательно увидите все различные крайние случаи, которые вы можете увидеть, когда у вас будет реализация. Если у вас есть возможность поиграть с функциями генерации тестов CodePro, не могли бы вы где-нибудь опубликовать свои мысли и получить мне ссылку? Мне интересно посмотреть, насколько хорошо это работает и опыт других людей с этим.
Томас Оуэнс
Я протестирую его на следующей неделе с J2EE-приложением среднего размера (120 kloc), которое включает в себя некоторые действительно жесткие бизнес-правила, и расскажу вам о моем опыте здесь.
Сокол
1

Я написал генератор для ускорения модульного тестирования проекта .NET несколько лет назад. Была большая кодовая база без юнит-тестов, и она была нацелена на быстрое увеличение базового покрытия. Вот несколько заметок, которые могут быть полезны:

  • Мой шанс состоял в том, что базовая структура, над которой был разработан проект, обеспечивала стандартные операции и именование классов. Если вы думаете о написании своей собственной, такая стандартная структура очень поможет.
  • Использование очень data-driven testingпомогает, если позволяет ваша кодовая база. Среда тестирования создала таблицу базы данных для каждого модульного теста для хранения тестовых данных, так что каждая строка в этой таблице была отдельным тестом и никакого дополнительного кода не требовалось ( Правило представления ). С этого момента фактические тесты могут быть легко созданы автоматически или введены вручную.
  • Полученные модульные тесты были простыми, но они служили как smoke testминимум. Для областей повышенного риска были написаны дополнительные ручные тесты.

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

(Как примечание, есть Pex , но это для .NET)

henginy
источник