API untuk menghasilkan respons server dengan kode status apa pun

Halo, Habr! Saat mengerjakan pustaka pembungkus REST API, saya mengalami masalah. Untuk menguji pemrosesan kode respons server yang salah (400, 500, 403, dll.), Perlu untuk membuat kondisi secara artifisial di server untuk menerima kode yang sesuai. Dengan server yang dikonfigurasi dengan benar, misalnya, tidak mudah untuk mendapatkan kesalahan 500. Dan bagaimanapun juga, perlu untuk menguji fungsi penanganan kesalahan. Saya menulis API kecil yang menghasilkan respons server yang salah - httpme.tk



Bagaimana cara mendaftar dalam pengujian?



Misalnya ada kode seperti ini ( 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)


Singkatnya, kode berisi fungsi yang mengembalikan respons server ke permintaan GET untuk URL tertentu; jika kesalahan 403 terjadi sebagai akibat dari permintaan tersebut, pengecualian modul internal akan dimunculkan AccessError.



Kode ini perlu diuji dan di-debug. Tidak mudah membuat kondisi untuk kesalahan 403 secara manual, dan terlebih lagi, misalnya, 500 (server bekerja terlalu baik). Penguji tidak peduli dalam kondisi apa server akan mengeluarkan kesalahan 403: dia menguji bukan API itu sendiri (misalnya), tetapi fungsi yang memanggilnya. Jadi untuk menguji melempar pengecualian dengan kode status 403, itu bisa dilakukan seperti ini ( python3 + pytest ):



import pytest
from mymodule import 

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


Cara Penggunaan?



Sangat sederhana. Kirim permintaan GET ke server di http://httpme.tk/<status_code>. Misalnya seperti ini ( cURL ):



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


Atau seperti ini ( python3 ):



from requests import get

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


Apa isinya?



Dan di dalamnya ada aplikasi Flask kecil yang memanggil sebuah fungsi abort(status_code)pada setiap permintaan.



Tautkan ke GitHub



Itu saja!



Menarik untuk mendengar penilaian masyarakat terhadap kegunaan layanan ini.




All Articles