15%

Cara Menerapkan Unit Test Pada Flask Web API

26-Jun-2022

Pada artikel kali ini Saya akan mencoba menjelaskan penggunaan Unit Test pada aplikasi web api yang akan berjalan pada framework Flask.

 

Keuntungan Melakukan Test

Sering kali para programmer pada saat mengerjakan aplikasi langsung menguji kode yang dikerjakan langsung secara ekstensif dan manual. Pada saat kode selesai dikerjakan mereka akan langsung mengujinya dan menemukan error dan langsung mengatasinya.

Sementara argumen ini benar, ketika kita menulis kode jika menemukan error atau mengganti logika dalam sebuah fungsi misalnya maka kita dapat langsung memverifikasi kode akan berjalan seperti yang diinginkan, sehingga ketika kita selesai menulis kode kemungkinan bugs akan sangat kecil apalagi jika kita sudah berpengalaman dalam menulis kode.

Argumen diatas mempunyai kelemahan. Biasanya jika aplikasi kita semakin membesar kita perlu menambahkan atau memodifikasi kode yang telah kita kerjakan sebelumnya. Jika menggunakan argumen diatas pengujian akan dilakukan terhadap baris kode yang akan kita kerjakan sekarang.

Bagaimana kita dapat menjamin kode yang kita buat tidak mempengaruhi bagian yang lain? Secara tidak langsung akan ada bugs yang muncul yang mana akan sangat merepotkan jika kita mengabaikan ini, bahkan bugs akan muncul dibagian kode yang tidak terlalu kita perhatikan.

Ketika kita menerapkan Otomatis Test dengan Unit Test, Kita tidak hanya menjamin kode kita berjalan seharusnya tapi juga dapat menjamin bahwa kode yang kita buat tidak akan berdampak pada baris kode yang lainnya.

Sebagai contoh lainnya, Jika kita melakukan integrasi API dengan pihak ketiga dan melakukan pengujian secara manual tentu hasilnya akan sangat baik, tapi bagaimana jika pihak ketiga melakukan perubahan respon atau bahkan sedang down. Ini akan sulit melakukan pengujian secara langsung tapi sangat mudah dengan otomatis test (Unit Test).
 

Jenis-jenis Testing dan Perbedaannya

Testing (pengujian) dapat diklasifikasikan kedalam beberapa bentuk.

 

  1. Unit Test
    Mengevaluasi modul dari kode yang kita buat secara terpisah dapat berjalan sebagai mestinya.
     
  2. Integration Test
    Mengevaluasi model dua atau lebih modul berjalan seperti yang diharapkan. Testing ini juga dikenal dengan System Integration Test (SIT)
     
  3. Functional Test
    Mengevaluasi Project secara End-to-end berjalan seperti yang diharapkan.

 

Tentu kita mengharapkan banyak kode yang dilakukan pengujian unit atau Unit Test, Integration Test dan Functional Test akan sangat sulit dibandingkan dengan Unit Test karena membutuhkan pengaturan ekstra dan komponen tambahan yang perlu kita lakukan.


 

Unit Test dengan Python

 

penjumlahan.py

def jumlah(x, y):
    return x + y

Pada file penjumlahan.py hanya berisi fungsi sederhana yaitu jumlah mengembalikan hasil penjumlahan dari 2 parameter yang diberikan.

test_basic.py

import unittest
from penjumlahan import jumlah


class BasicsTestCase(unittest.TestCase):

    def test_benar(self):
        result = 8
        x = jumlah(4, 4)
        self.assertEqual(x, result, f"Seharusnya {x}")

    def test_salah(self):
        result = 9
        x = jumlah(4, 4)
        self.assertNotEqual(x, result, f"Seharusnya tidak {x}")

Kemudian pada file test_basic.py mula-mula kita import library builtin python unittest serta kita juga mengimport fungsi jumlah pada file penjumlahan.py

Pada class BasicTestCase saya melakukan inheritance dari library unittest yaitu TestCase, kemudian membuat 2 buah method yaitu test_benar dan test_salah.

