Uma maneira sistemática de testar APIs RESTful com curl?


14

Percebi durante o teste de integração que, na verdade, trabalho em casos de uso recorrentes com APIs repousantes (ou em interfaces HTTP em geral) verifico aqui e ali com o bash + cURL.

Começa a parecer bastante bagunçado e fica mais difícil de manter. Por que entregar bagunça?

Os casos de uso típicos são:

  • Verifique se um URL retorna o código de resposta http, por exemplo, 200
  • Verifique se o tipo de conteúdo corresponde a algum MIME necessário nesse caso
  • Verifique se o conteúdo retornado corresponde a algum padrão ou passa em um procedimento de validação abstrata

O que encontrei até agora e considero uma opção viável sem reinventar a roda é:

  • experimente o PyCurl - na esperança de implementar totalmente todas as opções de cURL esp. proxy, mas também outros switches que podem ser necessários
  • use o testng de unidade embutido do Python

Então, eu poderia ter, por exemplo, um teste de unidade por serviço que gostaria de verificar:

import unittest, pycurl

class TestService (unittest.TestCase):

    def test_1(self):
        self.assertEqual(pycurl.returncode("some_url"), 200)

    def test_2(self):
        self.assertTrue(pycurl.response("some_url").matches ("xxx") )

    def test_3(self):
        self.assertTrue (pycurl.ContentType("some_url").equal("xxx"))

if __name__ == '__main__':
    unittest.main()

Isso faz sentido ou existe um conjunto de ferramentas de alto nível (mas não muito complexo para captar e integrar)?


1
Qual é o código da API? há vários sistemas de teste de integração e a escolha de um geralmente é feita no mesmo idioma do código sendo testado, para que o mesmo desenvolvedor possa atualizar os dois.
Tensibai

isso pode ser heterogeneuos e eu não tenho nenhum controle
Peter Muryshkin

1
Então, qual é o idioma com o qual sua equipe se sente mais confortável? Todas as ferramentas farão para testar esse tipo de coisa, desde bash + curl até capistrano pós implantar ganchos ...
Tensibai

2
No ecossistema do chef, você encontrará inspec que pode responder à sua pergunta com o recurso http , mas é baseado em serverspec / rspec, por isso é mais um mundo ruby ​​do que python, mas vale a pena tentar.
Tensibai

2
Eu tenho trabalhado em algum código python para fazer chamadas REST usando a biblioteca de solicitações do Python . Ele permitirá que você adicione qualquer cabeçalho que desejar e suporte o suporte a proxy HTTP (s), por isso deve ser capaz de suportar todos os recursos do curl. Você pode emprestar meu código para suas necessidades ou usá-lo como exemplo, se for útil.
James Shewey

Respostas:


7

Você pode olhar para ferramentas como o Postman, que se concentra no teste de APIs REST com JavaScript - ele tem alguns recursos interessantes, mas você perde o uso do Python.

Em vez disso, sugiro examinar os plugins relacionados ao REST para pytest , uma estrutura de teste Python que simplifica seu código de teste, enquanto ainda executa testes escritos usando unittest.

  • Por exemplo, escrever testes parametrizados evita o código de teste duplicado chato e propenso a erros.

O Pytest possui um enorme conjunto de plugins que simplificam várias tarefas, incluindo:

  • Tavern , especializada em testes de APIs REST e parece altamente relevante aqui - como "Testes de unidade do Postman for Python".

  • pytest-curl-report - ao testar com a requestsbiblioteca, imprimirá um curlcomando que você pode usar para reproduzir o erro do shell.

  • Testinfra - concentra-se no teste do servidor (por exemplo, estado dos pacotes do sistema operacional, arquivos, processos, etc., geralmente testados em servidores remotos) - é altamente recomendável se você também precisar desse tipo, por exemplo, para testar o código Ansible.

    • Para quem usa Puppet ou Chef, o Testinfra é semelhante ao Beaker (com RSpec), ServerSpec ou InSpec.

Se você não gosta do Tavern, é claro que pode usá pycurl-lo pytest, o que facilita o diagnóstico exato do que falhou. Este exemplo do site pytest-curl-report usa apenas recursos genéricos do pytest:

$ py.test test.py
============================= test session starts ==============================
platform darwin -- Python 2.7.9 -- py-1.4.27 -- pytest-2.6.4
plugins: curl-report, httpbin, cache, capturelog, cov, flakes, pep8
collected 1 items

test.py F

=================================== FAILURES ===================================
______________________________ test_requests_get _______________________________

    def test_requests_get():
        r = requests.get('http://httpbin.org/get')
>       assert False
E       assert False

test.py:7: AssertionError

O Pytest permite escrever todos os testes de forma simples asserte, opcionalmente, incluir uma mensagem útil como parte da saída. Por exemplo, um de seus testes pode ser escrito:

def test_2():
    assert pycurl.response("some_url").matches ("xxx"), "xxx not found in response"
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.