O uso exclusivo de Stubs para testar a comunicação entre serviços é frágil. Ao deixarmos de emular o ambiente de produção não estamos garantido devidamente que a comunicação ocorrerá.
Testes de contrato é uma excelente maneira de reduzir este problema. Seu principal foco é reforçar os pontos de integração entre serviços executando, de maneira isolada, ambos os pontos da integração.
Um contrato é composto por informações relacionadas a comunicação que desejamos produzir. Por exemplo, quais são os dados de solicitação e de resposta e qual é o motivo desta comunicação existir.
Durante a sua definição é possível reforçar o alinhamento de proposito. pois somente através dele é possível a autonomia de atuação de ambos os times durante o desenvolvimento. Também possibilita o levantamento de possíveis problemas de design ou ausência de algum tipo de informação.
Mas, apesar de parecer, não estamos defendendo o uso da burocracia para resolver este problema. Já é possível utilizar ferramentas que auxiliam o desenvolvimento de contratos e seus testes de maneira mais eficiente.
// Test for Consumers. public async Task Get_User_Info_Async_Should_Be_Ok() { // Arrange int userId = 1; _mockProviderService .Given("UserId 1 for user eximia.co") .UponReceiving("Should return aditional info about user with id equals 1") .With(new ProviderServiceRequest { Method = HttpVerb.Get, Path = $"/api/Users/{userId}", Headers = new Dictionary { { "Accept", "application/json" }, }, }) .WillRespondWith(new ProviderServiceResponse { Status = 200, Headers = new Dictionary { { "Content-Type", "application/json; charset=utf-8" } }, Body = new { userName = "eximia.co", userId = 1, } }); var httpClient = new HttpClient() { BaseAddress = new Uri(_mockProviderServiceBaseUri) }; var consumer = new UserAdapter(httpClient); // Act await consumer.GetUserInfoAsync(1); // Assert _mockProviderService.VerifyInteractions(); // Teardown httpClient.Dispose(); }
Podemos observar que os principais benefícios de utilizar Testes de Contrato são a Proteção contra regressões, incremento na comunicação entre os times e aumento da confiança em nossas entregas com baixo custo.
Communication works for those who work at it. – John Powell