Traffine I/O

Bahasa Indonesia

2023-02-17

pytest

Apa itu pytest

pytest adalah sebuah kerangka kerja pengujian Python dan alat untuk menguji kode Python. Di bawah ini adalah deskripsi dari fitur-fitur utama pytest.

  • Sederhana dan mudah digunakan.
    pytest memungkinkan Anda untuk menulis pengujian dalam kode yang ringkas dan mudah dibaca. Selain itu, fitur-fitur seperti deteksi tes otomatis dan parameterisasi membuatnya lebih mudah untuk menulis tes.

  • Fixture
    pytest menyediakan fitur yang disebut fixture, yang digunakan untuk melakukan pra-pemrosesan pengujian, pasca-pemrosesan, dll., untuk mengurangi duplikasi kode pengujian.

  • Arsitektur plugin
    pytest menggunakan arsitektur plugin yang memungkinkan pengguna untuk membuat plugin mereka sendiri. Hal ini memungkinkan mereka untuk memperluas fungsionalitas pytest dan menambahkan fitur yang sesuai dengan proyek mereka sendiri.

  • Pelaksana uji coba
    pytest menyediakan sebuah runner untuk menjalankan beberapa pengujian. Test runner mengumpulkan tes, menjalankannya, dan menghasilkan laporan.

  • Berbagai gaya pengujian
    pytest mendukung berbagai gaya pengujian. Sebagai contoh, ia mendukung pengujian gaya unittest, pengujian gaya BDD, pengujian gaya doctest, dll.

  • Dukungan multibahasa
    pytest mendukung pengujian tidak hanya dalam Python, tetapi juga dalam bahasa lain. Sebagai contoh, ada plugin untuk menjalankan tes C dan C++.

  • Cakupan pengujian
    pytest juga menyediakan plugin untuk mengukur cakupan pengujian. Cakupan pengujian adalah ukuran bagian mana dari kode yang telah diuji. Semakin tinggi cakupan pengujian, semakin tinggi kualitas kode.

  • Cakupan tingkat kelas dan metode
    pytest memungkinkan cakupan pengujian yang fleksibel. Sebagai contoh, Anda dapat mendefinisikan perlengkapan tingkat kelas, tes tingkat metode, dll.

  • Menjalankan tes secara paralel
    pytest dapat menjalankan tes secara paralel. Hal ini dapat mengurangi waktu eksekusi tes.

  • Integrasi dengan pelari tes eksternal
    pytest dapat diintegrasikan dengan test runner eksternal. Sebagai contoh, dapat diintegrasikan dengan alat CI/CD seperti Jenkins atau Travis CI.

  • Pengujian yang diparameterkan
    pytest mendukung pengujian berparameter. Pengujian yang diparameterisasi adalah metode pengujian lengkap dengan menjalankan pengujian yang sama terhadap beberapa nilai input. pytest memungkinkan Anda untuk menentukan pengujian yang diparameterisasi menggunakan dekorator @pytest.mark.parametrize.

  • Melewati tes dan mengatur kondisi lompatan
    pytest memungkinkan Anda untuk melewatkan tes. Anda juga dapat menentukan kondisi melewatkan tes. Hal ini berguna, misalnya, jika Anda ingin menjalankan tes hanya pada OS atau versi Python tertentu.

  • Fungsi pengait
    pytest memungkinkan fungsi hook dijalankan sebelum atau sesudah tes dijalankan. Hal ini memungkinkan fleksibilitas dalam mengatur pra dan pasca-pemrosesan tes.

  • Pernyataan khusus
    pytest memungkinkan Anda untuk mendefinisikan pernyataan Anda sendiri. Hal ini memungkinkan Anda untuk menentukan pernyataan yang disesuaikan dengan spesifikasi aplikasi atau library Anda.

  • Pelaporan yang sangat baik
    pytest menyediakan kemampuan pelaporan yang luas. Hasil uji coba dapat berupa output dalam format HTML, XML, JSON, atau format lainnya, sehingga Anda dapat memverifikasi hasil uji coba secara visual.

pytest banyak digunakan untuk menguji aplikasi dan pustaka Python dan didukung oleh banyak pengembang. pytest juga dapat diintegrasikan dengan kerangka kerja pengujian Python lainnya (mis. unittest dan nose).

Cara menggunakan pytest

Untuk menjalankan pengujian pada proyek Python Anda menggunakan pytest, ikuti langkah-langkah berikut

  1. Instal pytest
  2. Buat sebuah berkas uji coba
  3. Jalankan tes
  4. Gunakan opsi

Instal pytest

Instal pytest dengan perintah berikut

bash
$ pip install pytest

Buat sebuah berkas uji coba

File tes harus memiliki nama file yang dimulai dengan "test*" dan diakhiri dengan .py. Selain itu, fungsi uji harus dimulai dengan "test*". Sebagai contoh, file tes berikut ini dibuat.

test_sample.py
def test_addition():
    assert 1 + 2 == 3

def test_subtraction():
    assert 5 - 3 == 2

Jalankan tes

Pada baris perintah, jalankan perintah pytest sebagai berikut: pytest akan secara otomatis menemukan dan menjalankan semua file tes di bawah direktori saat ini.

bash
$ pytest

Jika pengujian berhasil dilakukan, output berikut ini akan ditampilkan.

bash
============================= test session starts =============================
platform win32 -- Python 3.7.6, pytest-6.2.2, py-1.10.0, pluggy-0.13.1
rootdir: C:\projects\pytest
collected 2 items

test_sample.py ..                                                       [100%]

============================== 2 passed in 0.04s ==============================

Dalam contoh ini, dua tes dijalankan dan semuanya lulus.

Gunakan opsi

pytest menawarkan berbagai pilihan. Sebagai contoh, Anda dapat mengubah format laporan dengan menentukan opsi berikut.

bash
$ pytest --junitxml=junit.xml

Contoh ini menulis hasil tes ke file bernama junit.xml. File ini dapat digunakan oleh alat bantu CI/CD.

Memparameterkan pengujian

pytest memungkinkan Anda untuk menjalankan tes yang sama beberapa kali. Misalnya, Anda dapat menjalankan tes yang sama beberapa kali menggunakan argumen yang berbeda. Sebagai contoh, pengujian yang sama dapat dijalankan beberapa kali menggunakan argumen yang berbeda sebagai berikut.

python
import pytest

@pytest.mark.parametrize("dividend, divisor, expected_quotient", [(10, 2, 5), (12, 3, 4)])
def test_division(dividend, divisor, expected_quotient):
    assert dividend / divisor == expected_quotient

Contoh ini menggunakan dekorator @pytest.mark.parametrize untuk menentukan tiga argumen (dividend, divisor, dan expected_quotient), masing-masing dengan sebuah tuple nilai. Pengujian dijalankan beberapa kali menggunakan nilai dari setiap tuple.

fixture

pytest menyediakan fitur yang disebut fixture untuk meningkatkan penggunaan ulang kode pengujian. fixture dapat mendefinisikan pra-pemrosesan dan pasca-pemrosesan kode pengujian dan dapat menyediakan objek yang akan digunakan dalam kode pengujian.

Fixture didefinisikan menggunakan dekorator pytest.fixture. Berikut ini adalah contoh fixture sederhana.

python
import pytest

@pytest.fixture
def my_fixture():
    preprocess() # preprocess test code within this function
    yield obj # obj is the object used in the test code
    postprocess() # post-process the test code within this function

Contoh ini mendefinisikan fixture bernama my_fixture. Fixture ini mengembalikan sebuah objek bernama obj dalam pernyataan hasil. Kode pengujian dapat menggunakan my_fixture sebagai argumen.

python
def test_my_test(my_fixture):
    # test using the object provided by my_fixture

Contoh ini mendefinisikan kode pengujian bernama test_my_test. Kode pengujian mengambil perlengkapan bernama my_fixture sebagai argumen. Objek yang disediakan oleh my_fixture dapat digunakan untuk pengujian.

Fixture secara otomatis dipanggil sebelum pytest mengeksekusi kode pengujian untuk melakukan praproses kode pengujian. Setelah kode pengujian selesai, fixture secara otomatis melakukan post-processing. fixture dapat berbagi objek antara kode pengujian, yang dapat meningkatkan penggunaan ulang kode.

Memparameterkan fixture

Fixture juga dapat diparameterisasi. Hal ini memungkinkan beberapa objek dengan parameter yang berbeda dikembalikan.

python
import pytest

@pytest.fixture(params=[1, 2, 3])
def my_fixture(request):
    return request.param

Dalam contoh ini, fixture bernama my_fixture didefinisikan. Fixture ini dapat memiliki tiga parameter: 1, 2, dan 3, dengan menggunakan opsi params. Kode pengujian dapat menggunakan my_fixture sebagai argumen. Fixture ini mengembalikan sebuah objek untuk setiap parameter.

