Pergunta

Eu estou encarregado de escrever testes de unidade para uma suíte de software de rede escrito em python. unidades escrevendo para os construtores de mensagens e outros métodos estáticos é muito simples, mas eu bater em uma parede, quando se trata de escrever alguns testes para tópicos em loop de rede.

Por exemplo: O servidor que conecta a poderia ser em qualquer porta, e eu quero ser capaz de testar a capacidade de conectar-se a várias portas (em sequência, não em paralelo) sem realmente ter que executar diversos servidores. O que é uma boa maneira de abordar isso? Talvez fazer construção servidor e parte destruição do teste? Algo me diz que deve haver uma resposta mais simples que escapa-me.

Eu tenho que imaginar existem métodos para unidade de testes tópicos em rede, mas eu não consigo encontrar nenhum.

Foi útil?

Solução

Gostaria de tentar introduzir uma fábrica em seu código existente que pretende criar objetos de soquete. Então, em uma passagem de teste em uma fábrica de simulação que cria soquetes simulados que apenas fingir que eles conectado a um servidor (ou não para casos de erro, que você também quiser testar, não é?) E registrar o tráfego de mensagens para provar que seu código tem usado as portas certas para conectar-se o direito tipos de servidores.

Tente não tópicos de uso ainda, para simplificar o teste.

Outras dicas

Depende de como seu software de rede é em camadas e como detalhado você quer que seus testes para ser, mas é certamente possível em alguns cenários para fazer parte do teste de configuração do servidor e lágrima-down. Por exemplo, quando eu estava trabalhando no pacote de logging do Python (antes de se tornar parte do Python), eu tive um teste (eu não uso pyunit / unittest - era apenas um script ad-hoc), que despediu-se (em um teste) quatro servidores para escutar em TCP, UDP, HTTP e HTTP / portas SOAP e, em seguida, enviado o tráfego de rede para eles. Se você estiver interessado, a distribuição é aqui eo script de teste relevante no arquivo é olhar para log_test.py. O pacote de registro Python tem, naturalmente, vir alguma forma desde então, mas o pacote antigo ainda está por aí para uso com versões do Python <2,3 e> = 1.5.2.

Eu tenho alguns casos de teste que executam um servidor na configuração e fechá-lo no tearDown. Eu não sei se é muito elegante maneira de fazê-lo, mas ele funciona por mim.

Estou feliz por tê-lo e isso me ajuda muito.

Se a inicialização do servidor é muito longo, uma alternativa seria a de automatizá-lo com formiga. formiga correria / parar o servidor antes / depois de executar os testes.

aqui para tutorial muito interessante sobre formigas e python

Você precisaria criar soquetes simulados. A maneira exata de fazer isso vai depender de como você criar soquetes e criar um gerador de tomada seria uma boa ideia. Você também pode usar uma biblioteca de zombaria como pymox para tornar a sua vida mais fácil. Ele também pode, eventualmente, eliminar a necessidade de criar um gerador de tomada apenas para o único propósito de teste.

Usando pymox, você faria algo assim:

def test_connect(self):
    m = mox.Mox()
    m.StubOutWithMock(socket, 'socket')
    socket_mock = m.MockAnything()
    m.socket.socket(socket.AF_INET, socket.SOCK_STREAM).AndReturn(socket_mock)
    socket_mock.connect(('test_server1', 80))
    socket_mock.connect(('test_server2', 81))
    socket_mock.connect(('test_server3', 82))

    m.ReplayAll()
    code_to_be_tested()
    m.VerifyAll()
    m.UnsetStubs()
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top