Cara menggunakan python mock requests response

Publish on Jul 06, 2019 by Alfin F

Requests merupakan modul Python yang bisa kamu gunakan untuk mengirim berbagai request HTTP. Requests adalah library yang memiliki banyak fitur mulai dari melempar parameter dalam URL sampai mengirim header khusus dan verifikasi SSL.

HTTP mendefinisikan seperangkat metode permintaan untuk menunjukkan tindakan yang diinginkan yang akan dilakukan untuk sumber daya tertentu. Meskipun mereka juga bisa menjadi kata benda, metode permintaan ini kadang-kadang disebut sebagai verba HTTP. Masing-masing menerapkan semantik yang berbeda, namun beberapa fitur umum dapat digunakan bersamaan, contohnya Metode permintaan dapat berupa safe, idempotent, atau cacheable.

Pada kesempatan kali ini kita akan mempelajari lebih jauh tentang Python Requests. selama ini kita sudah sering mendengar atau bahkan menggunakan http methods GET dan POST. taukah kamu bahwa HTTP Methods memiliki sedikitnya 7 methods apa saja itu ?


  1. GET

  2. POST

  3. PUT

  4. DELETE

  5. HEAD

  6. PATCH

  7. OPTIONS

sebelum membaca tutorial ini lebih lanjut, pastikan bahwa kamu sudah membuat virtual environment. kemudian install library requests menggunakan pip

pip install requests


1) GET

Metode GET meminta representasi sumber daya yang ditentukan. Permintaan menggunakan GET seharusnya hanya mengambil data

import requests

response = requests.get('https://httpbin.org/get')
print(response.text)

2) POST

Metode POST digunakan untuk mengirimkan entitas ke sumber daya yang ditentukan, sering menyebabkan perubahan pada keadaan atau efek samping pada server.

import requests

response = requests.post('https://httpbin.org/post', data={'key':'value'})
print(response.text)

3) PUT

Metode PUT menggantikan semua representasi terkini dari sumber target dengan muatan permintaan.

import requests

response = requests.put('https://httpbin.org/put', data={'key':'value'})
print(response.text)

4) DELETE

Metode DELETE akan menghapus sumber daya yang ditentukan

import requests

response = requests.delete('https://httpbin.org/delete')
print(response.text)

5) HEAD

Metode HEAD meminta tanggapan yang identik dengan permintaan GET, namun tanpa respon body.

import requests

response = requests.head('https://httpbin.org/get')
print(response.text)

6) PATCH

Metode PATCH digunakan untuk menerapkan modifikasi sebagian pada sumber daya.

import requests

response = requests.patch('https://httpbin.org/patch', data={'key':'value'})
print(response.text)

7) OPTIONS

Metode OPTIONS digunakan untuk menggambarkan opsi komunikasi untuk sumber target.

import requests

response = requests.options('https://httpbin.org/get')
print(response)

Indonesian (Bahasa Indonesia) translation by Taufan Prasetyo Basri (you can also view the original English article)

Mocking adalah library untuk pengujian/testing di Python. Hal ini memungkinkan Anda mengganti bagian sistem Anda yang akan diuji dengan objek tiruan dan membuat pernyataan atau tuntunan tentang bagaimana cara menggunakannya. Tutorial ini akan membahas secara rinci apa itu mocking dan bagaimana menggunakannya dalam aplikasi berbasis Python.

Apa itu Mocking?

Mocking adalah library untuk pengujian/testing di Python. Hal ini memungkinkan Anda mengganti bagian sistem Anda yang akan diuji dengan objek tiruan dan membuat pernyataan atau tuntunan tentang bagaimana cara menggunakannya. 

Dengan Python, mocking dilakukan dengan mengganti bagian sistem Anda dengan objek tiruan menggunakan modul unittest.mock. Modul ini berisi sejumlah kelas dan fungsi yang sangat berguna, yaitu fungsi patch (sebagai dekorator dan context manager) dan kelas MagicMock. Kedua komponen ini sangat penting dalam melakukan mocking di Python.

