07 - Python - Unit Testing
07 - Python - Unit Testing
Testing
Level Intermediate
Developer Berinovasi.id
Version 01
Daftar Topik :
1. Unit testing
Keywords :
2. Assert
3. data set
4. mocking
Apabila kita mengimplementasikan suatu fungsi python, bagaimana cara kita mengetahui bahwa fungsi
sudah diimplementasikan dengan benar? Cara termudahnya adalah dengan menguji fungsi tersebut pada
beberapa argumen, dan memastikan bahwa output yang dikeluarkan sudah benar. Namun, cara ini akan
menjadi sangat tidak efisien apabila funsgi digunakan untuk project data science yang lebih kompleks.
my_function(argument_1)
...
Data input menyimpan informasi luas rumah, kemudian tab, lalu harga
rumah tersebut dan ditutup dengan new line character.
File: housing_data.txt
Mengingat pada suatu cycle function umumnya perlu diuji sebanyak 100 row_to_list("\t293,410\n")
kali, dan mengasumsikan setiap pengujian memerlukan waktu 5 menit,
None
None
maka diperlukan sekitar 8 jam untuk menguji function secara manual.
row_to_list("1,463238,765\n")
Menggunakan unit testing mampu mengurangi durasi pengujian
menjadi 1 jam saja. Dalam skala project data science yang besar, tentu None
None
unit testing menjadi suatu hal yang wajib dikuasai oleh data scientist.
...
Python – Unit Testing > Unit Testing > Membuat Unit Test Sederhana Menggunakan Pytest
10
1. Unit Testing
Membuat Unit Test Sederhana Menggunakan pytest
1. Buat File Test Module
Untuk memulai unit testing menggunakan pytest, pertama-tama perlu dibuat file
test_row_to_list.py. Apabila pytest melihat file dengan awalan ‘test_’, maka
akan segera dikenali sebagai file python spesial yang di dalamnya terdapat unit tests.
Sehingga, format penamaan dengan awalan ‘test_’ harus diikuti. File yang
mengandung unit tests disebut sebagai test module.
2. Import
import pytest Dalam file test module, perlu terlebih dahulu import pytest, kemudian
import row_to_list import function yang akan ditest row_to_list.
Python – Unit Testing > Unit Testing > Membuat Unit Test Sederhana Menggunakan Pytest
11
1. Unit Testing
Membuat Unit Test Sederhana Menggunakan pytest
3. Unit Test merupakan Function Python
Unit test dituliskan sebagai function python yang namanya
diawali dengan ‘test_’, sama seperti module test. Dengan import pytest
begitu, pytest dapat mengenali function tersebut sebagai unit import row_to_list
test, bukan function biasa.
Unit test biasanya berkoresponden terhadap tepat satu entry def test_for_clean_row():
argument dan menghasilkan tabel return value untuk function
row_to_list().
Argument Type Return value
Unit test mengecek apakah row_to_list() memiliki return
value yang sesuai apabila dijalankan pada argumen tertentu. "2,081\t314,942\n" Valid ["2,081",
"314,942"]
Kali ini digunakan argument clean row, sehingga unit test yang
dibuat akan diberi nama test_for_clean_row().
Python – Unit Testing > Unit Testing > Membuat Unit Test Sederhana Menggunakan Pytest
12
1. Unit Testing
Membuat Unit Test Sederhana Menggunakan pytest
AssertionError
Python – Unit Testing > Unit Testing > Membuat Unit Test Sederhana Menggunakan Pytest
13
1. Unit Testing
Membuat Unit Test Sederhana Menggunakan pytest
4. Assertion (lanjutan)
import pytest import row_to_list
Dilakukan cek apakah row_to_list
menghasilkan list yang sesuai pada data clean
row. def test_for_clean_row():
Function row_to_list digunakan pada assert row_to_list("2,081\t314,942\n") == \
argumen == list yang dianggap sesuai. Apabila
function berhasil, maka akan melewati assert ["2,081", "314,942"]
statement dan memberikan output blank. Argument Type Return value
Python – Unit Testing > Unit Testing > Membuat Unit Test Sederhana Menggunakan Pytest
14
1. Unit Testing
Membuat Unit Test Sederhana Menggunakan pytest
Python – Unit Testing > Unit Testing > Membuat Unit Test Sederhana Menggunakan Pytest
15
1. Unit Testing
Membuat Unit Test Sederhana Menggunakan pytest
import pytest import row_to_list
4. Assertion (lanjutan)
Untuk baris ketiga, dibuat unit test
test_for_missing_tab() karena def test_for_clean_row():
assert row_to_list("2,081\t314,942\n")
argumen tidak memiliki tab yang == \ ["2,081", "314,942"]
memisahkan luas dan harga bangunan.
Assert statement yang digunakan mirip
def test_for_missing_area():
seperti contoh pada baris kedua.
assert row_to_list("\t293,410\n") is
Argument Type Return value
None
"2,081\t314,942\ Valid ["2,081",
n"
"314,942"] def test_for_missing_tab():
"\t293,410\n" Invalid None assert row_to_list("1,463238,765\n") is
Invalid None
"1,463238,765\n" None
Python – Unit Testing > Unit Testing > Membuat Unit Test Sederhana Menggunakan Pytest
16
1. Unit Testing
Membuat Unit Test Sederhana Menggunakan pytest
Python – Unit Testing > Unit Testing > Membuat Unit Test Sederhana Menggunakan Pytest
17
1. Unit Testing
Memahami Test Result Report
Ketika pengguna menjalankan tests, akan dihasilkan test result report yang menyimpan informasi untuk
menyelesaikan bugs.
Argument Type Return value
def test_for_missing_area():
Sebagai contoh, digunakan test module
assert row_to_list("\t293,410\n") is None test_row_to_list.py yang mengandung 3 unit
tests untuk fungsi row_to_list(). Unit test akan
def test_for_missing_tab(): menguji apakah row_to_list() menghasilkan nilai
assert row_to_list("1,463238,765\n") is None yang sesuai untuk clean row, row dengan missing area,
dan row dengan missing tab secara berurutan.
Python – Unit Testing > Unit Testing > Memahami Test Result Report
18
1. Unit Testing
Memahami Test Result Report
Menjalankan tests di IPython console menghasilkan output yang sangat banyak. Output ini disebut test
result report.
!pytest test_row_to_list.py Unit test dijalankan dengan
memanggil !pytest
kemudian tuliskan tests
module yang telah dibuat.
Python – Unit Testing > Unit Testing > Membuat Unit Test Sederhana Menggunakan Pytest
19
1. Unit Testing
Memahami Test Result Report
Bagian 1: General Information
plugins: mock-1.10.0
Bagian ini menampilkan informasi terkait operating system, Pyton version, pytest package versions,
directory yang digunakan, dan plugin pytest.
Bagian ini memuat informasi umum sehingga tidak banyak yang bisa dilakukan pada bagian pertama.
Python – Unit Testing > Unit Testing > Membuat Unit Test Sederhana Menggunakan Pytest
20
1. Unit Testing
Memahami Test Result Report
Bagian 2: Test Result
Pada output tertulis ‘collected 3 items’, yang artinya ditemukan 3 unit tests yang akan dijalankan. Baris
selanjutnya memuat nama test module, yaitu test_row_to_list.py, diikuti dengan .F. yang
merepresentasikan hasil unit test.
Character Meaning When Action F berarti Failure. Unit test dikatakan
An exception is Fix the function gagal apabila muncul exception saat
F Failure raised when or unit test.
running unit test. menjalankan unit test.
Python – Unit Testing > Unit Testing > Membuat Unit Test Sederhana Menggunakan Pytest
21
1. Unit Testing
Memahami Test Result Report
Bagian 2: Test Result
Python – Unit Testing > Unit Testing > Membuat Unit Test Sederhana Menggunakan Pytest
22
1. Unit Testing
Memahami Test Result Report
Bagian 2: Test Result
Character Meaning When Action
An exception is raised when running unit test. Fix the function or unit
F Failure test.
Titik (.) berarti unit test berhasil dilewati dan tidak ada exception yang ditimbulkan oleh assert statement
maupun penyebab lainnya selama unit test berlangsung.
Untuk test module test_row_to_list.py yang memiliki hasil .F. berarti test pertama berhasil, kedua
gagal, dan ketiga berhasil.
Python – Unit Testing > Unit Testing > Membuat Unit Test Sederhana Menggunakan Pytest
23
1. Unit Testing
Memahami Test Result Report
Bagian 3: Informasi Failed Test
Bagian selanjutnya memuat informasi terkait test yang gagal (failed). Dapat dilihat bahwa unit test
test_on_missing_area() gagal. Baris kode yang menimbulkan exception ditandai dengan simbol > di sebelah
kiri. Pada kali ini, exception disebabkan oleh assert statement.
Python – Unit Testing > Unit Testing > Membuat Unit Test Sederhana Menggunakan Pytest
24
1. Unit Testing
Memahami Test Result Report
Bagian 3: Informasi Failed Test
Baris dengan where menampilkan segala nilai yang dihasilkan saat assert statement dijalankan. Pada
contoh, nilai yang dihasilkan dari row_to_list() adalah list yang berisi string kosong dan string
‘293,410’, sementara nilai yang diekspektasikan adalah None. Perbedaan ini akan menjadi titik awal untuk
dilakukan debugging, dengan mencari tahu kenapa row_to_list() menghasilkan list dan bukan
None.
Python – Unit Testing > Unit Testing > Membuat Unit Test Sederhana Menggunakan Pytest
25
1. Unit Testing
Memahami Test Result Report
Bagian 4: Test Result
Baris terakhir menampilkan ringkasan test result, yang menyatakan ‘1 test gagal, dan 2 berhasil’. Terdapat
pula informasi tambahan mengenai durasi test berjalan, yaitu 0.03 detik. Tentu saja, hal ini jauh lebih cepat
dibandingkan test secara manual.
Python – Unit Testing > Unit Testing > Membuat Unit Test Sederhana Menggunakan Pytest
26
1. Unit Testing
Jenis dan Keuntungan Test Lainnya
Sebelumnya, telah dipelajari bahwa unit test dapat menyimpan banyak waktu dibandingkan manual test. Namun,
masih banyak keuntungan dari unit testing, salah satunya unit testing bisa berperan sebagai dokumentasi.
import pytest Unit test yang telah dibuat bisa berperan sebagai
import row_to_list dokumentasi yang menginformasikan pengguna
lainnya terkait tujuan function.
def test_for_clean_row():
Argument Type Return value
assert row_to_list("2,081\t314,942\n") == \
["2,081", "314,942"] "2,081\t314,942\ Valid ["2,081",
n"
"314,942"]
def test_for_missing_area():
"\t293,410\n" Invalid None
assert row_to_list("\t293,410\n") is None
"1,463238,765\n" Invalid None
def test_for_missing_tab():
Pengguna dapat membuat ulang tabel return value
assert row_to_list("1,463238,765\n") is None hanya dengan mencocokan boolean expressions
pada assert statement.
Python – Unit Testing > Unit Testing > Jenis dan Keuntungan Test Lainnya
27
1. Unit Testing
Jenis dan Keuntungan Test Lainnya
Pada suatu kondisi, pengguna seringkali diminta untuk menebak kegunaan function dengan melihat test
modulenya. Hal ini bisa diselesaikan dengan menjalankan !cat diikuti dengan nama test module di IPython
console untuk melihat unit testsnya.
Python – Unit Testing > Unit Testing > Jenis dan Keuntungan Test Lainnya
28
1. Unit Testing
Jenis dan Keuntungan Test Lainnya
Berikut merupakan contoh package NumPy dalam github page-nya. NumPy mendapatkan kepercayaan lebih dari pengguna karena
badges-badges yang ditampilkan.
Menunjukkan berapa
banyak bagian code
base yang dilakukan
unit testing
Menunjukkan
apakah function
berhasil melewati
unit testing atau
tidak
Python – Unit Testing > Unit Testing > Jenis dan Keuntungan Test Lainnya
29
1. Unit Testing
Jenis dan Keuntungan Test Lainnya
Unit test juga mampu mengurangi downtime pada sistem produktif.
Python – Unit Testing > Unit Testing > Jenis dan Keuntungan Test Lainnya
30
1. Unit Testing
Jenis dan Keuntungan Test Lainnya
Hambatan akibat bad code yang diimplementasikan ke dalam sistem dapat dicegah dengan memanfaatkan continuous learning
atau CI.
Python – Unit Testing > Unit Testing > Jenis dan Keuntungan Test Lainnya
31
1. Unit Testing
Jenis dan Keuntungan Test Lainnya
Maka, dapat disimpulkan bahwa keuntungan unit test di antaranya yaitu:
● Memerlukan waktu yang lebih sedikit
● Meningkatkan dokumentasi kode
● Meningkatkan kepercayaan pengguna
● Mengurangi downtime
Python – Unit Testing > Unit Testing > Jenis dan Keuntungan Test Lainnya
32
1. Unit Testing
Jenis dan Keuntungan Test Lainnya
Python – Unit Testing > Unit Testing > Jenis dan Keuntungan Test Lainnya
33
1. Unit Testing
Jenis dan Keuntungan Test Lainnya
Python – Unit Testing > Unit Testing > Jenis dan Keuntungan Test Lainnya
34
1. Unit Testing
Jenis dan Keuntungan Test Lainnya Integration test
Python – Unit Testing > Unit Testing > Jenis dan Keuntungan Test Lainnya
35
1. Unit Testing
Jenis dan Keuntungan Test Lainnya End to end test
Python – Unit Testing > Unit Testing > Jenis dan Keuntungan Test Lainnya
36
Topik 2 – Assert
Statement
> assert actual is expected, message Disarankan untuk menuliskan message pada
E AssertionError: row_to_list('\t293,410\n') assertion statement karena lebih mudah
returned ['', '293,410'] dipahami. Selain itu, disarankan juga untuk
instead of None
menuliskan nilai dari variabel apapun yang dapat
assert ['', '293,410'] is None memudahkan debugging.
0.1 + 0.1 + 0.1 == 0.3 0.1 + 0.1 + 0.1 Python merepresentasikan float
sedikit berbeda seperti pada
False 0.30000000000000004 contoh di samping. Hal ini dapat
menggagalkan test.
assert 0.1 + 0.1 + 0.1 == 0.3, "Usual way to compare does not always
work with floats!"
pytest.approx() juga bisa digunakan pada NumPy arrays yang mengandung float.
Test akan berhasil apabila kedua assert statement berhasil, dan akan menampilkan
AssertionError apabila salah satu assert statement ada yang gagal.
Python – Unit Testing > Assert Statement > Testing untuk Exception
44
2. Assert Statement
Testing untuk Exception
Apabila fungsi dijalankan pada array satu dimensi, maka tidak akan menghasilkan apapun, melainkan
menimbulkan ValueError, yaitu salah satu jenis exception.
import numpy as np
dimensional
split_into_training_and_testing_sets(example_argument)
ValueError: Argument data array must be two dimensional. Got 1 dimensional array
instead!
Python – Unit Testing > Assert Statement > Testing untuk Exception
45
2. Assert Statement
Testing untuk Exception
Berikut merupakan contoh test untuk menguji apakah split_into_training_and_testing_set()
akan menimbulkan ValueError apabila diberikan array satu dimensi sebagai argumennya.
def test_valueerror_on_one_dimensional_argument():
example_argument = np.array([2081, 314942, 1059, 186606, 1148, 206186])
with pytest.raises(ValueError):
Python – Unit Testing > Assert Statement > Testing untuk Exception
46
2. Assert Statement
Testing untuk Exception
Struktur utama yang perlu diketahui adalah with statement.
with context_manager: with memiliki satu argument yang
disebut context manager.
print("This is part of the Seluruh code yang ada di dalam with
context") # any code
statement disebut sebagai context.
inside is the context
pytest.raises() memiliki satu argument ValueError. Context manager ini tidak menjalankan
code saat memasuki context, hanya saat meninggalkan context saja.
Apabila code dalam context menimbulkan ValueError, maka context manager akan membisukan error
tersebut. Namun apabila code tidak menimbulkan ValueError, maka context manager akan
menimbulkan exception.
Python – Unit Testing > Assert Statement > Testing untuk Exception
48
2. Assert Statement
Testing untuk Exception
Di bawah merupakan contoh di mana ValueError ditimbulkan dalam context namun dibisukan oleh context
manager., sehingga tidak menampilkan apapun pada output.
with pytest.raises(ValueError):
raise ValueError # context exits with ValueError
# <--- pytest.raises(ValueError) silences it
Di bawah ini merupakan contoh di mana tidak ada ValueError yang ditimbulkan di dalam context sehingga
context manager menimbulkan exception yang disebut Failed.
with pytest.raises(ValueError):
pass # context exits without raising a ValueError
# <--- pytest.raises(ValueError) raises Failed
Python – Unit Testing > Assert Statement > Testing untuk Exception
49
2. Assert Statement
Testing untuk Exception
def test_valueerror_on_one_dimensional_argument():
example_argument = np.array([2081, 314942, 1059, 186606, 1148, 206186]) with
pytest.raises(ValueError):
split_into_training_and_testing_sets(example_argument)
ValueError: Argument data array must be two dimensional. Got 1 dimensional array
instead!
Kembali pada unit testnya, kita gunakan function pada array satu dimensi di dalam context. Apabila
function menimbulkan ValueError seperti yang diekspektasikan, maka test berhasil. Apabila function
tidak menimbulkan ValueError, maka context manager akan menimbulkan Failed exception,
sehingga test dikatakan gagal.
Python – Unit Testing > Assert Statement > Testing untuk Exception
50
2. Assert Statement
Testing untuk Exception
ValueError: Argument data array must be two dimensional. Got 1 dimensional array
instead!
Kita juga dapat melakukan unit test terhadap detail dari exception. Contohnya, kita dapat menguji apakah
ValueError yang ditimbulkan sudah mengandung message yang sesuai atau belum. Dalam hal ini, message
yang sesuai diawali dengan “Argument data array must be two dimensional”.
Python – Unit Testing > Assert Statement > Testing untuk Exception
51
2. Assert Statement
Testing untuk Exception
def test_valueerror_on_one_dimensional_argument():
example_argument = np.array([2081, 314942, 1059, 186606, 1148, 206186])
with pytest.raises(ValueError) as exception_info: # store the exception
split_into_training_and_testing_sets(example_argument) # Check if
ValueError contains correct message
assert exception_info.match("Argument data array must be two dimensional. "
"Got 1 dimensional array instead!")
● Untuk menguji message, tambahkan as ke dalam with statement.
● exception_info menyimpan informasi tentang ValueError yang ditimbulkan dalam context.
● Setelah context selesai dijalankan, dilakukan uji apakah exception_info sudah memiliki message
yang sesuai dengan menggunakan assert statement disertai match() method. match() method
menggunakan string sebagai argumen dan menguji apakah string tersebut ada di dalam error message
atau tidak.
Python – Unit Testing > Assert Statement > Testing untuk Exception
52
2. Assert Statement
Well-tested Function
Perhatikan kembali function split_into_training_and_testing_sets(). Function tersebut
menggunakan array dua dimensi sebagai argumennya, kemudian memisahkan 75% barisnya secara acak
ke dalam training array, dan sisanya ke dalam training array. Function tersebut menghasilkan training dan
testing array sebagai dua tuple.
import numpy as np Karena function ini memiliki
example_argument = np.array([[2081,314942],#must be two karakteristik acak, maka yang diuji
[1059, 186606],dimentional adalah panjang dari training dan
[1148, 206186], testing array, bukan nilai yang ada di
dalamnya.
]
split_into_training_and_testing_sets(example_argument) Panjang dari training array menjadi
0.75 kali dari jumlah baris argumen.
Umumnya, semakin banyak argumen yang dicek, 10 int(0.75 * 10) = 7 10 - int(0.75 * 10) = 3
Apabila dijalankan test pada argument di atas, maka dapat dikatakan function sudah well tested.
Python – Unit Testing > Assert Statement > Test Driven Development
62
2. Assert Statement
Test Driven Development
Python – Unit Testing > Assert Statement > Test Driven Development
63
2. Assert Statement
Test Driven Development
Penulisan unit test diimplementasikan dalam sebuah code. Dengan melakukan penulisan unit test kita
dapat memastikan bahwa:
● Penulisan unit test tidak dapat ditunda prioritasnya
● Pertimbangan waktu penulisan unit test bergantung pada waktu implementasinya
● Kemungkinan arguments dan return values yang mencakup normal, special, dan bad arguments
Python – Unit Testing > Assert Statement > Test Driven Development
64
2. Assert Statement
Test Driven Development
Kita akan mengaplikasikan metode Test Driven Development dalam function convert_to_int()
convert_to_int("2,081")
2081
Python – Unit Testing > Assert Statement > Test Driven Development
65
2. Assert Statement
Test Driven Development
Step 1: Menuliskan unit test dan menetapkan requirements
Python – Unit Testing > Assert Statement > Test Driven Development
66
2. Assert Statement
Test Driven Development
Step 2: Jalankan Unit Test dan Lihat Kegagalannya
!pytest test_convert_to_int.py
Python – Unit Testing > Assert Statement > Test Driven Development
67
2. Assert Statement
Test Driven Development
Step 3: Implementasikan Fungsi dan Jalankan Ulang Unit Test
def convert_to_int(): Terakhir, implementasikan fungsi
... dan jalankan ulang test.
!pytest test_convert_to_int.py
Bagian ini menampilkan
informasi bahwa fungsi yang
telah diimplementasikan sudah
benar.
Python – Unit Testing > Assert Statement > Test Driven Development
68
2. Assert Statement
Test Driven Development
Output tertulis “collected 6 items” menandakan bahwa ditemukan 6 unit test yang akan dijalankan.
Baris selanjutnya memuat nama test module, yaitu test_convert_to_int.py, tanpa diikuti “.F.” yang
berarti hasil unit test tidak mengalami kegagalan.
Python – Unit Testing > Assert Statement > Test Driven Development
69
Topik 3 – Mengelola
Kumpulan Tests
...
Python – Unit Testing > Mengelola Kumpulan Test > Test Execution
77
3. Mengelola Kumpulan Test
Test Execution
Test Organization
Folder tersebut berisi mirror packages yang masing-masing berisi test module
Python – Unit Testing > Mengelola Kumpulan Test > Test Execution
78
3. Mengelola Kumpulan Test
Test Execution
Test Organization
Python – Unit Testing > Mengelola Kumpulan Test > Test Execution
80
3. Mengelola Kumpulan Test
Test Execution
cd tests
pytest
Command tersebut secara otomatis menemukan tests dengan mengulang ke subtree dari direktori
dan mengidentifikasi seluruh file dengan nama yang dimulai dengan “test_” sebagai test modul.
Selanjutnya unit test ini dikumpulkan dan dijalankan seluruhnya secara bersamaan.
Python – Unit Testing > Mengelola Kumpulan Test > Test Execution
81
3. Mengelola Kumpulan Test
Test Execution
Berikut merupakan hasil dari command pytest. Test yang ditulis sebanyak 16, dengan keterangan 15
berhasil dan 1 gagal.
Python – Unit Testing > Mengelola Kumpulan Test > Test Execution
82
3. Mengelola Kumpulan Test
Test Execution
Umumnya, command dijalankan di dalam CI server setelah commit di-push ke code base.
Pertanyaannya, apakah seluruh unit test pasti berhasil dilewati?
Python – Unit Testing > Mengelola Kumpulan Test > Test Execution
83
3. Mengelola Kumpulan Test
Test Execution
pytest -x
Python – Unit Testing > Mengelola Kumpulan Test > Test Execution
84
3. Mengelola Kumpulan Test
Test Execution
Python – Unit Testing > Mengelola Kumpulan Test > Test Execution
85
3. Mengelola Kumpulan Test
Test Execution
pytest data/test_preprocessing_helpers.py
Python – Unit Testing > Mengelola Kumpulan Test > Test Execution
86
3. Mengelola Kumpulan Test
Test Execution
Python – Unit Testing > Mengelola Kumpulan Test > Test Execution
87
3. Mengelola Kumpulan Test
Test Execution
Pytest menetapkan node ID ke setiap test class dan unit test yang ditemuinya. Node ID dari test class
merupakan path ke module test yang diikuti dengan nama test class, dipisahkan oleh dua titik dua.
Penulisan node ID dari unit test juga mengikuti format yang sama dengan nama unit test ditambahkan di
bagian akhir menggunakan pemisah titik dua ganda lainnya
Python – Unit Testing > Mengelola Kumpulan Test > Test Execution
88
3. Mengelola Kumpulan Test
Test Execution
● Menjalankan test class: TestRowToList
pytest data/test_preprocessing_helpers.py::TestRowToList
Python – Unit Testing > Mengelola Kumpulan Test > Test Execution
89
3. Mengelola Kumpulan Test
Test Execution
● Menjalankan unit class: test_on_one_tab_with_missing_value()
pytest data/test_preprocessing_helpers.py::TestRowToList::test_on_one_tab_with_missing_value
Python – Unit Testing > Mengelola Kumpulan Test > Test Execution
90
3. Mengelola Kumpulan Test
Test Execution
Selain dengan node ID, kita juga dapat melakukan dengan cara yang lebih cepat dan fleksibel
menggunakan keyword expressions.
pytest -k "pattern"
Untuk menjalankan test menggunakan keyword expressions, kita dapat menggunakan -k option.
Opsi ini mengambil string yang dikutip berisi pattern sebagai valuenya.
Python – Unit Testing > Mengelola Kumpulan Test > Test Execution
91
3. Mengelola Kumpulan Test
Test Execution
● Menjalankan test class: TestSplitIntoTrainingAndTestingSets
pytest -k "TestSplitIntoTrainingAndTestingSets"
pytest -k "TestSplit"
Kita juga dapat memasukkan sebagian dari nama test class saja, asalkan nama tersebut unik. proses ini
dapat menghemat banyaknya penulisan dengan output yang sama.
Python – Unit Testing > Mengelola Kumpulan Test > Test Execution
92
3. Mengelola Kumpulan Test
Test Execution
Bahkan kita juga dapat menggunakan operator logika Python dalam pattern untuk melakukan subset
yang lebih kompleks. Misalnya, pada command berikut akan menjalankan semua test di
TestSplitIntoTrainingAndTestingSets kecuali unit test test_on_one_row(), yang hanya
menyisakan satu test untuk dijalankan.
Python – Unit Testing > Mengelola Kumpulan Test > Test Execution
93
3. Mengelola Kumpulan Test
Expected Failures dan Conditional Skipping
Jika test berhasil dilalui, maka test suite akan berwarna hijau dan kita sudah bisa bersantai
menggunakan function tersebut.
Jika test gagal, maka test suite akan berwarna merah dan pengguna masih harus memperbaiki function
tersebut.
Namun, seringkali warna merah pada test suite merupakan false alarm yang mengganggu.
Python – Unit Testing > Mengelola Kumpulan Test > Expected Failures dan Conditional Skipping
94
3. Mengelola Kumpulan Test
Expected Failures dan Conditional Skipping
Apabila pengguna menjalankan pytest, akan dihasilkan error karena train_model() belum
diimplementasikan.
Hal ini hanyalah akibat dari
penggunaan TDD, bukan
mengindikasikan masalah
pada code.
Python – Unit Testing > Mengelola Kumpulan Test > Expected Failures dan Conditional Skipping
95
3. Mengelola Kumpulan Test
Expected Failures dan Conditional Skipping
Pengguna bisa mengatur pytest agar memperlakukan hal tersebut sebagai kesalahan yang sudah
diantisipasi, atau expected failure, dengan menggunakan xfail decorator.
Python – Unit Testing > Mengelola Kumpulan Test > Expected Failures dan Conditional Skipping
96
3. Mengelola Kumpulan Test
Expected Failures dan Conditional Skipping
Terkadang, terdapat suatu tests yang gagal hanya apabila berada di suatu kondisi tertentu. Pada hal
inipengguna tidak perlu diberikan informasi error terkait. Situasi tersebut biasanya terjadi pada saat
suatu funtion tidak mau bekerja di bawah python versi tertentu.
class TestConvertToInt(object):
def test_with_no_comma(self):
"""Only runs on Python 2.7 or lower""" test_argument = "756"
expected = 756
actual = convert_to_int(test_argument)
message = unicode("Expected: 2081, Actual: {0}".format(actual))
assert actual == expected, message
Sebagai contoh, ditambahkan function unicode() dalam failure message yang menunjukkan bahwa
function tersebut hanya bisa dijalankan pada python versi 2.7 atau dibawahnya.
Python – Unit Testing > Mengelola Kumpulan Test > Expected Failures dan Conditional Skipping
97
3. Mengelola Kumpulan Test
Expected Failures dan Conditional Skipping
Jika pengguna menjalankan pytest pada Python 3, test suite akan berwarna merah.
pytest
Python – Unit Testing > Mengelola Kumpulan Test > Expected Failures dan Conditional Skipping
98
3. Mengelola Kumpulan Test
Expected Failures dan Conditional Skipping
Untuk memberitahu pytest agar melewati / skip penjalanan test pada Python apabila Python memiliki
versi lebih tinggi dari 2.7, digunakan decorator skipit. Syntax skipit mirip dengan xfail. Nama dari
decorator-nya adalah pytest.mark.skipif
class TestConvertToInt(object): Argumennya
@pytest.mark.skipif(boolean_expression) berupa boolean
def test_with_no_comma(self): expression, di
"""Only runs on Python 2.7 or lower"""
mana apabila
True maka test
test_argument = "756"
tersebut akan
expected = 756
diskip.
actual = convert_to_int(test_argument)
message = unicode("Expected: 2081, Actual: {0}".format(actual))
class TestConvertToInt(object):
@pytest.mark.skipif(sys.version_info> (2, 7), reason="requires Python 2.7")
def test_with_no_comma(self):
"""Only runs on Python 2.7 or lower""" test_argument = "756"
expected = 756
actual = convert_to_int(test_argument)
message = unicode("Expected: 2081, Actual: {0}".format(actual))
assert actual == expected, message
Python – Unit Testing > Mengelola Kumpulan Test > Expected Failures dan Conditional Skipping
100
3. Mengelola Kumpulan Test
Expected Failures dan Conditional Skipping
Apabila menjalankan pytest lagi maka akan terkonfirmasi bahwa ada satu test yang xfailed dan ada
satu test yang dilewati. Test suite akan tetap berwarna hijau.
pytest
Python – Unit Testing > Mengelola Kumpulan Test > Expected Failures dan Conditional Skipping
101
3. Mengelola Kumpulan Test
Expected Failures dan Conditional Skipping
Alasan dari skipping test dapat ditampilkan di report dengan menuliskan -r option. -r option bisa juga
disertai dengan karakter.
pytest -r[set_of_characters] Apabila ditambahkan
karakter s, maka tests yang
dilewati akan ditampilkan
pada bagian rangkuman test
kecil di akhir report.
Python – Unit Testing > Mengelola Kumpulan Test > Expected Failures dan Conditional Skipping
102
3. Mengelola Kumpulan Test
Expected Failures dan Conditional Skipping
xfail decorator juga memiliki argumen tambahan reason
...
Python – Unit Testing > Mengelola Kumpulan Test > Expected Failures dan Conditional Skipping
103
3. Mengelola Kumpulan Test
Expected Failures dan Conditional Skipping
Apabila ditambahkan karakter x pada option -r, maka Apabila ditambahkan karakter s dan x, maka akan
akan ditampilkan test yang xfailed beserta alasannya. ditampilkan alasan untuk xfailed dan skipped test
Python – Unit Testing > Mengelola Kumpulan Test > Expected Failures dan Conditional Skipping
104
3. Mengelola Kumpulan Test
Expected Failures dan Conditional Skipping
xfail dan skip test dapat dilakukan pada lebih dari satu tests, dengan menempatkan decorators ke
seluruh test class dengan menuliskannya di atas class.
Contoh menerapkan xfail pada seluruh tests di dalam class:
@pytest.mark.xfail(reason="“Using TDD, train_model() is not implemented") class
TestTrainModel(object):
...
class TestConvertToInt(object):
...
Python – Unit Testing > Mengelola Kumpulan Test > Expected Failures dan Conditional Skipping
105
3. Mengelola Kumpulan Test
Continuous Integration dan Cove Coverage
Pada topik pertama, telah dipelajari bagaimana NumPy meningkatkan
kepercayaan penggunanya dengan badges yang ditampilkan pada laman
GitHubnya.
Python – Unit Testing > Mengelola Kumpulan Test > Continuous Integration dan Cove Coverage
106
3. Mengelola Kumpulan Test
Continuous Integration dan Cove Coverage
Untuk mengintegrasikan sistem dengan Travis CI, pertama-tama buat file settings dengan
nama .travis.yml di root repository. File tersebut disusun dalam bagian-bagian sebagai berikut.
1. Language/bahasa pemrograman yang diatur menjadi
language: python python:
Python
2. Python untuk mendefinisikan versi Python yang - "3.6"
digunakan install:
3. Install berisi daftar commands untuk menginstall
- pip install -e . script:
project dan dependencies ke dalam CI server
4. Script berisi commands untuk menjalankan test - pytest tests
Python – Unit Testing > Mengelola Kumpulan Test > Continuous Integration dan Cove Coverage
107
3. Mengelola Kumpulan Test
Continuous Integration dan Cove Coverage
Setelah file setting di-push ke GitHub, selanjutnya Install Travis CI dengan langkah-langkah berikut:
Python – Unit Testing > Mengelola Kumpulan Test > Continuous Integration dan Cove Coverage
108
3. Mengelola Kumpulan Test
Continuous Integration dan Cove Coverage
Kemudian kita akan diarahkan ke Travis CI, login menggunakan akun GitHub, dan menampilkan
dashboard Travis CI.
Python – Unit Testing > Mengelola Kumpulan Test > Continuous Integration dan Cove Coverage
109
3. Mengelola Kumpulan Test
Continuous Integration dan Cove Coverage
Berikut merupakan tampilan seteleh badge di-klik.
Python – Unit Testing > Mengelola Kumpulan Test > Continuous Integration dan Cove Coverage
110
3. Mengelola Kumpulan Test
Continuous Integration dan Cove Coverage
Selanjutnya adalah cara menampilkan code coverage badge. Code coverage
badge mengindikasikan seberapa sering code dilakukan test Nilai persentase
yang tinggi (di atas 75%) menunjukkan code yang well-tested.
Python – Unit Testing > Mengelola Kumpulan Test > Continuous Integration dan Cove Coverage
111
3. Mengelola Kumpulan Test
Continuous Integration dan Cove Coverage
Step 2: Install Codecov. Untuk menambahkan codecov di repository pengguna, install Codevow app di
GitHub marketplace seperti yang sebelumnya sudah dilakukan untuk Travis CI.
Python – Unit Testing > Mengelola Kumpulan Test > Continuous Integration dan Cove Coverage
112
3. Mengelola Kumpulan Test
Continuous Integration dan Cove Coverage
Ketika pengguna menekan commit, code coverage report akan muncul di Codecov, dapat di akses di
codecov.io, setelah Travis CI menyelesaikan build-nya.
Python – Unit Testing > Mengelola Kumpulan Test > Continuous Integration dan Cove Coverage
113
3. Mengelola Kumpulan Test
Setup dan Teardown
Perhatikan function preprocess() sebagai contoh.
Python – Unit Testing > Mengelola Kumpulan Test > Setup dan Teardown
114
3. Mengelola Kumpulan Test
Setup dan Teardown
preprocess() berbeda dengan function lainnya karena ia memiliki suatu precondition untuk
berjalan dengan benar. Preconditionnya berupa adanya raw data file di dalam environment.
The environment
Python – Unit Testing > Mengelola Kumpulan Test > Setup dan Teardown
115
3. Mengelola Kumpulan Test
Setup dan Teardown
Untuk function preprocess, perlu dibuat test
def test_on_raw_data(): # Setup: create the
raw data file
test_on_raw_data().
preprocess(raw_data_file_path, Step 1, buat file raw data terlebih dahulu. Step ini
clean_data_file_path )
disebut sebagai setup, yakni mempersiapkan
environment hingga siap untuk dilakukan testing.
with open(clean_data_file_path) as
f: lines = f.readlines() Step 2 Assert. Kemudian function preprocess()
first_line = lines[0] digunakan untuk menghasilkan file baru clean data. Kita
assert first_line == "1801\t201411\ perlu membuka file tersebut, membacanya, dan
n" second_line = lines[1] melakukan assert bahwa file tersebut sudah berisi
assert second_line == "2002\t333209\n" informasi yang benar.
# Teardown: remove raw and clean data file Step 3 Teardown. File raw dan clean data dihapus dari
environment untuk mengembalikan environment ke
dalam kondisi awal.
Python – Unit Testing > Mengelola Kumpulan Test > Setup dan Teardown
116
3. Mengelola Kumpulan Test
Setup dan Teardown
Kesimpulannya, melainkan menggunakan assert statement secara sequential, kita perlu menggunakan
workflow baru Setup → Assert → Teardown
import pytest
Dalam pytest, setup dan teardown berada di luar test,
melainkan merupakan bagian dari
@pytest.fixture
function .fixture.
def my_fixture():
# Do setup here Bagian pertama merupakan setup, kemudian
yield data menghasilkan data yang akan digunakan pada test.
# Do teardown here Fixture menggunakan yield keyword.
def test_something(my_fixture):
Selanjutnya merupakan bagian teardown yang akan
...
dijalankan setelah test selesai.
data = my_fixture
Test dapat mengakses data tersebut dengan
...
mendefinisikan my_fixture sebagai data.
Python – Unit Testing > Mengelola Kumpulan Test > Setup dan Teardown
117
3. Mengelola Kumpulan Test
Setup dan Teardown
@pytest.fixture def test_on_raw_data(raw_and_clean_data_file):
def raw_and_clean_data_file(): raw_path, clean_path = raw_and_clean_data_file
raw_data_file_path = "raw.txt" preprocess(raw_path, clean_path)
clean_data_file_path = "clean.txt" with open(clean_data_file_path)
with open(raw_data_file_path, "w") as f: as f: lines =
f.write("1,801\t201,411\n" f.readlines()
"1,767565,112\n"
first_line = lines[0]
"2,002\t333,209\n"
assert first_line == "1801\
"1990\t782,911\n"
t201411\n" second_line =
"1,285\t389129\n" )
lines[1]
yield raw_data_file_path, clean_data_file_path
assert second_line == "2002\t333209\n"
os.remove(raw_data_file_path)
os.remove(clean_data_file_path
Berikut merupakan fixture raw_and_clean_data_file() yang telah dibuat. Dalam setup, dituliskan path dari raw dan
clean data. Kemudian, akan dilanjutkan dengan assert statement dari test test_on_raw_data(). Dalam teardown,
raw dan clean data dihapuskan menggunakan os.remove() function.
Python – Unit Testing > Mengelola Kumpulan Test > Setup dan Teardown
118
3. Mengelola Kumpulan Test
Setup dan Teardown
Terdapat built-in pytest fixture tmpdir, yang berguna saat sedang mempersiapkan file. tmpdir membuat
direktori sementara selama setup yang akan terhapus saat teardown.
@pytest.fixture
def raw_and_clean_data_file(tmpdir):
fixture tmpdir dapat digunakan sebagai
raw_data_file_path = tmpdir.join("raw.txt")
argument di dalam fixture
clean_data_file_path = tmpdir.join("clean.txt") raw_and_clean_data_file, atau disebut juga
with open(raw_data_file_path, "w") as f: sebagai fiture chaining.
f.write("1,801\t201,411\n" Setup tmpdir dijalankan terlebih dahulu
"1,767565,112\n"
kemudian baru setup dari fixture kita.
"2,002\t333,209\n"
"1990\t782,911\n" Pengguna dapat menghilangkan bagian
"1,285\t389129\n") teardown dari fixture karena sudah dihapuskan
yield raw_data_file_path, clean_data_file_path pada fixture tmpdir.
# No teardown code necessary
Python – Unit Testing > Mengelola Kumpulan Test > Setup dan Teardown
119
3. Mengelola Kumpulan Test
Mocking
Mocking merupakan cara untuk menguji function secara independen, terlepas dari dependencies yang
dimilikinya. Untuk menggunakan mocking, diperlukan dua package yaitu pytest-mock dan
unittest.mock
convert_to_int()
clean
def test_on_raw_data(raw_and_clean_data_file,
mocker,):
raw_path, clean_path = raw_and_clean_data_file
row_to_list_mock = mocker.patch(...)
Argument pertama dari mocker.patch adalah nama dari dependencies termasuk nama modulenya.
preprocess() mengenal
def test_on_raw_data(raw_and_clean_data_file, row_to_list() sebagai
mocker, ): data.preprocessing_helpers.
raw_path, clean_path = raw_and_clean_data_file row_to_list sehingga itulah yang
row_to_list_mock = akan dituliskan di patch.
mocker.patch( "data.preprocessing_helpers.row_to_lis mocker.patch() method
t") menghasilkan MagicMock object yang
unittest.mock.MagicMock() disimpan ke dalam variabel
row_to_list_mock.
def test_on_raw_data(raw_and_clean_data_file,mocker, ):
raw_path, clean_path = raw_and_clean_data_file
row_to_list_mock = mocker.patch(
"data.preprocessing_helpers.row_to_list",
side_effect = row_to_list_bug_free)
preprocess(raw_path, clean_path)
def test_on_raw_data(raw_and_clean_data_file,mocker, ):
[call("1,801\t201,411\n"),
raw_path, clean_path = raw_and_clean_data_file
call("1,767565,112\n"), row_to_list_mock = mocker.patch(
call("2,002\t333,209\n"), "data.preprocessing_helpers.row_to_list",
call("1990\t782,911\n"), side_effect = row_to_list_bug_free)
call("1,285\t389129\n") preprocess(raw_path, clean_path)
] assert row_to_list_mock.call_args_list == [ call("1,801\
t201,411\n"), call("1,767565,112\n"),
call("2,002\t333,209\n"), call("1990\t782,911\n"),
call("1,285\t389129\n") ]
Sekarang saatnya melakukan train model linear regression menggunakan function train_model().
from scipy.stats import linregress
linregress() melakukan regresi
linear terhadap dua kolom.
def train_model(training_set):
slope, intercept, _, _, _ = linregress(training_set[:, 0],
training_set[:, 1])
return slope, intercept
Python – Unit Testing > Mengelola Kumpulan Test > Testing Model
127
3. Mengelola Kumpulan Test
Testing Model
Function train_model() melakukan proses regresi linear yang kompleks, sehingga kita tidak bisa secara
mudah mengetahui prediksi best fit line. Dan karena kita tidak mengetahui return value yang
diekspektasikan, kita tidak bisa menguji function tersebut. Hal ini berlaku tidak hanya pada linear
regression, namun juga seluruh model data science.
Python – Unit Testing > Mengelola Kumpulan Test > Testing Model
128
3. Mengelola Kumpulan Test
Testing Model
Alternatif 1 - menggunakan data buatan atau training set yang sudah diketahui dan mudah untuk dihitung
return valuenya.
import pytest import numpy as np digunakan dataset yang
from models.train import train_model mengikuti persamaan
price = 2 * area
def test_on_linear_data(): + 1
test_argument = np.array([[1.0, 3.0],
[2.0, 5.0],
[3.0, 7.0] ] )
expected_slope = 2.0
expected_intercept = 1.0
slope, intercept = train_model(test_argument) Karena dataset mengikuti persamaan garis lurus,
assert slope == pytest.approx(expected_slope) maka fit linenya akan berupa garis lurus.
assert intercept == pytest.approx( Sehingga, nilai slope yang dihasilkan haruslah 2
expected_intercept dengan intercept 1. Ini bisa digunakan dalam
) assert statement untuk pengujian.
Python – Unit Testing > Mengelola Kumpulan Test > Testing Model
129
3. Mengelola Kumpulan Test
Testing Model
Alternatif 2 - menggunakan inequalities. Contohnya pada test test_on_positively_correlated_data(),
digunakan dataset yang berkorelasi positif
import numpy as np
from models.train import train_model
def test_on_positively_correlated_data():
test_argument = np.array([[1.0, 4.0], [2.0, 4.0],
[3.0, 9.0], [4.0, 10.0]
] )
slope, intercept = train_model(test_argument)
assert slope > 0
Dalam kondisi ini, kita tidak bisa memrediksi best
fit line, namun kita bisa melakukan assert bahwa
best fit line memiliki slope yang lebih besar dari 0.
Python – Unit Testing > Mengelola Kumpulan Test > Testing Model
130
3. Mengelola Kumpulan Test
Testing Model
Kita tidak boleh tidak menguji model hanya karena modelnya kompleks. Lakukan segala jenis pengujian,
karena hal ini akan menyelamatkan kita dari debugging yang lebih rumit di tahap selanjutnya.
Python – Unit Testing > Mengelola Kumpulan Test > Testing Model
131
3. Mengelola Kumpulan Test
Testing Model
from data.preprocessing_helpers Setelah training function sudah
import preprocess diuji, maka function sudah bisa
from features.as_numpy digunakan untuk menemukan best
import get_data_as_numpy_array fit line untuk housing data.
from models.train import split_into_training_and_testing_sets,
train_model
train_model(training_set)
preprocess("data/raw/housing_data.txt",
"data/clean/clean_housing_data.txt") 151.78430060614986
17140.77537937442
data = get_data_as_numpy_array(
"data/clean/clean_housing_data.txt", 2)
training_set, testing_set = (
split_into_training_and_testing_sets(data))
slope, intercept = train_model(training_set)
Python – Unit Testing > Mengelola Kumpulan Test > Testing Model
132
3. Mengelola Kumpulan Test
Testing Model
Langkah selanjutnya adalah menguji performa model menggunakan model_test() function. testing set
digunakan sebagai argumen pertama, kemudian slope dan intercept sebagai hasil yang akan dikeluarkan
oleh model, kemudian dilakukan uji performa pada data testing tersebut.
Python – Unit Testing > Mengelola Kumpulan Test > Testing Model
133
3. Mengelola Kumpulan Test
Testing Plot
Test juga bisa dilakukan pada plot yang dibuat menggunakan matplotlib.
def get_plot_for_best_fit_line(slope,
matplotlib memiliki module plots.py. Modul ini mengandung
intercept, x_array, y_array, title ):
function get_plot_for_best_fit_line(). Modul ini menggunakan
"""
slope: slope of best fit line slope, intercept sebagai argumennya. Selain itu juga ada
intercept: intercept of best fit x_array dan y_array dari dataset, dan yang terakhir adalah
line x_array: array containing title.
housing areas y_array: array Function akan menghasilkan figure matplotlib.
containing housing prices title:
title of the plot
Returns: matplotlib.figure.Figure()
"""
Python – Unit Testing > Mengelola Kumpulan Test > Testing Model
134
3. Mengelola Kumpulan Test
Testing Plot
Setelah mendapatkan hasil dari train_model(), kita bisa gunakan function plotting seperti pada contoh
sehingga menghasilkan plot seperti pada gambar di bawah.
...
preprocess(...)
data = get_data_as_numpy_array(...) training_set,
testing_set = (
split_into_training_and_testing_sets(data)
)
slope, intercept = train_model(training_set)
get_plot_for_best_fit_line(slope, intercept,
training_set[:, 0], training_set[:, 1],
"Training"
Python – Unit Testing > Mengelola Kumpulan Test > Testing Plot
135
3. Mengelola Kumpulan Test
Testing Plot
Testing strategy untuk plot mencakup dua cara, yaitu one-time baseline generation dan testing.
Python – Unit Testing > Mengelola Kumpulan Test > Testing Plot
136
3. Mengelola Kumpulan Test
Testing Plot
Testing strategy untuk plot mencakup dua cara, yaitu one-time baseline generation dan testing.
Python – Unit Testing > Mengelola Kumpulan Test > Testing Plot
137
3. Mengelola Kumpulan Test
Testing Plot
Karena gambar yang dihasilkan dari os berbeda akan ditampilkan dengan sedikit berbeda juga, maka kita
perlu menggunakan pytest plugin pytest-mpl untuk komparasi image. Library ini mampu mengabaikan
perbedaan os dan memudahkan kita untuk memproduksi baseline image
Python – Unit Testing > Mengelola Kumpulan Test > Testing Plot
138
3. Mengelola Kumpulan Test
Testing Plot
Perhatikan contoh berikut.
Python – Unit Testing > Mengelola Kumpulan Test > Testing Plot
139
3. Mengelola Kumpulan Test
Testing Plot
pytest memerlukan baseline image untuk disimpan di folder ‘baseline’ relatif terhadap test modul
test_plots.py. Untuk membuat baseline image, kita bisa menjalankan test dengan command line argument
–mpl-generate-path dan tambahkan path ke folder yang diinginkan.
!pytest -k "test_plot_for_linear_data"
--mpl-generate-path
visualization/baseline
Python – Unit Testing > Mengelola Kumpulan Test > Testing Plot
140
3. Mengelola Kumpulan Test
Testing Plot
Di lain waktu saat kita menjalankan test, kita harus menggunakan option –mpl dengan pytest command.
Hal ini akan membuat pytest meng-compare baseline image dengan gambar aktual. Jika gambar identik,
maka test akan berhasil.
!pytest -k "test_plot_for_linear_data" --mpl
Python – Unit Testing > Mengelola Kumpulan Test > Testing Plot
141
3. Mengelola Kumpulan Test
Testing Plot
Jika test gagal, maka pytest akan menyimpan baseline image, actual image, dan image yang berisi
perbedaan piksel antara keduanya ke dalam temporary directory.
!pytest -k "test_plot_for_linear_data" --mpl
Python – Unit Testing > Mengelola Kumpulan Test > Testing Plot
142
Summary
1. Testing merupakan kegiatan untuk menguji kesesuaian cara kerja function secara otomatis
2. Testing meningkatkan kepercayaan pengguna terhadap suatu function dengan proses pengujian yang
lebih cepat dan efektif.
3. Package pytest berguna untuk menguji hasil luaran function dan exceptions
4. Agar suatu function dikatakan well-tested, testing dilakukan pada tiga jenis argument, yaitu normal,
special, dan bad arguments
5. Test Driven Development merupakan best practice dalam testing di mana tests dituliskan sebelum
diimplementasi.
6. Beberapa function khusus perlu mengikuti skema setup - assert - teardown dalam pengujiannya.
7. Selain function, tests juga dilakukan pada model dan plot.
2. Untuk mendapatkan output test yang sesuai, dilakukan sebuah prosedur standar yang disebut ______
e. Testing Mechanism
f. Testing Type
g. Test Cast
h. Test Scope
4. Aplikasi berlapis bisa memiliki front end untuk mengatasi presentasi dan _______ untuk mengeksekusi
logika bisnis.
e. a) Objects
f. b) Classes
g. c) Servlet
h. d) Back end
get_data_as_numpy_array() menggunakan path untuk ke file clean data sebagai argument pertama, dan jumlah
kolom pada data sebagai argument kedua. Function akan menghasilkan data dalam NumPy array. Sebelumnya, kita
telah menulis test test_on_clean_file() tanpa menggunakan fixture. Itu merupakan bad practice. Sekarang, gunakan
fixture clean_data_file() yang mampu:
Overview Direction
Pada modul ini, user akan mendapatkan penjelasan 1. Menjelaskan apa, bagaimana dan tujuan dari
tentang Testing untuk data science, di modul ini juga kegiatan;
terdapat penjelasan unit testing, assert, data set, 2. Mengatur dan mengelola arah dan jalannya
mocking diskusi;
3. Memberikan contoh-contoh, kasus dan ilustrasi;
Peralatan yang dibutuhkan 4. Memberikan apresiasi dalam tanya jawab;
5. Memberikan debrief atau insight/pesan dari
kegiatan;
Offline: Proyektor 6. Memberikan dan menyampaikan kesimpulan dan
Online: Link zoom, laptop di tiap sesi atau di akhir sesi.