Должен ли я проверить интерфейс и все объекты, которые его реализуют - PullRequest
1 голос
/ 29 ноября 2010

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

Ответы [ 5 ]

2 голосов
/ 29 ноября 2010

Обычно тестирование должно затрагивать все (исполняемые) строки кода.Если вы реализуете интерфейс, это делает его намного проще, поскольку вы можете кодировать тесты, которые формируют «контракт» интерфейса, и теперь тесты применяются ко всем разработчикам интерфейса.

Это обеспечивает согласованность для всехреализаторы.Если вы столкнулись с ситуацией, когда разработчики ведут себя по-разному (например, NullReferenceException и ArgumentNullException), вы можете добавить тесты, указывающие, что является «правильным», а что - неправильным.Это приведет к меньшему количеству сюрпризов в будущем.

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

Конечно, есть реализацияконкретные вещи, которые можно протестировать только на конкретном разработчике (например, «Был ли файл записан?» или «Была ли запись исправлена?»).Эти вещи должны быть предоставлены через переопределение или лямбду в набор тестов интерфейса.

1 голос
/ 29 ноября 2010

По моему опыту, вы просто тестируете конкретные классы и их взаимодействие с интерфейсами.

То есть, если у вас есть конкретный класс B, реализующий A, вы просто тестируете B и его взаимодействие с другими объектами, на которые он ссылается.

0 голосов
/ 29 ноября 2010

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

Interface A
{
   String A1();
   String A2();
}

public class B:A
{
   String A1(){return "A1"}
   String A2(){return "A2"}
}

public class testB
{
   public void B_Can_Return_A1()
   {
      A b=new B();
      Assert.True(b.A1=="A1")
   }
}

Но если вы удаляете метод из интерфейса, на который все еще полагаются конкретные реализации, то вам не следует удалять эту часть интерфейса?

Это правда, но это все равно должно применяться в тестах, то есть проверенных. интерфейсы (должны) играть большую роль в разработке, и изменения могут создать огромные проблемы в будущем. Если объект реализует интерфейс, я думаю, это то, как он должен быть протестирован или что-то подобное.

Пожалуйста, прокомментируйте это.

0 голосов
/ 29 ноября 2010

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

Если вы оказались в ситуации, когда вам необходимо частично реализовать интерфейс, вы можете сделать то, что я делаю.Например, скажем, у меня есть интерфейс элемента.Это я называю IItem и имеет весь интерфейс.Затем я объявляю Item, который является частичной реализацией интерфейса для общего кода, а затем ItemA, ItemB и т. Д. Для специализаций Item.

0 голосов
/ 29 ноября 2010

да, вы должны стремиться получить 100% покрытие кода при тестировании

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