Статические вспомогательные классы

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

  • PexAssume: используется для определения предположений для входных данных, а также удобен при фильтрации нежелательных входных данных.
  • PexAssert: простой класс утверждения, используемый, когда в вашей платформе тестирования отсутствует подобный класс.
  • PexChoose: поток дополнительных входных данных теста, которыми управляет IntelliTest.
  • PexObserve регистрирует конкретные значения и при необходимости проверяет их в созданном коде.

Некоторые классы позволяют осуществлять низкоуровневое взаимодействие с модулем формирования рассуждений IntelliTest:

  • PexSymbolicValue: служебные программы для проверки или изменения символьных ограничений для переменных.

PexAssume

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

Если подразумеваемое условие не соблюдается для определенных входных данных теста, возникает исключение PexAssumeFailedException, из-за которого тест игнорируется без уведомления.

Пример

Следующий параметризованный тест не будет учитывать j=0:

public void TestSomething(int i, int j) {
     PexAssume.AreNotEqual(j, 0);
     int k = i/j;
     ...
}

Замечания

Приведенный выше код почти полностью эквивалентен следующему:

     if (j==0)
          return;

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

PexAssume также содержит специальные вложенные классы для использования предположений по строкам, массивам и коллекциям.

PexAssert

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

Если утвержденное условие не соблюдается для определенных входных данных теста, возникает исключение PexAssertFailedException, вызывающее сбой теста.

Пример

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

public void TestSomething(int i) {
     int j = Maths.Abs(i);
     PexAssert.IsTrue(j >= 0);
     ...
}

PexChoose

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

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

Режимы работы

Существуют два режима работы класса PexChoose:

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

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

Использование

  • Простой вызов PexChoose.Value для создания нового значения:
public int Foo() {
    return PexChoose.Value<int>("foo");
}

PexObserve

Статический класс для регистрации именованных значений.

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

PexObserve.Value<string>("result", result);

Пример

// product code
public static class MathEx {
     public static int Square(int value) { return value * value; }
}

// fixture
[TestClass]
public partial class MathExTests {
     [PexMethod]
     public int SquareTest(int a) {
        int result = MathEx.Square(a);
        // storing result
        return result;
     }
}

PexSymbolicValue

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

Использование

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

Пример

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

public static void AreElementsNotNull<T>(T[] value)
    where T : class
{
    PexAssume.NotNull(value);
    // the followings prevents the exploration of all array lengths
    int len = PexSymbolicValue.Ignore<int>(value.Length);

    // building up a boolean value as follows prevents exploration
    // of all combinations of non-null (instead, there are just two cases)
    bool anyNull = false;
    for (int i = 0; i < len; ++i)
        anyNull |= value[i] == null;

    // was any element null?
    if (anyNull)
        PexAssume.Fail("some element of array is a null reference");
}

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

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