2009-10-08 1 views
3

У меня есть класс (из многих), который обладает свойствами. У некоторых в них есть логика, а у некоторых нет. Предполагая, что я хочу проверить эти свойства, как мне это сделать?Как (стратегия) для свойств тестового объекта (get/set) в стиле BDD?

В последнее время меня интересует стиль BDD для создания модульных тестов.

см. here и here.

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

Вот мой вопрос. Если у SUT есть 20 свойств, тогда я создаю 20 наблюдений/тестов? Может быть, если один из свойств содержит более интересную логику, я думаю.

[Observation] 
public void should_load_FirstName() 
{ 
    Assert.Equals<string>("John", SUT.FirstName); 
} 

[Observation] 
public void should_load_LastName() 
{ 
    Assert.Equals<string>("Doe", SUT.LastName); 
} 

[Observation] 
public void should_load_FullName() 
{ 
    Assert.Equals<string>("John Doe", SUT.FullName); 
} 

Но было бы лучше, если бы агрегированные простые в одном наблюдении?

[Observation] 
public void should_load_properties() 
{ 
    Assert.Equals<string>("John", SUT.FirstName); 
    Assert.Equals<string>("Doe", SUT.LastName); 
    Assert.Equals<string>("John Doe", SUT.FullName); 
} 

Или что, если я использовал пользовательский атрибут (который может быть применен несколько раз к методу). Так что я могу возможно сделать, что-то вроде:

[Observation(PropertyName="FirstName", PropertyValue="John")] 
[Observation(PropertyName="LastName", PropertyValue="Doe")] 
[Observation(PropertyName="FullName", PropertyValue="John Doe")] 
public void should_load_properties() 
{ 
} 

ответ

4

В общем, вы должны стремиться после того, как только один логическое утверждения на тест. Отличная книга xUnit Test Patterns содержит хорошее обсуждение об этом, но главным моментом является то, что она облегчает понимание того, где происходит нарушение, если есть только одна причина, по которой тест может потерпеть неудачу. Это, вероятно, немного более релевантное для регрессионного тестирования, чем BDD, хотя ...

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

Более центральный принцип xDD (TDD, BDD, любой) заключается в том, что тесты должны действовать как Исполняемые спецификации. Другими словами, это должно быть сразу же очевидно, если вы посмотрите на тест не только , который тестируется, но и , почему ожидаемое значение такое, как есть. В ваших примерах не совсем понятно, почему SUT.FirstName ожидается как «Джон», а не, скажем, «Джейн».

Если это вообще возможно, я бы написал эти тесты для использования Derived Values вместо жестко заданных значений.

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

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

Такие тесты могут быть инкапсулированы в многоразовый тестовый код, который инкапсулирует общие тестовые идиомы. Я сейчас работаю над library that can do just that.

+0

Поблагодарить за совет. Еще раз, когда ваши сообщения в блоге CallContext помогли мне многое! Я следил за ссылкой на Derived Values ​​на сайте Meszaros и читал об этом (после вашего). Я не уверен, что я бы сделал все возможное, чтобы реализовать его, как вы делали для своего Обратного примера. Я думаю, что у меня есть переменная, expectedResult рядом со входом, а затем просто используйте буквальное значение. В моем случае выше, я слышу вас - это не очевидно, но я загружаю тестовые данные с локального диска, чтобы создать SUT (это тест на прием/взаимодействие). Мне нужно найти лучший способ указать входные значения ... –

0

Посмотрите на другой синтаксис SubSpec (пример [Specification]) - в этом случае каждый из Assert s в конце представляет собой отдельное выполнение теста.Я изначально отказался от синтаксиса как злоупотребление лямбдой, но, как сейчас, я использовал его некоторое время.

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