Какие стратегии можно использовать для автоматизации создания юнит-тестов? На какие аспекты вам нужно обратить внимание в каждом классе, чтобы создать хотя бы скелетный тестовый набор?
Я понимаю, что комплексное автоматическое решение не практично, но я бы хотел немного ускорить создание тестов, создав каркас. Я не ищу примеры кода, просто, возможно, некоторые предложения о том, с чего начать, или примеры того, где что-то подобное было сделано, чтобы я мог видеть, как они подошли к этому и что может быть возможным.
Я особенно заинтересован в методах создания каркасов модульных тестов в PHP, который не предоставляет все инструменты, которые есть в других языках, например, полный хинтинг типа .
php
unit-testing
VirtuosiMedia
источник
источник
Ответы:
Ваша стратегия и каркас зависят, нетривиально, от того, какие тесты вы хотите сгенерировать, какой охват вы ищете, и от языка / среды, в которой вы работаете.
Довольно просто написать генератор тестов, который для языков, таких как C или Java, читает сигнатуры классов и автоматически генерирует тесты для стандартных угловых случаев (передача 0, 2 случайных значений, MAX_INT, MIN_INT, целочисленному аргументу, нули для обнуляемых значений). , и т.д...). Затем вы можете запустить сгенерированные тесты, записать результаты для каждого теста и вручную отфильтровать их, чтобы удалить ненужные, утвердить приемлемые результаты для тестов, которые прошли (чтобы они могли автоматически проходить с тех пор), и пометить как недействительные, которые не прошли ,
Вы можете дополнить это пометкой / комментированием / рефакторингом классов, чтобы помочь вашему генератору с дополнительными подсказками. У вас может быть тег, который перечисляет все возможные исключения, которые разрешено вызывать при вызове метода, или который дает уменьшенный диапазон допустимых целых чисел для целочисленного аргумента. Посмотрите на них как на сокращение для того, чтобы написать тесты самостоятельно.
Итак, вот некоторые компоненты, которые вы хотите посмотреть:
Существует множество тестовых сред, которые уже включают в себя фрагменты этой функциональности для различных языков и платформ. Несмотря на то, что довольно легко начать выполнять эту работу самостоятельно и органично развивать подобную структуру самостоятельно, это также бесконечный долгосрочный проект, который, вероятно, будет дублировать существующую работу. Я бы порекомендовал потратить значительное время, чтобы сначала посмотреть на то, что доступно, а затем решить, стоит ли тратить время на погружение.
источник
У меня еще не было возможности использовать его в приложениях значительного размера или сложности, но есть инструменты, в том числе Google CodePro AnalytiX , которые автоматизируют создание модульных тестов для приложений Java . Я также нашел коммерческий продукт Parasoft C ++ Test , который позволяет создавать модульные тесты C ++.
Эти приложения использовали эвристику для генерации тестовых случаев. Я не уверен, что есть одна структура, которую вы можете использовать для создания скелета, но есть конструкции, которые вы можете искать. Я стремлюсь сосредоточиться на циклах, условных выражениях (
if
блоках,switch
/case
утверждениях) и исключениях и создавать тестовые случаи, которые заставляют выполнять разные пути выполнения.Я не сосредоточился бы на ускорении написания тестов, пытаясь создать каркас или шаблон, а скорее на улучшении анализа спецификации и / или реализации и написании высококачественных тестов. Возможность определения того, какие тесты приносят наибольшую пользу на ранних этапах, их написание и последующее заполнение отверстий, оказали бы большее влияние на производительность и качество.
Просто для того, чтобы обеспечить еще большую известность, Falcon опробовал CodePro над проектом и написал небольшую рекламу о своем опыте .
источник
Я написал генератор для ускорения модульного тестирования проекта .NET несколько лет назад. Была большая кодовая база без юнит-тестов, и она была нацелена на быстрое увеличение базового покрытия. Вот несколько заметок, которые могут быть полезны:
data-driven testing
помогает, если позволяет ваша кодовая база. Среда тестирования создала таблицу базы данных для каждого модульного теста для хранения тестовых данных, так что каждая строка в этой таблице была отдельным тестом и никакого дополнительного кода не требовалось ( Правило представления ). С этого момента фактические тесты могут быть легко созданы автоматически или введены вручную.smoke test
минимум. Для областей повышенного риска были написаны дополнительные ручные тесты.Подводя итог, я согласен, что общее решение будет непрактичным (если это возможно). Я полагаю, что шансы лучше, если кодовая база пригодна для генерации тестов, а тестовая среда может воспользоваться ее структурой.
(Как примечание, есть Pex , но это для .NET)
источник