Ошибки Off By One и тестирование мутаций

В процессе написания тестера мутаций "Off By One" для моего любимого фреймворка тестирования мутаций(NinjaTurtles)я написал следующий код, чтобы дать возможность проверить правильность моей реализации:

public int SumTo(int max)
{
    int sum = 0;
    for (var i = 1; i <= max; i++)
    {
        sum += i;
    }
    return sum;
}

теперь это кажется достаточно простым, и мне не приходило в голову, что возникнет проблема при попытке изменить все литеральные целочисленные константы в IL. В конце концов, есть только 3 (0, 1и ++).

НЕПРАВИЛЬНО!

При первом прогоне стало совершенно очевидно, что в данном конкретном случае это никогда не сработает. Почему? Потому что изменение кода на

public int SumTo(int max)
{
    int sum = 0;
    for (var i = 0; i <= max; i++)
    {
        sum += i;
    }
    return sum;
}

только добавляет к сумме 0 (ноль ), и это, очевидно, не имеет никакого эффекта. Другое дело, если бы это был множественный набор, но в данном случае это не так.

Теперь есть довольно простой алгоритм для вычисления суммы целых чисел

sum = max * (max + 1) / 2;

, который я мог бы легко провалить мутациями, поскольку прибавление или вычитание 1 из любой из констант приведет к ошибке. (учитывая, чтоmax >= 0)

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

Итак, -Мой вопрос:Существуют ли какие-либо тривиальные или нетривиальные -случаи, когда цикл, начинающийся с 0 или 1, может привести к "мутации на единицу" сбоя теста, который не может быть реорганизован (тестируемый код или тест )аналогичным образом? (примеры, пожалуйста)

Примечание:Тесты на мутацию завершаются неудачно, если набор тестов проходит успешно после применения мутации.

Обновление:пример чего-то менее тривиального,но что-то, что все еще может иметь рефакторинг теста, так что он не пройден, будет следующим

public int SumArray(int[] array)
{
    int sum = 0;
    for (var i = 0; i < array.Length; i++)
    {
        sum += array[i];
    }

    return sum;
}

Тестирование мутации против этого кода завершится неудачно при изменении var i=0на var i=1, если введенный вами тест был new[] {0,1,2,3,4,5,6,7,8,9}. Однако измените тестовый ввод на new[] {9,8,7,6,5,4,3,2,1,0}, и проверка мутации завершится неудачно. Итак, успешный рефакторинг подтверждает тестирование.

7
задан James Wiseman 27 March 2013 в 11:06
поделиться