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

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

Мы обернули эти библиотеки DLL тонким слоем службы WCF, который затем используется нашими клиентами.

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

Итак, я не понимаю, что именно тестировать и как.


person Esteban Araya    schedule 01.09.2008    source источник
comment
Нет необходимости в UNIT-тестировании ваших WCF-сервисов, вполне нормально писать тесты INTEGRATION.   -  person Michael Freidgeim    schedule 23.07.2013
comment
Избегайте использования моков, юнит - это не класс без какой-либо внешней зависимости. Единица - это сквозной фрагмент бизнес-логики, даже если он включает в себя базу данных. Вы всегда можете использовать оперативную память или, что еще лучше, встроенную базу данных, такую ​​как BerkeleyDB, для тестирования. Вам не нужна настоящая база данных, находящаяся на другом компьютере. Таким образом, вы можете эффективно протестировать свое устройство без излишних издевательств.   -  person Narendra Pathai    schedule 16.11.2014


Ответы (3)


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

person Eugene Yokota    schedule 01.09.2008

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

Например, в сервисе ниже я разбиваю свой репозиторий доступа к данным, используя «Внедрение зависимостей бедняков».

Public Class ProductService
    Implements IProductService

    Private mRepository As IProductRepository

    Public Sub New()
        mRepository = New ProductRepository()
    End Sub

    Public Sub New(ByVal repository As IProductRepository)
        mRepository = repository
    End Sub

    Public Function GetProducts() As System.Collections.Generic.List(Of Product) Implements IProductService.GetProducts
        Return mRepository.GetProducts()
    End Function
End Class

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

<TestMethod()> _
Public Sub ShouldPopulateProductsListOnViewLoadWhenPostBackIsFalse()
    mMockery = New MockRepository()
    mView = DirectCast(mMockery.Stub(Of IProductView)(), IProductView)
    mProductService = DirectCast(mMockery.DynamicMock(Of IProductService)(), IProductService)
    mPresenter = New ProductPresenter(mView, mProductService)
    Dim ProductList As New List(Of Product)()
    ProductList.Add(New Product)
    Using mMockery.Record()
        SetupResult.For(mView.PageIsPostBack).Return(False).Repeat.Once()
        Expect.Call(mProductService.GetProducts()).Return(ProductList).Repeat.Once()
    End Using
    Using mMockery.Playback()
        mPresenter.OnViewLoad()
    End Using
    'Verify that we hit the service dependency during the method when postback is false
    Assert.AreEqual(1, mView.Products.Count)
    mMockery.VerifyAll()
End Sub
person Toran Billups    schedule 01.09.2008
comment
Из martinfowler.com/bliki/InterfaceImplementationPair.html Использование интерфейсов, когда вы не собираетесь использовать несколько реализаций - это дополнительные усилия, чтобы все синхронизировать. Кроме того, он скрывает случаи, когда вы действительно предоставляете несколько реализаций. См. Другие примеры в stackoverflow.com/questions/90851/ - person Michael Freidgeim; 23.07.2013

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

Если у вас есть тесты, которые доходят до базы данных, тогда отлично! Так даже лучше. Это не «настоящий модульный тест»? Без проблем.

person Jan Soltis    schedule 01.09.2008