Inilah Cara Menguji API Eksternal di Elixir dengan Bypass

API для начинающих. Учимся читать документацию часть 2 [4/5]

API для начинающих. Учимся читать документацию часть 2 [4/5]

Daftar Isi:

Anonim

Kami memprioritaskan prinsip Arsitektur Berorientasi Layanan di Terbalik. Itu berarti kita memiliki komponen kecil yang dapat dipelihara dengan tanggung jawab yang jelas. Mereka berkomunikasi satu sama lain (kebanyakan), melalui Transfer Negara Representasi, atau REST, API.

Ini memberikan fleksibilitas dan telah melayani kami dengan baik kecuali satu aspek penting: Pengujian. Saat menguji, seseorang harus menghindari:

  • Ketergantungan pada layanan eksternal yang berjalan pada mesin yang sama.
  • Tes lambat.

Karena aplikasi secara inheren bergantung pada layanan eksternal, sangat penting untuk memiliki strategi pengujian untuk dependensi tersebut.

Kami baru-baru ini mulai menggunakan Bypass dan saya akan menjelaskan bagaimana kami tiba di sana dan secara khusus bagaimana kami menggunakannya.

Masa lalu

Mock metode dan mengembalikan beberapa contoh data seperti ini:

Itu (dan saya yakin masih) "jalan untuk pergi" di dunia Ruby / Rails. Sayangnya, ini menumbuhkan perilaku buruk seperti yang dijelaskan di sini oleh José Valim.

Kami kemudian mulai menggunakan ExVCR, yang merupakan perpustakaan yang hebat, tetapi memiliki kelemahan yang sama seperti tiruan / bertopik: Ini mendorong kemalasan dan tidak mendorong pemisahan kekhawatiran yang sangat penting untuk API yang didefinisikan dengan baik. ExVCR memungkinkan seseorang untuk "merekam" dan "memutar" data nyata. Sangat mudah untuk diintegrasikan (termasuk beberapa baris dalam pengujian Anda dan semua hal lainnya diurus). Tetapi idealnya Anda harus memikirkan ketergantungan eksternal dalam tes, bukan mengabstraksikannya. Ini mungkin masih menjadi pilihan yang layak untuk skenario ketika perilaku titik akhir harus diuji dengan overhead yang minimal (kami menggunakannya untuk menguji panggilan ke Layanan AWS Amazon seperti S3).

Masukkan Adaptor

Adaptor bekerja dengan baik dan mempromosikan musyawarah seputar kontrak API dan batasan komunikasi yang jelas. Kami masih menggunakan pendekatan ini, terutama ketika Adaptor lebih kompleks (seperti soket JSON-RPC).

Begini tampilan Adaptor:

Tetapi untuk HTTP Endpoints sederhana, Adaptor tampak seperti banyak pekerjaan dan memiliki kelemahan utama: Mereka meninggalkan perpustakaan yang mereka konsumsi dari persamaan pengujian. Jika ada apa pun di perpustakaan HTTP atau JSON yang berubah, tes tidak akan berhasil. Jumlah kode kritis produksi yang tidak diuji oleh pendekatan ini tidak dapat diterima.

Masa Sekarang dan Masa Depan

Bypass memungkinkan kita untuk memulai server web yang sangat sederhana dalam pengujian yang mensimulasikan layanan eksternal yang kita gunakan.

Sekarang, kita dapat menguji seluruh tumpukan, termasuk perpustakaan HTTP, JSON encoding / decoding library, dan mekanisme otentikasi. Bypass README ditulis dengan baik, jadi saya akan luangkan detail implementasi. Namun, kami sedikit mengubah cara kami menggunakannya agar tes tetap singkat dan mudah dibaca:

Pertama, kami terkadang ingin memanggil Facebook ketika tes dijalankan sebagai suite integrasi penuh. Kami melakukan ini secara tidak teratur untuk memastikan API Facebook masih berfungsi sesuai harapan kami. Menambahkan - Termasuk integrasi untuk tes campuran tidak mensimulasikan API tetapi, sebaliknya, memanggil layanan eksternal (baris 5, 7).

Kami eksplisit ketika kami mensimulasikan permintaan ke layanan eksternal sehingga setiap tes yang menggunakan Bypass harus memiliki @ tag facebook_bypass (baris 7).

Akhirnya, handle_fb fungsi (baris 30–39) dipanggil (mengingat bahwa request_path cocok). Saya suka mencocokkan di kepala fungsi karena membuat eksplisit jalur yang kami bereaksi dan memungkinkan kami untuk menentukan fungsi yang berbeda untuk jalur yang berbeda.

Jadi Bypass hanya berjalan pada tes yang ditandai @ tag: pintas dan ketika kita tidak menjalankan suite integrasi kita. Satu hal lagi yang kami lakukan saat mengatur Bypass adalah memungkinkan tag untuk melewati halaman id (baris 8, 20). Jadi di sini adalah bagaimana sebuah tes yang menggunakan Bypass terlihat dengan sangat mulia:

Seperti yang Anda lihat, facebook_bypass tag menyatakan secara eksplisit bahwa kami sedang mensimulasikan API (kecuali kami berada dalam mode integrasi). Ini memungkinkan kami untuk menyampaikan informasi ke API yang disimulasikan, dan sangat mudah untuk menggunakan kembali konfigurasi Bypass yang sama untuk pengujian yang berbeda.

Saya harap ini membantu Anda menguji API eksternal. Anda dapat menemukan saya di Twitter (lihat di bawah) jika Anda memiliki pertanyaan lebih lanjut.