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 backup.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 = "backup.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
 
								