Поделиться через


Границы исследования

PexSettingsAttributeBase — это абстрактный базовый класс для задания границ в качестве атрибутов. Раздел Каскад параметров содержит общие сведения о параметрах в IntelliTest.

Вы можете изменить параметры с помощью именованных свойств этого и производных от него атрибутов:

[PexClass(MaxRuns = 10)]
public partial class FooTest {...}
  • Границы поиска решения для ограничений
  • Границы исследования путей
    • MaxBranches — максимальное число ветвей, которые могут быть использованы вдоль одного пути выполнения.
    • MaxCalls — максимальное число вызовов, которые могут быть выполнены вдоль одного пути выполнения.
    • MaxStack — максимальный размер стека в любой точке одного пути выполнения, измеряемый количеством кадров активного вызова.
    • MaxConditions — максимальное количество условий для входных данных, которые можно проверить в рамках одного пути выполнения.
  • Границы исследования
    • MaxRuns — максимальное количество попыток запуска во время просмотра.
    • MaxRunsWithoutNewTests —максимальное количество последовательных выполнений без выдачи нового теста.
    • MaxRunsWithUniquePaths — максимальное количество попыток запуска с уникальными путями выполнения во время просмотра.
    • MaxExceptions — максимальное число исключений, которые можно найти для всех обнаруженных путей выполнения.
  • Параметры создания кода для набора тестов

MaxConstraintSolverTime

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

Чем глубже IntelliTest изучает пути выполнения программы, тем сложнее становятся системы ограничений, создаваемые IntelliTest на основе потока управления и потока данных программы. В зависимости от временных ограничений можно задать это значение таким образом, чтобы предоставить IntelliTest больше или меньше времени на обнаружение новых путей выполнения.

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

MaxConstraintSolverMemory

Объем памяти в мегабайтах, в рамках которого функция поиска решения для ограничений должна вычислить входные данные, позволяющие проследовать по новому и другому пути выполнения. Это параметр для PexSettingsAttributeBase* и его производных типов.

Чем глубже IntelliTest изучает пути выполнения программы, тем сложнее становятся системы ограничений, создаваемые IntelliTest на основе потока управления и потока данных программы. В зависимости от доступной на компьютере памяти можно задать это значение таким образом, чтобы позволить IntelliTest работать с более сложными системами ограничений.

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

MaxBranches

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

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

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

Например, следующий код использует ветви до 100:

for (int i=0; i<100; i++) { }

MaxCalls

Максимальное число вызовов, которые могут быть выполнены вдоль одного пути выполнения.

Эта граница исследования призвана ограничить длину любого пути выполнения, изучаемого IntelliTest во время создания входных данных. В частности, она предотвращает зависание IntelliTest, когда программа рекурсивно вызывает метод бесконечное число раз, что способно привести к переполнению стека и неустранимому сбою IntelliTest.

В этом пределе учитывается каждый вызов (прямой, косвенный, виртуальный, переход) выполняемого и отслеживаемого кода.

MaxStack

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

Эта граница исследования призвана ограничить размер стека любого пути выполнения, изучаемого IntelliTest во время создания входных данных. В частности, она не позволят IntelliTest использовать все доступное пространство стека, что способно привести к переполнению стека и неустранимому сбою IntelliTest.

MaxConditions

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

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

Например, каждый путь в следующем коде использует n+1 условий:

[PexMethod]
void ParameterizedTest(int n)
{
     for (int i=0; i<n; i++) { // conditions are "0<n", "1<n", ..., "!(n<n)"
          ...
     }
     for (int i=0; i<100; i++) { // irrelevant for MaxConditions, since conditions do not depend on input
          ...
     }
}

MaxRuns

Максимальное количество запусков IntelliTest будет пытаться во время исследования теста.

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

