Pergunta

Todas as sugestões sobre como escrever testes de unidade repetíveis para o código que podem ser suscetíveis a bloqueios e condições de corrida?

Agora eu estou inclinado para ignorar testes de unidade e concentrando-se em testes de estresse. O problema com isso é que você pode executar um teste de estresse 5 vezes e ver cinco resultados diferentes.

EDIT:. Eu sei que é provavelmente apenas um sonho, mas se houvesse uma maneira de controlar tópicos individuais e levá-los a executar uma instrução de cada vez, então eu poderia chegar em algum lugar

Foi útil?

Solução

Dê uma olhada TypeMock Racer (ele está em Beta)

Edit: Na verdade Alpha

http://www.typemock.com/Typemock_software_development_tools.html

Outras dicas

Normalmente, é possível forçar prevista race-condições e bloqueios usando coisas como ManualResetEvent para obter cada thread no estado de espera antes de liberá-lo - ou seja, obter thread A ter o bloqueio e esperar por um sinal ... obter segmento B para solicitar o bloqueio, etc ...

No entanto - você pode normalmente escrever um teste para investigar um bug suspeito, para provar quando é fixo e que não re-superfície. Você seria geralmente projetar em torno de condições de corrida (mas testá-los da melhor forma é pragmático).

Eu não acho que olhando para as condições de corrida realmente cai no âmbito dos testes de unidade. Mais-ou-menos, por definição, a única maneira de teste para as condições de corrida é pseudo-aleatoriamente. A menos que você está disposto a ir para o esforço de provar formalmente a justeza de sua estratégia de bloqueio, você vai ter que fazer algum stress-testing.

Você ainda precisa testes de unidade de gravação, para verificar a exactidão dos algoritmos, em vez da estratégia de bloqueio.

Quando o estresse-testar código multi-threaded, você vai querer testar em condições onde você tem uma CPU por thread, onde você tem vários segmentos que compartilham o CPU, e onde você tem mais CPUs do que tópicos (se possível).

Você pode escrever uma classe de bloqueio que detecta potenciais impasses, olhando para a ordenação das operações de bloqueio. Fazemos isso por ter um contexto segmento que todos os bloqueios se registrar quando são adquiridos (pode ser feita uma única opção de depuração).

A ideia é criar um gráfico onde os nodos representa fechaduras e uma borda dirigida entre A e B 'meios de bloqueio A foi sendo realizada quando o bloqueio B foi adquirido'. Deixe o seu programa executado usando cargas normais, em seguida, verificar se há ciclos no gráfico. Um meio de ciclo existe um potencial de impasse, mesmo se o seu código não atingi-lo.

Não é possível pensar em uma boa automatizado maneira, mas o mais próximo que eu vim foi a escrever um teste de unidade que iria 'expor' um impasse estava usando pontos de interrupção, além de um teste de unidade. Eu simplesmente adicionado algumas instruções sobre onde adicionar o ponto de interrupção. Há algum esforço manual envolvido, mas com eles você sempre pode expor sua programação fio pior caso.

Talvez alguém tenha descoberto uma boa maneira de automatizar este tipo de funcionalidade? Eu poderia imaginar executado automaticamente o depurador, quebrando um segmento em uma linha específica, deixando outra executar até que uma condição específica, em seguida, afirmando para o teste de unidade.

Eu já usou atrasos artificiais no código que são acionados por alguns parâmetros do pedido. Por exemplo, um pedido informa o servidor para atraso de gravação entre duas gravações e outro para fazê-las com nenhum atraso entre os dois.

A Mark Bessey escreve, isso só é útil para a criação de repro, não para descobrir o problema.

Você já tentou Corensic Jinx ?

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