2012-01-05 2 views
0

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

Я пишу тест, чтобы получить правильные цены на продукт. Продукт может поставляться разных размеров и приобретаться в нескольких определенных количествах. Цена продукта будет отражать размер и количество.

Например:

Продукт А имеет матрицу цен ниже (количество вниз по склону и размер вдоль верхней)

---------------------------- 
|  | xs | s | m | l | 
---------------------------- 
| 250| 10 | 20 | 50 | 100 | 
---------------------------- 
| 500| 20 | 40 | 60 | 110 | 
---------------------------- 
| 1000| 15 | 25 | 55 | 105 | 
---------------------------- 
| 1500| 12 | 22 | 52 | 102 | 
---------------------------- 

Теперь говорят, что я писал тесты для метода класса

Pricer.GetPrice(Product p, string size, int quantity) 

Должен ли я тестировать каждый товар/количество/количество? как вы можете себе представить, это может означать большое количество тестов.

Если цены получены из хранилища данных и, следовательно, могут измениться, как вы держите свои тесты правильными или это просто раздражает продукт?

Также есть ли у кого-нибудь хорошие ссылки для чтения относительно письменных тестов/TDD. Может быть, через CRUD/Repositories, так как это похоже на сценарий с курицей и яйцом.

+0

http://www.amazon.com/Test-Driven-Development-Kent-Beck/dp/0321146530/ref=sr_1_1?s=books&ie=UTF8&qid=1325797578&sr=1-1 – Bueller

ответ

3

Похоже, что в вашей ценовой логике есть два элемента.

  1. Ценовая матрица для сопоставления структуры данных (размер, количество отсечки) по ценам.

  2. Функция, которая принимает ценовую матрицу и экземпляр Product и возвращает цену.

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

+0

Примите это как ответ, хотя все ответы помогли моему движению мыслей, спасибо всем. – MPD

0

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

1

Модульное тестирование - это тестирование наименьшей возможной единицы кода, поэтому в этом случае вам все равно, что метод возвращает ожидаемую цену. Если метод получает данные о ценах извне, то он выполняет две функции: получение данных о ценах и расчет цены. Вы обнаружили нарушение SRP.

разделить его на два метода: один для получить данные о ценах и один в цены CALCulate (используя ценовые данные, передаваемые в качестве параметра).

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

GetPrice(Product p, string size, int quantity, sometype pricingData) 

Теперь вы можете проверить расчет в изоляции:

var pricingData = GetKnownPricingData(); // get a set of dummy pricing data 
var result = Pricer.GetPrice(product, size, quantity, pricingData); 

Затем вы можете проверить для ожидаемого результата на основе известных данных ценообразования.

+0

Благодаря Igby помог прояснить мои мысли. – MPD

+0

Вы хотите разделить проблемы настолько, насколько сможете, не доходя до точки уменьшения прибыли. Можно переопределить принципы хорошего дизайна до такой степени, что вы в конечном итоге усложняете архитектуру и стираете выгоду, которую ищете. Если он чувствует себя аккуратнее и не слишком скрыт, чтобы вводить данные о ценах из-за пределов, сделайте это. Это, безусловно, общий шаблон дизайна. Но всегда взвешивайте выгоду против стоимости и сохраняйте [YAGNI] (http://en.wikipedia.org/wiki/YAGNI). –

1

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

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

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

Вы можете проверить это: Размер X и Y Количества должны дать Цену З. подключите в значениях X и Y и убедитесь, что вы получите ожидаемое значение для Z.

Что делать, если нет значения для X или Y? Вы терпите неудачу? Вернуться 0? Эти вещи вы можете проверить.

Смежные вопросы