Bagaimana cara mensimulasikan REST API?

13

Saya sedang mengerjakan proyek baru yang akan meminta data dari API REST pihak ke-3. Ini untuk umpan data olahraga waktu nyata, jadi umpan itu hanya berfungsi saat permainan benar-benar terjadi.

Meskipun pihak ke-3 memberikan dokumentasi yang baik (XSD, dll), mereka tidak memiliki cara untuk mensimulasikan gim yang terjadi, dan untuk menguji kode yang saya tulis terhadap API ini, saya harus menunggu gim yang sebenarnya terjadi.

Satu-satunya jalan saya adalah menulis kode untuk mensimulasikan permainan saya sendiri, tetapi sepertinya banyak pekerjaan. Bagaimana Anda mendekati ini?

dferraro
sumber
5
Seberapa rumit data ini? Dalam kebanyakan kasus, saya hanya akan mematikan objek yang menangani data incomming. Baik menggunakan data dari sesi permainan sebelumnya (mungkin terlalu rumit untuk pengujian) atau menganalisis data dan mengekstrak jenis informasi yang relevan. Simpan ini dalam file dan beri makan ke program utama Anda seolah-olah itu berasal dari sumber asli.
thorsten müller
2
Kasing penggunaan sempurna untuk object mock objecthttp: //en.wikipedia.org/wiki/Mock_object
kevin cline

Jawaban:

15

Ini adalah kasus penggunaan yang sempurna untuk objek tiruan . Ada perpustakaan mengejek untuk setiap bahasa populer. Anda ingin mengejek objek yang menyediakan respons layanan REST untuk mengembalikan data pengujian. Anda dapat membuat sendiri data pengujian atau mengumpulkannya dari panggilan sebelumnya ke sistem langsung.

kevin cline
sumber
1
Masalahnya di sini bukan salah satu dari kode. Itu salah satu data. Saya dapat mengolok-olok API tiruan atau bertopik, tetapi masalahnya adalah membuat data palsu yang akan memberi saya
dferraro
@dferraro: Apa yang menghentikan Anda dari polling layanan saat berikutnya ada permainan, dan membuang data itu ke file. Setelah Anda mampu melakukan itu, dan terbiasa dengan format, maka Anda dapat membuat file baru (atau file) dengan kasus uji tertentu.
Steven Evers
4

Tunggu sampai pertandingan terjadi. Abadikan setiap peristiwa dari umpan. Tulis simulator yang memutar ulang acara pada waktu yang tepat. Voila, Anda memiliki simulator umpan dengan data nyata.

AakashM
sumber
Jika Anda adalah pengguna Ruby, Anda dapat menggunakan VCR untuk menangkap dan memutar ulang respons HTTP.
dusan
2

Saya sarankan untuk menulis simulator Anda sendiri. Anda dapat menggunakannya untuk menguji segala macam skenario;

  • Server menerima koneksi tetapi tidak merespons
  • Waktu server habis
  • Server mengirim kembali balasan sampah dll ...

Ketika saya melakukan ini di masa lalu, saya telah menggunakan nilai "khusus" dalam pesan permintaan untuk meminta simulator melakukan apa yang saya butuhkan. Ini juga memungkinkan untuk menjalankan tes ujung ke ujung tanpa keluar dari lingkungan pengembangan Anda.

Sunting: Misalnya, jika proyek Anda mengirimkan XML ke layanan pihak ke-3, permintaan mungkin termasuk misalnya <value>50.00</value>. Simulator dapat dikodekan (atau, lebih baik, dikonfigurasikan) sehingga 50,00 => meledak, 60,00 => sampah, 70,00 => tutup koneksi, dan sebagainya. Idenya adalah bahwa perilaku simulator tergantung pada inputnya, yang Anda kontrol di setiap test case.

Rory Hunter
sumber
Terima kasih. Bisakah Anda memberikan contoh tentang apa yang Anda maksud tentang nilai-nilai 'khusus'?
dferraro
1
Menjelaskan jawaban saya.
Rory Hunter
2

Mengingat itu mungkin taruhan menyediakan beberapa sampel data (dan ini dapat disimpan selama fase integrasi), saran saya adalah mengatur umpan tersebut dengan cara ini:

  • Daftar acara
  • Pembaruan untuk acara yang dijadwalkan
  • Peluang pembaruan
  • Hasil

Mungkin penyedia menawarkan 2 jenis pembaruan: Push (POST) dan Pull (GET).

Pada titik ini Anda harus

  1. Buat server sederhana yang hanya menangani permintaan GET, sehingga programmer Anda dapat menguraikan algoritma.
  2. Buat otomatisasi untuk mengelola pengiriman informasi yang sama dan dengan demikian dapat menekankan sistem Anda.

Kelola pengembangan dan pengujian

Tanpa membahas detail teknologi yang akan digunakan, Anda mendapatkan mini-server , yang hanya merespons 4 URL (atau yang diperlukan tergantung pada apa yang ditawarkan penyedia), dan layanan mini-push .

Suatu hal yang sangat baik untuk diingat ketika bekerja dengan "mini-server", adalah penangan protokol HTTP. Membuat server pada port 80 sangat sederhana, dan menyelesaikan masalah. Anda harus memastikan untuk menyuntikkan semua informasi dalam respons GET karena penyedia membuat (ini akan menghindari masalah ketika dimasukkan ke dalam produksi).

Secara pribadi saya akan melakukan server Perl sederhana atau sama tetapi dengan Nodejs. Berkenaan dengan injeksi data, akan cukup waktu, yang memanggil browser offline ( CURL , WGET )

marcocs
sumber
2

Saya mensimulasikan REST API dengan menggunakan kombinasi cucumberjs, phantomjs dengan menetapkan server proxy ke 127.0.0.1 dan mengaitkan proses node.js dengan http-proxydannock sana. KetimunJS bukan bagian penting, Anda dapat menulis skenario uji dengan cara apa pun, sisanya adalah kunci untuk simulasi. Ia dapat mengolok-olok hanya dengan mencocokkan-meminta-mengembalikan-data, tetapi Anda juga dapat memfilter menurut pola dan fungsi panggilan balik untuk menghasilkan balasan, sehingga Anda dapat mensimulasikan ke tingkat granularitas apa pun yang Anda butuhkan (di akhir ekstrem dengan server demo penuh, tetapi Anda dapat melakukannya secara bertahap).

Ini bekerja dengan baik:

  1. Phantomjs meminta URI.
  2. Permintaan masuk ke server proxy pada 127.0.0.1:port.
  3. Proses node.js Anda membuat proksi dengan transparan menggunakan maju http-proxy. Jadi setiap pemuatan "normal" (halaman, gambar) berfungsi.
  4. Jika Anda memilih untuk mencegat beberapa permintaan (API, terutama) yang Anda gunakan nockuntuk itu.

Dalam skenario saya, saya menggabungkannya dengan tes mentimun js dalam proses yang sama, jadi begini:

  1. Tes berjalan.
  2. Ini mengatur nockmengejek HTTP untuk skenario yang diuji.
  3. Itu memuat halaman di phantomjs melalui protokol Selenium.

Sisanya adalah seperti yang ditunjukkan sebelumnya dalam paragraf ini (yaitu, itu adalah sedikit siklus, saya sebagai pelari tes menginstruksikan phantomjs untuk memuat halaman, yang meneruskan semua permintaan kembali kepada saya, dan saya meneruskannya ke internet; atau mencegat mereka jika itu adalah API yang diuji).

herba
sumber