Pergunta

Estrutura .NET:2.0 Idioma preferido:C#

Sou novo no TDD (Desenvolvimento Orientado a Testes).

Em primeiro lugar, é possível testar a unidade do serviço do Windows?

A classe de serviço do Windows é derivada de ServiceBase, que possui métodos substituíveis,

  1. No início
  2. Ao parar

Como posso fazer com que esses métodos sejam chamados como se o teste de unidade fosse um serviço real que chama esses métodos na ordem correta?

Neste ponto, estou fazendo um teste de unidade?ou um teste de integração?

Eu olhei para a questão do serviço WCF, mas não fez nenhum sentido para mim, já que nunca lidei com o serviço WCF.

Foi útil?

Solução

Eu provavelmente recomendaria projetar seu aplicativo para que as substituições "OnStart" e "OnStop" no serviço do Windows apenas chamem métodos em um assembly de biblioteca de classes.Dessa forma, você pode automatizar testes de unidade em relação aos métodos da biblioteca de classes, e o design também abstrai sua lógica de negócios da implementação de um serviço do Windows.

Nesse cenário, testar os próprios métodos "OnStart" e "OnStop" em um contexto de serviço do Windows seria um teste de integração, e não algo que você automatizaria.

Outras dicas

Eu testei a unidade dos serviços do Windows, não testando o serviço diretamente, mas sim testando o que o serviço faz.

Normalmente eu crio um assembly para o serviço e outro para o que o serviço faz.Então escrevo testes de unidade no segundo assembly.

O bom dessa abordagem é que seu serviço é muito limitado.Basicamente, tudo o que ele faz é chamar métodos para fazer o trabalho certo na hora certa.Sua outra assembléia contém toda a essência do trabalho que seu serviço pretende realizar.Isso torna muito fácil testar e reutilizar ou modificar conforme necessário.

eu começaria aqui.Mostra como iniciar e parar serviços em C#

Uma amostra para começar é

public static void StartService(string serviceName, int timeoutMilliseconds)
{
  ServiceController service = new ServiceController(serviceName);
  try
  {
    TimeSpan timeout = TimeSpan.FromMilliseconds(timeoutMilliseconds);

    service.Start();
    service.WaitForStatus(ServiceControllerStatus.Running, timeout);
  }
  catch
  {
    // ...
  }
}

Também testei serviços principalmente por meio de aplicativo de console, simulando o que o serviço faria.Dessa forma, meu teste unitário é completamente automatizado.

Eu usaria a classe de serviço do Windows (aquela que você executa quando inicia/interrompe o serviço) como um proxy para o seu sistema real.Não vejo como o código por trás do seu serviço deva ser diferente de qualquer outra programação.Os métodos onStart e onStop são simplesmente eventos disparados, como apertar um botão em uma GUI.

Portanto, sua classe de serviço do Windows é uma classe muito fina, comparável a um formulário do Windows.Ele chama sua lógica de negócios/lógica de domínio, que então faz o que deveria fazer.Tudo o que você precisa fazer é garantir que os métodos que você está chamando em onStart e onStop estejam funcionando como deveriam.Pelo menos é isso que eu faria ;-)

Projetar para teste é uma boa estratégia, como muitas das respostas apontam, recomendando que seu OnStart e OnStop os métodos permanecem muito limitados ao delegar para objetos de domínio.

No entanto, se seus testes precisarem executar os métodos de serviço por algum motivo, você poderá usar um código como este para chamá-los de dentro de um método de teste (chamando OnStart neste exemplo):

serviceInstance.GetType().InvokeMember("OnStart", BindingFlags.InvokeMethod | BindingFlags.NonPublic | BindingFlags.Instance, null, serviceInstance, new object[] {new string[] {}});

Serviço de janela de teste em energia automática desligada, desligar condições de teste do serviço de teste quando a rede desconectada, opção de serviço de janela de teste conectada automática, manual etc.

Guy é provavelmente a melhor resposta.

De qualquer forma, se você realmente quiser, basta invocar no teste de unidade esses dois métodos, conforme descrito por Documentação do MSDN mas, como eles estão protegidos, você precisará usar o Reflection.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top