API para gerar respostas do servidor com quaisquer códigos de status

Olá, Habr! Enquanto trabalhava em uma biblioteca de wrapper da API REST, tive um problema. Para testar o processamento de códigos de resposta do servidor errados (400, 500, 403, etc.), é necessário criar artificialmente condições no servidor para receber os códigos correspondentes. Com um servidor configurado corretamente, por exemplo, não é fácil obter um erro 500. Mas de alguma forma é necessário testar as funções do manipulador de erros. Eu escrevi uma pequena API que gera respostas erradas do servidor - httpme.tk



Como se inscrever no teste?



Por exemplo, existe um código como este ( python3 ):



from requests import session as requests_session

session = requests_session()
session.hooks = {
    'response': lambda r, *args, **kwargs: raise AccessError(' , ..     ') if r.status_code == 403  else pass
}

class AccessError(Exception):
    """ ''  """
    pass

def getter(url):
    return session.get(url)


Em suma, o código contém uma função que retorna uma resposta do servidor a uma solicitação GET para um determinado URL; se ocorrer um erro 403 como resultado da solicitação, uma exceção de módulo interno será gerada AccessError.



Este código precisa ser testado e depurado. Não é fácil criar manualmente condições para o erro 403 e ainda mais, por exemplo, 500 (o servidor funciona muito bem). O testador não se importa em que condições o servidor emitirá um erro 403: ele não está testando a API em si (por exemplo), mas a função que a chama. Portanto, para testar o lançamento de uma exceção com um código de status 403, ele pode fazer assim ( python3 + pytest ):



import pytest
from mymodule import 

def test_forbidden():
    with pytest.raises(AccessError):
        getter('http://httpme.tk/403')


Como usar?



Muito simples. Envie uma solicitação GET para o servidor em http://httpme.tk/<status_code>. Por exemplo, assim ( cURL ):



curl -G http://httpme.tk/500


Ou assim ( python3 ):



from requests import get

get('http://httpme.tk/408')  # <Response [408]>


O que tem dentro?



E dentro está um pequeno aplicativo Flask que chama uma função abort(status_code)em cada solicitação.



Link para GitHub



Isso é tudo!



É interessante ouvir a avaliação da comunidade sobre a utilidade deste serviço.




All Articles