Pergunta

Eu sou novo para testes de unidade e nUnit (2,48). Eu gostaria de escrever um método de teste onde o caso de falha é que ele impasses. Isso é possível? Obviamente nUnit não sabe por padrão quanto tempo o método deve tomar para executar, então eu teria que escrever código para fazer o trabalho em um segmento separado e, em seguida, abortá-lo e lançar e exceção se demorou mais tempo do que algum tempo eu definir? Existe uma maneira melhor de fazer isso?

Obrigado

Foi útil?

Solução

É possível, mas isso pode não ser a melhor coisa a fazer. Os testes de unidade não são realmente adequado para testar o comportamento de concorrência, infelizmente não existem muitos métodos de ensaio que são adequados.

NUnit does not fazer qualquer coisa com threads. Você poderia escrever testes que começam diversos tópicos e, em seguida, testar a sua interação. Mas estes iria começar a olhar mais como testes de integração do que testes de unidade.

Outro problema é que o comportamento impasse normalmente depende dos tópicos ordem são programadas em. Portanto, seria difícil escrever um teste conclusivo para testar um determinado problema de bloqueio, porque você não tem nenhum controle sobre o agendamento de segmento, este é feito pelo sistema operacional. Você pode acabar com os testes que às vezes falham em vários núcleos processadores, mas sempre têm sucesso em processadores de núcleo único.

Outras dicas

Bem, é certamente possível teste para um impasse, executando o código em outro segmento e ver se ele retorna em tempo hábil. Está aqui algum exemplo de código (muito básico):

[TestFixture]
public class DeadlockTests
{
    [Test]
    public void TestForDeadlock()
    {
        Thread thread = new Thread(ThreadFunction);
        thread.Start();
        if (!thread.Join(5000))
        {
            Assert.Fail("Deadlock detected");
        }
    }

    private void ThreadFunction()
    {
        // do something that causes a deadlock here
        Thread.Sleep(10000);
    }
}

Eu não gostaria de dizer que esta é a "melhor maneira", mas é um que eu achei útil em algumas ocasiões.

detecção de bloqueio é equivalente ao suspensão problema , e, por conseguinte, actualmente não pode ser resolvido, no caso geral .

Se você tem um problema específico para se proteger contra, pode haver cortes específicos para obter, pelo menos, um mínimo de segurança. Seja embora ciente de que isso só pode ser um hack e nunca 100%. Por exemplo, um tal teste pode sempre passar na máquina de desenvolvimento, mas nunca na máquina de produção.

Dê uma olhada no Projeto Microsoft chamado "Chess". Ele é projetado para encontrar bugs concordou http://research.microsoft.com/en- us / projetos / xadrez /

Para teste para um impasse, você deve implementar um gráfico de estado e um cheque de ciclos no gráfico estado atual no teste de unidade. O gráfico de estado consiste nos Recursos como nós e as dependências como arestas. Eu não tenho idéia da implementação de tal coisa, mas isso é a teoria.

testes de teste de unidade A para a correção da e saída de dados (principalmente para o ponto mais tarde) e não para a correção do fluxo de execução da aplicação.

A idéia de Mark Heath parece razoável, mas é academicamente errado.

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