Pemanggilan fungsi mock biasanya mengembalikan nilai yang telah ditentukan secara langsung. Atribut objek dan metode mock didefinisikan dalam tes juga, tanpa menciptakan objek sebenarnya.

Mocking juga memungkinkan Anda mengembalikan nilai yang telah ditentukan ke setiap pemanggilan fungsi saat menulis test. Hal ini memungkinkan Anda untuk memiliki kontrol lebih saat melakukan pengujian.

Prasyarat

Mock tersedia di Python 3, tetapi jika Anda menggunakan versi Python di bawah
3.3, Anda masih dapat menggunakan unittest.mock dengan mengimpor sebagai sebuah library yang terpisah.

$ pip install mock

Manfaat penggunaan Mocking

Beberapa manfaat dari mocking meliputi:

  1. Menghindari Terlalu Banyak Dependency. Mocking mengurangi ketergantungan fungsi. Misalnya, jika Anda memiliki fungsi Kelas yang bergantung pada fungsi B, Anda perlu menulis beberapa unit test yang mencakup fitur yang diberikan oleh fungsi B. Misalkan kode itu berkembang di masa depan dan Anda memiliki lebih banyak fungsi, yaitu A tergantung pada B, B bergantung pada C, dan C bergantung pada D. Jika kesalahan dikenalkan pada Z, semua unit tes Anda akan gagal.
  2. Mengurangi kelebihan beban (overload). Ini berlaku untuk fungsi resource-intensive. Sebuah mock dari fungsi itu akan mengurangi penggunaan sumber daya (resource) yang tidak perlu selama pengujian, sehingga mengurangi waktu uji coba.
  3. Bypass kendala waktu dalam fungsi. Ini berlaku untuk aktivitas terjadwal. Bayangkan sebuah proses yang telah dijadwalkan untuk dijalankan setiap jamnya. Dalam situasi seperti ini, mocking benar-benar menguji logika sehingga Anda tidak harus menjalankan test berjam-jam, menunggu sampai selesai.

Penggunaan

Penggunaan mock sesederhana seperti berikut:

>>> from mock import Mock
>>> mock = Mock(return_values = 10)
>>> mock(1,4,foo ='bar')
<Mock name='mock()' id='140305284793040'>
>>> mock.return_values
10

Di sini, kita mengimpor modul mock, membuat objek mock, dan menentukan nilai kembalian. Ketika objek mock dipanggil, kita ingin mengembalikan beberapa nilai. Dalam kasus ini, kita ingin objek mock mengembalikan nilai 10. Jika kita memanggil objek mock dengan argumen (1, 4, foo = 'bar'), hasilnya adalah nilai 10, yang didefinisikan sebagai nilai kembalian.

Anda juga dapat membuat pengecualian di dalam mock sebagai berikut:

>>> mock = Mock(side_effect=KeyError('foobar'))
>>> mock()
Traceback (most recent call last):
 ...
KeyError: 'foobar'

Argumen side_effects memungkinkan Anda untuk melakukan hal-hal tertentu seperti membangkitkan pengecualian ketika mock dipanggil.

Contoh

Pertimbangkan fungsi sederhana ini:

import requests


def api():
    response = requests.get('https://www.google.com/')
    return response

Fungsi ini melakukan permintaan API ke laman web Google dan mengembalikan respons.

Kasus uji sederhana yang sesuai adalah sebagai berikut:

import unittest
from main import api


class TetsApi(unittest.TestCase):

    def test_api(self):
        assert api() == 200

Menjalankan tes di atas harus memberikan output seperti:

----------------------------------------------------------------------
Ran 1 test in 3.997s

OK

Mari perkenalkan mocking untuk contoh ini, dan tes yang dihasilkan dengan modul Mock akan seperti yang ditunjukkan di bawah ini:

import unittest
from mock import Mock
from mock import patch
import requests
import unittest



class TetsApi(unittest.TestCase):

    def test_api(self):
        with patch.object(requests, 'get') as get_mock:
            get_mock.return_value = mock_response = Mock()
            mock_response.status_code = 200
            assert api() == 200

