2016-11-27 2 views
0

Я видел много теорий о Теории, но правда в том, что ни один из них не достаточно хорош, чтобы объяснить, почему не всегда использовать Теорию. Я не вижу причины (кроме ... ну ... что слова «Теория и Тест» - это не одно и то же), почему бы не всегда использовать теорию.NUnit Theory заменяет тест?

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

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

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

Как программист Я ..... Если ответ не прост, там что-то не так. помогите мне увидеть, чего я не вижу.

ответ

1

Поскольку вы имеете в виду NUnit, я отвечу WRT, что NUnit означает по теории. Обратите внимание, что это полностью отличается от того, как xUnit.Net использует этот термин.

У меня появилась идея теории от Юнита и, в частности, от работы Давида Саффа. Вот одна статья по теме: http://groups.csail.mit.edu/pag/pubs/test-theory-demo-oopsla2007.pdf Google «Теории сафа», и вы найдете больше.

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

Используя NUnit, я мог бы написать тест, как это ...

public void SqrtTest(double value) 
{ 
    Assume.That(value >=0); 
    double answer = SquareRootOf(value); 
    Assert.That(answer*answer, Is.EqualTo(value)); 
} 

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

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

К сожалению, мы все еще ждем этот последний бит. :-)

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

На днях я надеюсь написать довольно длинную главу об Теориях.

+0

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

+0

Да, в теории. :-) – Charlie

+0

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