test_benar akan melakukan pengujian pada fungsi jumlah pada file penjumlahan.py bahwa hasil pengujian harus sama dengan value result = 8 yang ditandai dengan assertEqual begitu juga dengan method test_salah melakukan pengujian bahwa hasil harus tidak sama dengan return fungsi yang ditandai dengan assertNotEqual.
 

Unit Test dengan Flask

Setelah kita pelajari cara menggunakan Unit Test pada Python maka sekarang kita akan mendalami Unit Test secara spesifik yaitu mengimplementasikan framework Flask yang berjalan diatas Python.

run.py

from flask import Flask, request

app = Flask(__name__)

@app.route('/register', methods=['POST'])
def register():
    if not request.accept_mimetypes.accept_json:
        return {'msg': 'Bad request'}, 400

    data = request.get_json() or {}
    if 'username' not in data or 'password' not in data:
        return {'msg': 'Harus ada username dan password'}, 400
    if len(data['password']) <= 8:
        return {'msg': 'Password minimal 8 karakter'}, 400
    return {'msg': 'Berhasil registrasi'}, 201

 

Disini Saya membuat sebuah endpoint registrasi dengan method POST. Kemudian ada beberapa logic pada endpoint ini yaitu, setiap request harus memiliki header Accept application/json, kemudian pada body harus memiliki username dan password dan password harus memiliki minimal 8 karakter.

Tentunya ini sangat sederhana, Anda mungkin harus mengembangkan lebih eksplisit pada production, disini saya hanya ingin menunjukkan cara menerapkan unit test pada web api Flask.

test_api.py

import unittest
from run import app
import json

class ApiTestCase(unittest.TestCase):

    def setUp(self):
        self.app = app
        self.app_context = self.app.app_context()
        self.app_context.push()
        self.client = self.app.test_client()

    def tearDown(self):
        self.app_context.pop()

    def json_headers(self):
        return {'Accept': 'application/json'}

    def test_register(self):
        # test tanpa header
        response = self.client.post('/register', 
            json={'username': 'john', 'password': 'pass12312312'})
        self.assertEqual(response.status_code, 400)

        # test parameter dikirim sesuai
        response = self.client.post('/register', 
            json={'username': 'john', 'password': 'pass12312312'},
            headers=self.json_headers())
        self.assertEqual(response.status_code, 201)

        # test jika berhasil memiliki response json dengan key msg
        json_response = json.loads(response.get_data(as_text=True))
        self.assertEqual(type(json_response), type(dict()))
        self.assertDictEqual(json_response, {'msg': 'Berhasil registrasi'})

        # test password kurang dari 8 karakter
        response = self.client.post('/register', 
            json={'username': 'john', 'password': 'pass123'},
            headers=self.json_headers())
        self.assertEqual(response.status_code, 400, msg='password kurang dari 8 karakter')

        # test tidak mengirimkan password
        response = self.client.post('/register', 
            json={'username': 'john'},
            headers=self.json_headers())
        self.assertEqual(response.status_code, 400, msg='dibutuhkan password')

Pada class ApiTestCase ada method setUp yaitu berisi proses unit test sebelum dimulai dimana app dari flask harus diinisiasi disini agar kita dapat memanggil app_context dan test_client.

kemudian method tearDown yaitu berisi proses setelah unit test selesai dijalankan dimana agar app_context dihapus.

Kemudian method json_headers, tidak ada yang spesial disini, Saya hanya membuat method ini agar mudah dipanggil untuk pengujian nantinya.

Pada method test_register disinilah pengujian terhadap aplikasi flask dimulai. Pengujian saya tandai dengan komentar, tentunya Anda dapat membuat komentar menjadi method jika Anda menginginkan.

Jalankan perintah python -m unittest -v pada cli maka hasilnya:

test_register (test_api.ApiTestCase) ... ok
test_benar (test_basic.BasicsTestCase) ... ok
test_salah (test_basic.BasicsTestCase) ... ok

----------------------------------------------------------------------
Ran 3 tests in 0.003s

OK

 

Topik : python Flask
Similar Posts

Komentar (0)

Tinggalkan Komentar