python
def test_my_test(my_fixture):
    assert my_fixture > 0

Contoh ini mendefinisikan kode pengujian bernama test_my_test. Kode pengujian mengambil perlengkapan bernama my_fixture sebagai argumen. Karena my_fixture mengembalikan sebuah objek untuk masing-masing dari tiga parameter, 1, 2, dan 3, kode pengujian dieksekusi sebanyak tiga kali.

Ketergantungan fixture

Sebuah fixture dapat bergantung pada fixture lainnya. Hal ini memungkinkan Anda untuk menyediakan beberapa objek yang dibutuhkan oleh kode pengujian sekaligus.

python
import pytest

@pytest.fixture
def obj1():
    return ...

@pytest.fixture
def obj2(obj1):
    return ...

@pytest.fixture
def obj3(obj1, obj2):
    return ...

Dalam contoh ini, tiga perlengkapan didefinisikan. obj1 adalah perlengkapan independen, obj2 adalah perlengkapan yang bergantung pada obj1. Dan obj3 adalah perlengkapan yang bergantung pada obj1 dan obj2. Kode pengujian dapat menggunakan obj3 sebagai argumen. obj3 dibuat dengan menggunakan objek yang disediakan oleh obj1 dan obj2.

python
def test_my_test(obj3):
    ...

Contoh ini mendefinisikan kode pengujian bernama test_my_test. Kode pengujian mengambil perlengkapan bernama obj3 sebagai argumen. obj3 dibuat dengan menggunakan objek yang disediakan oleh obj1 dan obj2.

Cakupan perlengkapan

Sebuah fixture dapat digunakan kembali di berbagai bagian dari set pengujian. fixture memiliki cakupan sebagai berikut.

Scope Deskripsi
function Dieksekusi sebelum kode pengujian dieksekusi dan kemudian dihapus (nilai default).
class Ini digunakan kembali di semua kode tes dalam kelas yang sama.
module Ini digunakan kembali dalam semua kode pengujian dalam modul yang sama.
session Ini digunakan kembali di semua kode pengujian saat pytest berjalan.

Untuk menentukan cakupan, gunakan opsi scope ke perlengkapan.

python
import pytest

@pytest.fixture(scope="module")
def my_fixture():
    return ...

Contoh ini mendefinisikan perlengkapan bernama my_fixture. Fixture ini memiliki opsi scope yaitu "module". Ini berarti fixture ini akan digunakan kembali oleh semua kode uji dalam modul yang sama.

Cache fixture

Sebuah fixture dapat dipanggil beberapa kali dalam kode pengujian yang sama. pytest menyimpan hasil dari pemanggilan pertama alih-alih mengeksekusi fixture yang sama beberapa kali. Hal ini menghemat waktu eksekusi fixture.

Untuk menonaktifkan cache fixture, gunakan opsi autouse.

python
import pytest

@pytest.fixture(autouse=True)
def my_fixture():
    return ...

Contoh ini mendefinisikan perlengkapan bernama my_fixture. Fixture ini memiliki opsi autouse yang disetel ke True. Ini berarti bahwa fixture ini tidak perlu secara eksplisit dioper ke kode pengujian sebagai argumen, tetapi akan dieksekusi secara otomatis. Selain itu, perlengkapan ini tidak di-cache.

Pendeteksian otomatis dari fixture

pytest secara otomatis mendeteksi file bernama conftest.py secara default. Fixture yang didefinisikan dalam conftest.py dapat direferensikan oleh semua kode pengujian dalam direktori yang berisi file tersebut. Hal ini memungkinkan penggunaan ulang perlengkapan yang lebih besar.

Plugin

pytest menyediakan berbagai macam plugin yang tersedia secara bebas untuk pengguna. Plugin digunakan untuk memperluas atau menyesuaikan fungsionalitas pytest. Berikut ini adalah deskripsi dari beberapa plug-in pytest yang umum.

  • pytest-cov
    pytest-cov adalah plugin untuk mengukur cakupan kode. pytest-cov akan mengambil informasi cakupan ketika Anda menjalankan pengujian dengan pytest. pytest-cov dapat menampilkan laporan dalam format HTML, sehingga Anda dapat memeriksa cakupan kode secara visual.

  • pytest-html
    pytest-html adalah plugin untuk menampilkan hasil pengujian dalam format HTML, memungkinkan Anda untuk memeriksa hasil pengujian secara visual dengan menampilkannya dalam format HTML. Laporan juga dapat menyertakan tangkapan layar, log, dan informasi lainnya.

  • pytest-xdist
    pytest-xdist adalah plugin untuk menjalankan pengujian secara paralel pada beberapa proses atau mesin. Hal ini mengurangi waktu eksekusi pengujian.

  • pytest-flake8
    pytest-flake8 adalah plugin untuk memverifikasi kualitas kode Anda, menggunakan alat analisis statis yang disebut flake8 untuk memeriksa masalah kode. pytest dapat menampilkan hasil flake8 ketika Anda menjalankan pengujian dengan pytest.

  • pytest-django
    pytest-django adalah plugin untuk mendukung pengujian dengan kerangka kerja Django, yang memungkinkan Anda untuk menguji model, tampilan, dll. Django dengan pytest.

  • pytest-selenium
    pytest-selenium adalah sebuah plugin untuk menjalankan pengujian untuk aplikasi web menggunakan Selenium WebDriver. Plugin ini memungkinkan Anda untuk menguji perilaku aplikasi web Anda dengan mengoperasikan browser secara otomatis. Plugin ini juga dapat mengambil tangkapan layar.

  • pytest-mock
    pytest-mock adalah sebuah plugin untuk menjalankan pengujian menggunakan mock, menggunakan pustaka standar unittest.mock untuk menghasilkan objek mock untuk pengujian.

Cara menggunakan plugin

Plugin pytest dapat diinstal menggunakan perintah pip. Secara khusus, jalankan perintah berikut.

bash
$ pip install pytest-cov

Ini akan menginstal plugin pytest-cov. Plugin pytest-cov dapat digunakan dengan menentukan opsi --cov sebagai argumen baris perintah untuk pytest. Setelah opsi --cov, tentukan paket atau modul yang ingin Anda ukur cakupannya.

bash
$ pytest --cov=myapp tests/

Anda sekarang dapat mengukur cakupan kode di bawah paket myapp. Informasi cakupan akan dikeluarkan ke terminal. Anda juga dapat membuat laporan dalam format HTML dengan menentukan opsi --cov-report.

bash
$ pytest --cov=myapp --cov-report=html tests/

Ini akan mengeluarkan informasi cakupan dalam format HTML.

Jika Anda ingin menggunakan plugin pytest-html, instal plugin ini dengan perintah pip yang sama.

bash
$ pip install pytest-html

Untuk menampilkan hasil tes dalam format HTML, tentukan opsi --html.

bash
$ pytest --html=report.html tests/

Ini akan mengeluarkan hasil tes dalam format HTML dalam file bernama report.html. Plugin pytest-html juga dapat menggabungkan resource yang diperlukan untuk file HTML ke dalam satu file dengan menentukan opsi --self-contained-html.

bash
$ pytest --html=report.html --self-contained-html tests/

Ini akan menghasilkan resource yang diperlukan dalam satu file yang disebut report.html.

Plug-in lain juga dapat digunakan dengan menentukan opsi pada argumen baris perintah pytest, meskipun mereka diinstal dan digunakan dengan cara yang berbeda.

Mengukur cakupan pengujian

Plugin pytest-cov memungkinkan Anda untuk mengukur cakupan pengujian Anda. Berikut ini adalah contoh pengujian yang menggunakan plugin pytest-cov.

bash
$ pytest --cov=my_module tests/

Dalam contoh ini, opsi ---cov digunakan untuk mengukur cakupan modul bernama my_module. Plugin pytest-cov akan menjalankan pengujian, menghitung cakupan modul, dan menghasilkan laporan.

Lewati tes

Jika tes tidak dapat dijalankan, tes tersebut dapat dilewati. Misalnya, Anda dapat melewatkan tes dalam kondisi tertentu dengan ini.

python
import pytest

def test_division():
    divisor = 0
    dividend = 10
    if divisor == 0:
        pytest.skip("Can't divide by zero")
    assert dividend / divisor == 5

Dalam contoh ini, jika dividor adalah 0, tes akan dilewati oleh fungsi pytest.skip().

Referensi

https://docs.pytest.org/en/7.2.x/
https://github.com/pytest-dev/pytest

Ryusei Kakujo

researchgatelinkedingithub

Focusing on data science for mobility

Bench Press 100kg!