Menjalankan tes di atas harus memberikan output seperti:

----------------------------------------------------------------------
Ran 1 test in 0.001s

OK

Seperti yang terlihat di atas, modul mocking memakan waktu lebih sedikit untuk membuat panggilan API yang sama seperti uji normal.

Contoh yang lebih besar

Anggaplah Anda memiliki skrip yang berinteraksi dengan API eksternal dan panggil ke API kapan pun fungsi tertentu dipanggil. Dalam contoh ini, kita akan menggunakan API Twitter untuk mengimplementasikan skrip Python yang akan dikirim ke halaman profil Twitter.

Kita tidak ingin mengeposkan pesan di Twitter setiap kali kita menguji skrip, dan di situlah Mocking digunakan.

Mari kita mulai. Kita akan menggunakan library python-twitter, dan hal pertama yang akan kita lakukan adalah membuat folder python_mock dan di dalam folder buat dua file yaitu tweet.py dan mock_test.py.

Tuliskan kode berikut ke file tweet.py.

# pip install python-twitter
import twitter

# define authentication credentials
consumer_key = 'iYD2sKY4NC8teRb9BUM8UguRa'
consumer_secret = 'uW3tHdH6UAqlxA7yxmcr8FSMSzQIBIpcC4NNS7jrvkxREdJ15m'
access_token_key = '314746354-Ucq36TRDnfGAxpOVtnK1qZxMfRKzFHFhyRqzNpTx7wZ1qHS0qycy0aNjoMDpKhcfzuLm6uAbhB2LilxZzST8w'
access_token_secret = '7wZ1qHS0qycy0aNjoMDpKhcfzuLm6uAbhB2LilxZzST8w'


def post_tweet(api, tweet):
    # post tweet
    status = api.PostUpdate(tweet)
    return status


def main():

    api = twitter.Api(consumer_key=consumer_key,
                      consumer_secret=consumer_secret,
                      access_token_key=access_token_key,
                      access_token_secret=access_token_secret)

    message = raw_input("Enter your tweet :")

    post_tweet(api, message)


if __name__ == '__main__':
    main()

Pada kode di atas, pertama-tama kami mengimpor library Twitter dan kemudian menentukan kredensial otentikasi, yang dapat Anda dapatkan dengan mudah dari halaman Aplikasi Twitter.

API Twitter terpapar melalui kelas twitter.Api, jadi kami membuat kelas dengan mengirimkan token dan token key kita.

Fungsi post_tweet mengambil objek otentikasi dan pesan dan kemudian memposting tweet ke profil Twitter.

Kita langsung mock dan panggil API ke Twitter sehingga API tidak mengirim ke Twitter setiap kali dipanggil. Silakan buka file mock_test.py dan tambahkan kode berikut.

# mock_test.py

#!/usr/bin/env python
import unittest
from mock import Mock


import tweet


class TweetTest(unittest.TestCase):

    def test_example(self):
        mock_twitter = Mock()
        tweet.post_tweet(
            mock_twitter, "Creating a Task Manager App Using Ionic: Part 1")
        mock_twitter.PostUpdate.assert_called_with(
            "Creating a Task Manager App Using Ionic: Part 1")


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

Menjalankan tes di atas harus memberikan output seperti:

----------------------------------------------------------------------
Ran 1 test in 0.001s

OK

Kesimpulan

Tutorial ini telah mencakup sebagian besar dasar-dasar mocking dan bagaimana menggunakan mocking untuk menggunakan API eksternal. Untuk informasi lebih lanjut, kunjungi dokumentasi resmi mocking Python. Anda juga dapat menemukan sumber tambahan tentang otentikasi dengan API Twitter di tutorial ini.

Selain itu, jangan ragu untuk melihat apa yang tersedia untuk dijual dan pelajari di Envato Market, dan silakan masuk dan ajukan pertanyaan dan berikan feedback berharga Anda menggunakan feed di bawah ini.