Недетерминизм в поблочном тестировании

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

Например, вот тест, взятый от модульных тестов nUnit (EqualsFixture.cs):

[Test]
public void Int() 
{
    int val = 1;
    int expected = val;
    int actual = val;

    Assert.IsTrue(expected == actual);
    Assert.AreEqual(expected, actual);
}

Это имеет преимущество того, чтобы быть детерминированным; если Вы запустите тест однажды, и он перестал работать, то он продолжит перестать работать, пока код не фиксируется. Однако Вы заканчиваете тем только, что тестировали ограниченный набор значений.

Я не могу не чувствовать, что это - отходы, хотя; тот же самый тест, вероятно, запущен с теми же самыми параметрами сотни если не тысячи времен через срок действия проекта.

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

В предыдущем примере, возможно:

[Test]
public void Int() 
{
    Random rnd = new Random();
    int val = rnd.Next();
    int expected = val;
    int actual = val;
    Console.WriteLine("val is {0}", val);
    Assert.IsTrue(expected == actual);
    Assert.AreEqual(expected, actual);
}

(Если бы код ожидал строку, то возможно, случайная строка, которая, как известно, была допустима для конкретной функции, могла использоваться каждый раз),

Преимущество было бы то, что, чем больше раз Вы запускаете тест, тем намного больший набор возможных значений Вы знаете, он может обработать правильно.

Действительно ли это полезно? Зло? Там недостатки к этому? Я полностью упускаю суть поблочного тестирования?

Спасибо за Ваши мысли.

12
задан rh. 23 February 2010 в 01:38
поделиться

5 ответов

Вы хотите, чтобы ваши модульные тесты были повторяемыми, чтобы они всегда вели себя одинаково, если код не изменится. Тогда, если код изменится и вызовет сбой модульного теста, вы сможете исправить код, и модульный тест выполнит свою задачу. Более того, вы знаете, что код [вероятно] исправлен, когда модульный тест снова пройдет".

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

7
ответ дан 2 December 2019 в 20:17
поделиться

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

Что действительно важно, так это то, что каждый тест должен всегда использовать один и тот же путь кода . Это не совсем то же самое.

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

4
ответ дан 2 December 2019 в 20:17
поделиться

Тесты должны охватывать ваши варианты использования, не более того.

Взгляните на PEX .

3
ответ дан 2 December 2019 в 20:17
поделиться

Большая проблема, с которой я сталкиваюсь, заключается в том, что поскольку это случайный процесс, он может не привести к сбою, пока тест не будет выполнен 200, 2000, 3000 или более раз. Если тест не сработает при попытке 6007 через несколько месяцев или лет после написания примера, это будет означать, что у вас была ошибка в течение нескольких месяцев или лет, но вы о ней не знали.

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

2
ответ дан 2 December 2019 в 20:17
поделиться

Тестируете ли вы случайное число или оператор равенства?

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

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

0
ответ дан 2 December 2019 в 20:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: