Статьи

Атрибут теста № 9 — детерминированный

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

Давайте начнем с простого примера. Что не так с этой картиной?

1
2
3
4
5
6
7
8
public class CreditCard
{
    DateTime expirationDate = new DateTime(2017,12,15);
    public bool IsExpired()
    {
        return (DateTime.Now > expirationDate);
    }
}

Это проверенный код. Итак, мы можем написать этот тест:

1
2
3
4
5
[TestMethod]public void IsExpired_Today_False()
{
    var card = new CreditCard();
    Assert.IsFalse(card.IsExpired());
}

Который проходит. Пока не наступит конкретный день, а затем он потерпит неудачу. Или этот код:

1
2
3
4
5
6
7
8
public class Settings
{
    public string GetFirstValue()
    {
        var lines = File.ReadLines("config.sys");
        return lines.First();
    }
}

И его тест:

1
2
3
4
5
6
7
[TestMethod]public void FirstLine_OfConfigSys_ContainsDevice()
{
    var settings = new Settings();
    var result = settings.GetFirstValue().Contains("Device");
    Assert.IsTrue(result);
     
}

Это происходит, если он находит файл там, где его ожидает, или кто-то редактирует его «в неправильном направлении». Это может выглядеть как зависимости, которым мы не можем доверять постоянно. Это глубже, чем это.

Никогда не принимай

держать-тихому-предположим, ничего-64 Когда мы пишем код, у нас много предположений. «Счастливый путь» мы обычно кодируем первым, когда предполагаем, что ничего не пойдет не так. Другие пути — это пути, где что-то может пойти не так. К сожалению, мы можем тестировать и кодировать только то, о чем думаем. На самом деле, письмо помогает нам думать о других случаях. Недостатком является то, что если мы используем библиотеку, которую мы не писали, мы думаем меньше о побочных эффектах.

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

  • Географическое положение
  • Время
  • Аппаратная скорость, процессор, память
  • Файлы и данные, как существующие, так и отсутствующие

Очевидное решение — смоделировать зависимости или настроить систему на независимость. Посмеиваясь над датой, мы можем проверить случаи «до» и «после» или «посадить» файл и смоделировать его чтение.

Однако, у насмешек есть свои недостатки , поэтому вы должны рассмотреть компромисс.

И иногда, издеваться не вариант. У нас был тест производительности, который должен был работать с определенным ограничением. Это начало терпеть неудачу и проходить и выключаться. Вместо того, чтобы проверить проблему, мы сказали: «О, оставь это, этот тест просто такой». И мы упустили возможности для решения реальных проблем.

Чтобы справиться с основной причиной — предположениями, мы вернемся к нашим друзьям. Просмотрите тесты и код и попробуйте подтвердить предположения или сделать их недействительными (в этом случае удалите код и проверьте). Непроверенные предположения могут вызвать не только ошибки. Код, который вы добавили, усложнит добавление нового кода в будущем. Используйте код, который не только работает, но и действителен.

В следующий раз: Изоляция.

Ссылка: Атрибут теста № 9 — Детерминированный от нашего партнера JCG Джила Зильберфельда в блоге Geek Out of Water .