Параметры MaxRuns и MaxRunsWithUniquePaths связаны следующим образом:

  • IntelliTest будет вызывать метод параметризованного теста до MaxRuns раз с различными входными параметрами теста.
  • Если выполняемый код является детерминированным, IntelliTest будет каждый раз использовать другой путь выполнения. Однако при некоторых условиях выполняемый код может следовать по уже использованному ранее пути выполнения с новыми входными параметрами.
  • IntelliTest подсчитывает число обнаруженных уникальных путей выполнения, которое ограничивается параметром MaxRunsWithUniquePaths.

MaxRunsWithoutNewTests

Максимальное количество последовательных выполнений без выдачи нового теста.

Хотя часто IntelliTest может быстро найти множество интересных входных данных тестов, через некоторое время он перестанет находить новые входные данные и выдавать модульные тесты. Этот параметр конфигурации накладывает ограничение на число последовательных попыток, которые IntelliTest может предпринять без передачи нового теста. При достижении заданного значения исследование останавливается.

MaxRunsWithUniquePaths

Максимальное число уникальных путей, учитываемых IntelliTest при исследовании.

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

Параметры MaxRuns и MaxRunsWithUniquePaths связаны следующим образом:

  • IntelliTest будет вызывать метод параметризованного теста до MaxRuns раз с различными входными параметрами теста.
  • Если выполняемый код является детерминированным, IntelliTest будет каждый раз использовать другой путь выполнения. Однако при некоторых условиях выполняемый код может следовать по уже использованному ранее пути выполнения с новыми входными параметрами.
  • IntelliTest подсчитывает число обнаруженных уникальных путей выполнения, которое ограничивается параметром MaxRunsWithUniquePaths.

MaxExceptions

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

Эта граница исследования призвана остановить изучение кода, содержащего много ошибок. Если IntelliTest находит слишком много ошибок в коде, изучение останавливается.

TestExcludePathBoundsExceeded

Пути выполнения, выходящие за настроенные границы путей MaxCalls, MaxBranches, MaxStack и MaxConditions, игнорируются.

Эта граница исследования призвана решить вопрос с незавершающимися тестами. Когда IntelliTest достигает границы исследования, такой как MaxCalls, MaxBranches, MaxStack или MaxConditions, он предполагает, что тест не будет незавершающимся процессом и в дальнейшем не приведет к переполнению стека. Такие тестовые случаи могут вызвать проблемы в других платформах тестирования, и этот атрибут позволяет запретить IntelliTest выдачу тестовых случаев для потенциально незавершающихся процессов либо тестовых случаев, способных вызвать переполнение стека.

TestEmissionFilter

Указывает типы тестов, которые должен выдавать IntelliTest. Возможны следующие значения:

  • All — тесты выдаются для всего, включая нарушения предположений.
  • FailuresAndIncreasedBranchHits (по умолчанию) — тесты выдаются для всех уникальных сбоев, а также при увеличении объема протестированного кода тестовым случаем с учетом параметра TestEmissionBranchHits.
  • FailuresAndUniquePaths — тесты выдаются для всех найденных IntelliTest сбоев, а также для каждого входного параметра теста, приводящего к образованию уникального пути выполнения.
  • Failures — тесты выдаются только для сбоев.

TestEmissionBranchHits

В зависимости от текущего значения TestEmissionFilter IntelliTest создает тестовые случаи, когда они охватывают незатронутую ранее ветвь в программе.

Параметр TestEmissionBranchHits определяет, нужно ли IntelliTest учитывать, что ветвь была охвачена тестом хотя бы один раз (TestEmissionBranchHits=1), один или два раза (TestEmissionBranchHits=2) и т. д.

TestEmissionBranchHits = 1 создает очень маленький набор тестов, охватывающий все доступные IntelliTest ветви. В частности, этот набор тестов также охватывает все доступные базовые блоки и инструкции.

Значением по умолчанию для этого параметра является TestEmissionBranchHits=2. При нем создается более выразительный набор тестов, который также лучше подходит для обнаружения ошибок регрессии в будущем.

Хотите отправить отзыв?

Делитесь своими идеями и пожеланиями относительно новых функций в сообществе разработчиков.