Какие тесты сделать для этого маленького метода? - PullRequest
5 голосов
/ 03 декабря 2010

В настоящее время у меня есть следующий метод:

public void SetNewRandomValue() {
   double newValue = numberGenerator.GenerateDouble(
                             genesValuesInterval.MinimumValue,
                             genesValuesInterval.MaximumValue
                             );

   this.value = newValue;
}

Какими должны быть рекомендации для определения того, сколько тестов (и какие тесты) необходимо выполнить для этого метода?В настоящее время я сделал следующее (только после реализации метода - то есть, не для первого теста):

var interval = new Interval(-10, 10);
var numberGeneratorMock = new Mock<INumberGenerator>(MockBehavior.Strict);
var numberGenerator = numberGeneratorMock.Object;

double expectedValue = 5.0;

numberGeneratorMock.Setup(ng => 
        ng.GenerateDouble(interval.MinimumValue, interval.MaximumValue))
        .Returns(expectedValue);

var gene = new Gene(numberGenerator, 0, new Interval(-10, 10));
gene.SetNewRandomValue();

Assert.AreEqual<double>(expectedValue, gene.Value);

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

Что вы думаете по этому поводу?Как бы вы справились с этим маленьким методом?

Спасибо

Ответы [ 7 ]

2 голосов
/ 03 декабря 2010

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

Лично мне нравится работать с Microsoft Testing Tool или NUnit Testing Framework. Затем я могу щелкнуть правой кнопкой мыши мой проект тестов и Test with NCover (при использовании NUnit), который запустит тесты и сообщит мне процент кода, покрытого для каждого из моих объектов и тестов.

Я говорю, что когда вы закончите проверку покрытия кода, которое приведет к по крайней мере 98% покрытия кода, ваш код, вероятно, будет хорошо протестирован.

1 голос
/ 04 декабря 2010

Метод делает три вещи:
Вызов numberGenerator.GenerateDouble с genesValuesInterval.MinimumValue в качестве первого параметра,
и с genesValuesInterval.MaximumValue в качестве второго параметра,
и установка this.value на результат этого вызова.

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

Изменить (отвечая на комментарии ниже): Если предполагаемое поведение этого метода состоит в том, чтобы установить this.value на случайное удвоение в ранее указанном диапазоне, тогда три вышеупомянутых теста полезны (предполагая, что genesValuesInterval min и max - ранее указанный диапазон, и что у вас есть тесты на месте чтобы утверждать, что numberGenerator.GenerateDouble (min, max) возвращает значение типа double в указанном диапазоне.

Если предполагаемое поведение этого метода состоит в том, чтобы просто установить this.value на случайное двойное значение внутри (Double.MinValue, Double.MaxValue), то первые два теста не нужны, поскольку это всего лишь детали реализации.

Если введено

1 голос
/ 03 декабря 2010

Вы также можете написать тест для документирования (и проверки) ожидаемого поведения Gene.SetNewRandomValue, когда NumberGenerator.GenerateDouble возвращает значение за пределами указанного интервала.

1 голос
/ 03 декабря 2010

Вы могли бы определенно обосновать, что это не модульное тестирование.ИМХО, проверка кода - совершенно правильная методика тестирования.Вы обычно не тестируете такие вещи, как установщики / получатели свойств, я думаю, что этот метод достаточно прост, чтобы избежать модульного тестирования по той же причине.

Тем не менее, если вы действительно хотите это проверить, вот что ясделать: я бы протестировал его с парой значений, а не один раз с 5. (SetNewRandomValue может быть реализован как this.value = 5;, который не должен проходить.) Я бы проверил его с нецелым числом, чтобы подтвердитьтам нет ни одного странного приведения к целому числу.

Вы можете проверить, что он вызывает GenerateDouble с правильными параметрами, хотя это действительно проверяет детали реализации.(SetNewRandomValue может быть реализован как numberGenerator.GenerateDouble(0, interval.max - interval.min) + interval.min;, и это не должно провалиться в тесте.) Вы можете использовать генератор случайных чисел и сделать SetNewRandomValue несколько тысяч раз, и проверить, что значения равномерно распределены в ожидаемом диапазоне.

1 голос
/ 03 декабря 2010

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

1 голос
/ 03 декабря 2010

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

0 голосов
/ 03 декабря 2010

Чтобы ответить, как проверить это, вы должны быть в состоянии описать, какое поведение требуется.

Глядя на ваш код, я предполагаю, что «Gene.SetNewRandomValue» должен установить self.Value вчисло, которое попадает в интервал, переданный конструктору.

Я не очень знаком с классом Mock, так что я могу быть вне базы, но, похоже, вы не проверяете это.Что если бы ваша реализация имела эту опечатку?

double newValue = numberGenerator.GenerateDouble( 
                         genesValuesInterval.MinimumValue, 
                         genesValuesInterval.MinimumValue 
                         ); 

Разве ваш тест все еще не прошел?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...