Pergunta

Este post começou como "O que alguns padrões comuns na unidade de testar código multi-threaded?", Mas eu encontrei alguns outros discussões no SO que em geral concordaram que "é difícil (TM)" e "Depende (TM)". Então eu pensei que a redução do âmbito da questão seria mais útil.

Fundo : Estamos implementando um simples programador que lhe dá uma maneira de registrar retornos de chamada quando iniciar e parar os trabalhos e, claro, configure a frequência de agendamento. Atualmente, nós estamos fazendo um invólucro leve em torno java.util.Timer.

Aspectos :

  • Eu não encontrei uma maneira de testar este programador, baseando-se em interfaces única públicos (algo como addJob(jobSchedule, jobArgs,jobListener), removeJob(jobId)).

  • Como faço para cronometrar o fato de que o trabalho foi chamado de acordo com a programação especificada?

Foi útil?

Solução

você poderia usar um objeto gravador que o registro da ordem, horários e outras coisas úteis em cada unidade de teste do seu programador. O teste é simples:

  1. criar um objeto gravador
  2. configurar a programação
  3. executar um teste de unidade
  4. Verifique se objeto gravador é "compatível" com o calendário

Outras dicas

Uma coisa também para lembrar é que você não precisa de teste que Timer funciona. Você pode escrever uma versão simulada de Timer (estendendo a classe ou usando EasyMock ) que simplesmente verifica se você estão chamando-o corretamente, possivelmente, até mesmo substituindo o suficiente para que você não precisa de fios em tudo. Neste caso, que pode ser mais trabalho do que o necessário se o seu ouvinte trabalho tem callbacks o suficiente para acompanhar o programador.

A outra coisa importante a lembrar é que ao testar o programador, trabalhos de uso personalizados que acompanhar como o programador está trabalhando; ao testar tarefas agendadas, chamar os retornos de chamada directamente e não através do programador. Você pode ter um teste de integração de nível superior que verifica os dois juntos, dependendo do sistema.

Há muitos modos de falha que tal programador poderia exibem, e cada um seria provavelmente exigir o seu próprio caso de teste. Esses casos de teste são susceptíveis de ser muito diferente, por isso "depende".

Para testar software concorrente em Java, em geral, eu recomendo esta apresentação de JavaOne 2007: Testing Concurrent Software .

Para testar que um programador deve executar trabalhos de acordo precisas para sua programação, eu criar uma abstração do próprio tempo. Eu tenho feito algo semelhante em um dos meus projetos, onde tenho uma interface Time ou Relógio. A implementação padrão será MillisecondTime, mas durante os testes eu vou ligá-lo com um TickTime. Esta implementação irá permitir que o meu teste de unidade para o controle quando os avanços de tempo e por quanto.

Desta forma, você poderia escrever um teste em que um trabalho é agendado para ser executado uma vez a cada 10 carrapato. Em seguida, o teste apenas avança o contador de escala e verificações para se certificar de que os trabalhos executados nos carrapatos corretas.

Um par de maneiras de código simultâneo de teste.

  • executar o mesmo código muitas vezes sob carga, alguns erros aparecem apenas ocasionalmente, mas pode aparecer de forma consistente, se executado repetidamente.
  • loja os resultados de diferentes segmentos / postos de trabalho em uma coleção como um BlockingQueue. Isso permitirá que você para verificar os resultados do segmento atual e terminar em tempo hábil (sem declarações sono arbitrária feias)

Se você está encontrando testar a simultaneidade difícil considerar refatoração seus objetos / componentes para torná-los mais fáceis de teste.

Se os delegados Scheduler para um Executor ou ExecutorService para executar as tarefas, você poderia usar Dependency Injection para remover uma dependência direta do tipo de Executor, e usar um simples único segmento Executor para teste de muitas das funcionalidades do seu programador sem a complicação de verdadeiramente multi-threaded código. Uma vez que você tem aqueles testes depurado, você pode mover-se sobre o mais difícil, mas agora substancialmente reduzido em magnitude, tarefa de testar thread-segurança.

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