Tutorial PyTest: Apa itu PyTest? (dengan Contoh)
โก Ringkasan Cerdas
Pytest adalah sebuah Python Kerangka kerja pengujian yang membantu Anda menulis pengujian sederhana dan terukur untuk basis data, API, dan antarmuka pengguna. Kerangka kerja ini mendukung fixture, parameterisasi, marker, eksekusi paralel, dan pelaporan pernyataan yang detail, mulai dari pengujian unit dasar hingga pengujian fungsional yang kompleks.

uji coba merupakan salah satu kerangka kerja pengujian yang paling banyak digunakan di Python Ekosistem ini menjaga agar kode pengujian tetap singkat dan mudah dibaca, menemukan pengujian secara otomatis, dan berkembang dari pernyataan pertama menjadi rangkaian pengujian lengkap untuk basis data, API, dan antarmuka pengguna. Bagian di bawah ini akan membahas instalasi, pernyataan, fixture, marker, parameterisasi, dan eksekusi paralel dengan contoh praktis.
Apa itu Pytest?
uji coba adalah kerangka kerja pengujian yang memungkinkan Anda menulis kode pengujian menggunakan Python Bahasa pemrograman ini membantu Anda menulis kasus uji yang sederhana dan terukur untuk basis data, API, dan bahkan antarmuka pengguna. Pytest terutama digunakan untuk menulis pengujian untuk API, dan dapat diskalakan dari pengujian unit sederhana hingga pengujian fungsional yang kompleks.
Mengapa menggunakan Pytest?
Beberapa keunggulan pytest adalah:
- Sangat mudah untuk memulai, karena sintaksnya sederhana dan bersih.
- Dapat menjalankan tes secara paralel.
- Dapat menjalankan pengujian spesifik atau sebagian dari pengujian.
- Mendeteksi tes secara otomatis.
- Bisa melewatkan tes.
- Sumber terbuka.
Cara menginstal Pytest
Berikut adalah proses instalasi pytest:
Langkah 1) Anda dapat menginstal pytest dengan perintah di bawah ini.
pip install pytest==2.9.1
Setelah instalasi selesai, Anda dapat mengkonfirmasinya dengan perintah berikut.
py.test -h
Ini akan menampilkan bantuan.
Contoh Pytest Dasar Pertama
Sekarang, Anda akan mempelajari cara menggunakan pytest dengan contoh pytest dasar.
Buat folder bernama study_pytest. Anda akan membuat file pengujian di dalam folder ini. Silakan masuk ke folder tersebut di baris perintah Anda. Buat file bernama test_sample1.py di dalam folder tersebut.
Tambahkan kode di bawah ini ke dalamnya dan simpan.
import pytest def test_file1_method1(): x=5 y=6 assert x+1 == y,"test failed" assert x == y,"test failed" def test_file1_method2(): x=5 y=6 assert x+1 == y,"test failed"
Jalankan pengujian menggunakan perintah di bawah ini.
py.test
Anda akan mendapatkan hasil sebagai berikut.
test_sample1.py F.
============================================== FAILURES ========================================
____________________________________________ test_sample1 ______________________________________
def test_file1_method1():
x=5
y=6
assert x+1 == y,"test failed"
> assert x == y,"test failed"
E AssertionError: test failed
E assert 5 == 6
test_sample1.py:6: AssertionError
Di sini, dalam test_sample1.py F., huruf F berarti kegagalan dan titik (.) berarti keberhasilan. Di bagian kegagalan, Anda dapat melihat metode yang gagal dan baris kegagalannya. Di sini x==y berarti 5==6, yang salah.
Selanjutnya, Anda akan mempelajari tentang assertion di pytest.
Pernyataan dalam Pytest
Assertion Pytest adalah pemeriksaan yang mengembalikan status True atau False. Dalam Pytest, jika sebuah assertion gagal dalam sebuah metode pengujian, maka eksekusi metode tersebut dihentikan di situ. Kode yang tersisa dalam metode pengujian tersebut tidak dieksekusi, dan Pytest melanjutkan ke metode pengujian berikutnya.
Contoh pernyataan Pytest:
assert "hello" == "Hai" is an assertion failure. assert 4==4 is a successful assertion assert True is a successful assertion assert False is an assertion failure.
Pertimbangkan hal berikut ini.
assert x == y,"test failed because x=" + str(x) + " y=" + str(y)
Tempatkan kode ini di dalam test_file1_method1() sebagai pengganti pernyataan di bawah ini.
assert x == y,"test failed"
Menjalankan tes akan memberikan kegagalan sebagai AssertionError: pengujian gagal x=5 y=6.
Bagaimana Pytest Mengidentifikasi File Pengujian dan Metode Pengujian
Secara default, pytest hanya mengidentifikasi nama file yang diawali dengan uji_ atau diakhiri dengan _uji sebagai file pengujian. Kita dapat menyebutkan nama file lain secara eksplisit (akan dijelaskan nanti). Pytest mengharuskan nama metode pengujian dimulai dengan ujiSemua nama metode lainnya diabaikan, bahkan jika kita secara eksplisit meminta untuk menjalankan metode tersebut.
Lihat beberapa contoh nama file pytest yang valid dan tidak valid.
test_login.py - valid login_test.py - valid testlogin.py -invalid logintest.py -invalid
Catatan: Ya, kita dapat secara eksplisit meminta pytest untuk memilih testlogin.py dan logintest.py.
Lihat beberapa contoh metode pengujian pytest yang valid dan tidak valid.
def test_file1_method1(): - valid def testfile1_method1(): - valid def file1_method1(): - invalid
Catatan: Bahkan jika kita secara eksplisit menyebutkan file1_method1(), pytest tidak akan menjalankan metode ini.
Jalankan Beberapa Tes Dari File Tertentu dan Banyak File
Saat ini, di dalam folder study_pytest, kita memiliki file test_sample1.py. Misalkan kita memiliki beberapa file, misalnya test_sample2.py dan test_sample3.py. Untuk menjalankan semua pengujian dari semua file di dalam folder dan subfolder, kita hanya perlu menjalankan perintah pytest.
py.test
Perintah ini akan menjalankan semua nama file yang diawali dengan test_ dan diakhiri dengan _test di dalam folder tersebut dan subfolder di bawahnya.
Untuk menjalankan pengujian hanya dari file tertentu, kita dapat menggunakan py.test. .
py.test test_sample1.py
Jalankan Sebagian dari Seluruh Pengujian dengan Pytest
Terkadang kita tidak ingin menjalankan seluruh rangkaian pengujian. Pytest memungkinkan kita untuk menjalankan pengujian tertentu. Kita dapat melakukannya dengan dua cara:
- Grouping dari nama tes dengan pencocokan substring.
- Grouping dari tes berdasarkan penanda.
Kita sudah memiliki file test_sample1.py. Buat file test_sample2.py dan tambahkan kode di bawah ini ke dalamnya.
def test_file2_method1(): x=5 y=6 assert x+1 == y,"test failed" assert x == y,"test failed because x=" + str(x) + " y=" + str(y) def test_file2_method2(): x=5 y=6 assert x+1 == y,"test failed"
Jadi, saat ini kita memiliki hal-hal berikut.
โข test_sample1.py โข test_file1_method1() โข test_file1_method2() โข test_sample2.py โข test_file2_method1() โข test_file2_method2()
Opsi 1) Jalankan pengujian dengan pencocokan substring
Di sini, untuk menjalankan semua pengujian yang memiliki method1 dalam namanya, kita harus menjalankan perintah di bawah ini.
py.test -k method1 -v
-k <expression> is used to represent the substring to match
-v increases the verbosity
Jadi, menjalankan py.test -k method1 -v akan memberikan hasil berikut.
test_sample2.py::test_file2_method1 FAILED
test_sample1.py::test_file1_method1 FAILED
============================================== FAILURES ==============================================
_________________________________________ test_file2_method1 _________________________________________
def test_file2_method1():
x=5
y=6
assert x+1 == y,"test failed"
> assert x == y,"test failed because x=" + str(x) + " y=" + str(y)
E AssertionError: test failed because x=5 y=6
E assert 5 == 6
test_sample2.py:5: AssertionError
_________________________________________ test_file1_method1 _________________________________________
@pytest.mark.only
def test_file1_method1():
x=5
y=6
assert x+1 == y,"test failed"
> assert x == y,"test failed because x=" + str(x) + " y=" + str(y)
E AssertionError: test failed because x=5 y=6
E assert 5 == 6
test_sample1.py:8: AssertionError
================================= 2 tests deselected by '-kmethod1' ==================================
=============================== 2 failed, 2 deselected in 0.02 seconds ===============================
Di sini Anda bisa melihat, menjelang akhir, 2 tes tidak dipilih oleh '-kmethod1', yang merupakan test_file1_method2 dan test_file2_method2.
Cobalah menjalankannya dengan berbagai kombinasi seperti berikut.
py.test -k method -v - will run all the four methods py.test -k methods -v โ will not run any test as there is no test name matches the substring 'methods'
Opsi 2) Jalankan pengujian berdasarkan penanda
Pytest memungkinkan kita untuk mengatur berbagai atribut untuk metode pengujian menggunakan penanda pytest, @pytest.mark. Untuk menggunakan penanda dalam file pengujian, kita perlu mengimpor pytest ke dalam file pengujian. Di sini kita akan menerapkan nama penanda yang berbeda ke metode pengujian dan menjalankan pengujian spesifik berdasarkan nama penanda tersebut. Kita dapat mendefinisikan penanda pada setiap nama pengujian dengan menggunakan cara berikut.
@pytest.mark.<name>.
Kita mendefinisikan penanda set1 dan set2 pada metode pengujian, dan kita akan menjalankan pengujian menggunakan nama penanda tersebut. Perbarui file pengujian dengan kode berikut.
tes_sample1.py
import pytest @pytest.mark.set1 def test_file1_method1(): x=5 y=6 assert x+1 == y,"test failed" assert x == y,"test failed because x=" + str(x) + " y=" + str(y) @pytest.mark.set2 def test_file1_method2(): x=5 y=6 assert x+1 == y,"test failed"
tes_sample2.py
import pytest @pytest.mark.set1 def test_file2_method1(): x=5 y=6 assert x+1 == y,"test failed" assert x == y,"test failed because x=" + str(x) + " y=" + str(y) @pytest.mark.set1 def test_file2_method2(): x=5 y=6 assert x+1 == y,"test failed"
Kita dapat menjalankan tes yang ditandai dengan perintah di bawah ini.
py.test -m <name> -m <name> mentions the marker name
Jalankan py.test -m set1. Ini akan menjalankan metode test_file1_method1, test_file2_method1, dan test_file2_method2. Menjalankan py.test -m set2 akan menjalankan test_file1_method2.
Jalankan Pengujian Secara Paralel dengan Pytest
Biasanya, sebuah rangkaian pengujian akan memiliki banyak file pengujian dan ratusan metode pengujian, yang akan membutuhkan waktu yang cukup lama untuk dieksekusi. Pytest memungkinkan kita untuk menjalankan pengujian secara paralel. Untuk itu, kita perlu menginstal pytest-xdist terlebih dahulu dengan menjalankan perintah di bawah ini.
pip install pytest-xdist
Anda dapat menjalankan pengujian sekarang dengan perintah berikut.
py.test -n 4
Di sini, -n Menjalankan pengujian menggunakan beberapa worker. Pada perintah di atas, akan ada empat worker yang menjalankan pengujian.
Perlengkapan Pytest
Fixture digunakan ketika kita ingin menjalankan beberapa kode sebelum setiap metode pengujian. Jadi, alih-alih mengulangi kode yang sama di setiap pengujian, kita mendefinisikan fixture. Biasanya, fixture digunakan untuk menginisialisasi koneksi basis data, meneruskan parameter dasar. URL, dan seterusnya. Suatu metode ditandai sebagai fixture pytest dengan menandainya dengan hal berikut.
@pytest.fixture
Metode pengujian dapat menggunakan fixture pytest dengan menyebutkan fixture tersebut sebagai parameter input. Buat file baru test_basic_fixture.py dengan kode berikut.
import pytest @pytest.fixture def supply_AA_BB_CC(): aa=25 bb =35 cc=45 return [aa,bb,cc] def test_comparewithAA(supply_AA_BB_CC): zz=35 assert supply_AA_BB_CC[0]==zz,"aa and zz comparison failed" def test_comparewithBB(supply_AA_BB_CC): zz=35 assert supply_AA_BB_CC[1]==zz,"bb and zz comparison failed" def test_comparewithCC(supply_AA_BB_CC): zz=35 assert supply_AA_BB_CC[2]==zz,"cc and zz comparison failed"
Sini:
- Kita memiliki fixture bernama supply_AA_BB_CC. Metode ini mengembalikan daftar yang berisi tiga nilai.
- Kami memiliki tiga metode pengujian yang membandingkan setiap nilai tersebut.
Setiap fungsi pengujian memiliki argumen input yang namanya sesuai dengan fixture yang tersedia. Pytest kemudian memanggil metode fixture yang sesuai, dan nilai yang dikembalikan disimpan dalam argumen input, di sini berupa daftar [25,35,45]. Item dalam daftar tersebut kemudian digunakan dalam metode pengujian untuk perbandingan. Sekarang jalankan pengujian dan lihat hasilnya.
py.test test_basic_fixture
test_basic_fixture.py::test_comparewithAA FAILED
test_basic_fixture.py::test_comparewithBB PASSED
test_basic_fixture.py::test_comparewithCC FAILED
============================================== FAILURES ==============================================
_________________________________________ test_comparewithAA _________________________________________
supply_AA_BB_CC = [25, 35, 45]
def test_comparewithAA(supply_AA_BB_CC):
zz=35
> assert supply_AA_BB_CC[0]==zz,"aa and zz comparison failed"
E AssertionError: aa and zz comparison failed
E assert 25 == 35
test_basic_fixture.py:10: AssertionError
_________________________________________ test_comparewithCC _________________________________________
supply_AA_BB_CC = [25, 35, 45]
def test_comparewithCC(supply_AA_BB_CC):
zz=35
> assert supply_AA_BB_CC[2]==zz,"cc and zz comparison failed"
E AssertionError: cc and zz comparison failed
E assert 45 == 35
test_basic_fixture.py:16: AssertionError
================================= 2 failed, 1 passed in 0.05 seconds =================================
Tes test_comparewithBB berhasil karena zz=BB=35, sedangkan dua tes lainnya gagal.
Metode `fixture` hanya memiliki cakupan di dalam file pengujian tempat metode tersebut didefinisikan. Jika kita mencoba mengakses `fixture` di file pengujian lain, kita akan mendapatkan kesalahan yang menyatakan `fixture`. 'supply_AA_BB_CC' tidak ditemukan untuk metode pengujian di file lainnya.
Untuk menggunakan fixture yang sama terhadap beberapa file pengujian, kita membuat metode fixture dalam file bernama conftest.py. Mari kita lihat ini dengan contoh pytest di bawah ini. Buat tiga file, conftest.py, test_basic_fixture.py, dan test_basic_fixture2.py, dengan kode berikut.
konflik.py
import pytest @pytest.fixture def supply_AA_BB_CC(): aa=25 bb =35 cc=45 return [aa,bb,cc]
tes_basic_fixture.py
import pytest def test_comparewithAA(supply_AA_BB_CC): zz=35 assert supply_AA_BB_CC[0]==zz,"aa and zz comparison failed" def test_comparewithBB(supply_AA_BB_CC): zz=35 assert supply_AA_BB_CC[1]==zz,"bb and zz comparison failed" def test_comparewithCC(supply_AA_BB_CC): zz=35 assert supply_AA_BB_CC[2]==zz,"cc and zz comparison failed"
tes_basic_fixture2.py
import pytest def test_comparewithAA_file2(supply_AA_BB_CC): zz=25 assert supply_AA_BB_CC[0]==zz,"aa and zz comparison failed" def test_comparewithBB_file2(supply_AA_BB_CC): zz=25 assert supply_AA_BB_CC[1]==zz,"bb and zz comparison failed" def test_comparewithCC_file2(supply_AA_BB_CC): zz=25 assert supply_AA_BB_CC[2]==zz,"cc and zz comparison failed"
Pytest akan mencari fixture di file pengujian terlebih dahulu, dan jika tidak ditemukan, ia akan mencari di conftest.py. Jalankan pengujian dengan py.test -k test_comparewith -v untuk mendapatkan hasilnya di bawah ini.
test_basic_fixture.py::test_comparewithAA FAILED test_basic_fixture.py::test_comparewithBB PASSED test_basic_fixture.py::test_comparewithCC FAILED test_basic_fixture2.py::test_comparewithAA_file2 PASSED test_basic_fixture2.py::test_comparewithBB_file2 FAILED test_basic_fixture2.py::test_comparewithCC_file2 FAILED
Uji Parameterisasi Pytest
Tujuan memparametrisasi sebuah pengujian adalah untuk menjalankan pengujian terhadap beberapa set argumen. Kita dapat melakukan ini dengan `@pytest.mark.parametrize`. Kita akan melihat ini dengan contoh pytest di bawah ini. Di sini kita akan memberikan tiga argumen ke sebuah metode pengujian. Metode pengujian ini akan menambahkan dua argumen pertama dan membandingkan hasilnya dengan argumen ketiga. Buat file pengujian `test_addition.py` dengan kode di bawah ini.
import pytest @pytest.mark.parametrize("input1, input2, output",[(5,5,10),(3,5,12)]) def test_add(input1, input2, output): assert input1+input2 == output,"failed"
Di sini, metode pengujian menerima tiga argumen: input1, input2, dan output. Metode ini menambahkan input1 dan input2, lalu membandingkan jumlahnya dengan output. Mari kita jalankan pengujian dengan py.test -k test_add -v dan lihat hasilnya.
test_addition.py::test_add[5-5-10] PASSED
test_addition.py::test_add[3-5-12] FAILED
============================================== FAILURES ==============================================
__________________________________________ test_add[3-5-12] __________________________________________
input1 = 3, input2 = 5, output = 12
@pytest.mark.parametrize("input1, input2, output",[(5,5,10),(3,5,12)])
def test_add(input1, input2, output):
> assert input1+input2 == output,"failed"
E AssertionError: failed
E assert (3 + 5) == 12
test_addition.py:5: AssertionError
Anda dapat melihat pengujian dijalankan dua kali, satu memeriksa 5+5 ==10 dan yang lainnya memeriksa 3+5 ==12.
test_addition.py::test_add[5-5-10] LULUS
test_addition.py::test_add[3-5-12] GAGAL
Pytest Xfail dan Lewati Tes
Akan ada beberapa situasi di mana kita tidak ingin menjalankan pengujian, atau Kasus cobaan tidak relevan pada waktu tertentu. Dalam situasi tersebut, kita memiliki opsi untuk memberi tanda xfail pada pengujian atau melewatkan pengujian. Pengujian yang diberi tanda xfail akan tetap dijalankan, tetapi tidak akan dihitung sebagai bagian dari pengujian yang gagal atau berhasil. Tidak akan ada tracPesan kesalahan akan ditampilkan jika pengujian tersebut gagal. Kita dapat menandai pengujian gagal dengan menggunakan @pytest.mark.xfail. Lewatiping Sebuah tes berarti bahwa tes tersebut tidak akan dieksekusi. Kita dapat melewati tes menggunakan @pytest.mark.skip. Edit file test_addition.py dengan kode di bawah ini.
import pytest @pytest.mark.skip def test_add_1(): assert 100+200 == 400,"failed" @pytest.mark.skip def test_add_2(): assert 100+200 == 300,"failed" @pytest.mark.xfail def test_add_3(): assert 15+13 == 28,"failed" @pytest.mark.xfail def test_add_4(): assert 15+13 == 100,"failed" def test_add_5(): assert 3+2 == 5,"failed" def test_add_6(): assert 3+2 == 6,"failed"
Sini:
- test_add_1 dan test_add_2 dilewati dan tidak akan dieksekusi.
- test_add_3 dan test_add_4 adalah xfailed. Tes-tes ini akan dieksekusi dan akan menjadi bagian dari tes xfailed (jika tes gagal) atau xpassed (jika tes berhasil). Tidak akan ada tracPengembalian dana untuk kegagalan.
- test_add_5 dan test_add_6 akan dieksekusi, dan test_add_6 akan melaporkan kegagalan dengan traceback saat test_add_5 berhasil.
Jalankan pengujian dengan perintah py.test test_addition.py -v dan lihat hasilnya.
test_addition.py::test_add_1 SKIPPED
test_addition.py::test_add_2 SKIPPED
test_addition.py::test_add_3 XPASS
test_addition.py::test_add_4 xfail
test_addition.py::test_add_5 PASSED
test_addition.py::test_add_6 FAILED
============================================== FAILURES ==============================================
_____________________________________________ test_add_6 _____________________________________________
def test_add_6():
> assert 3+2 == 6,"failed"
E AssertionError: failed
E assert (3 + 2) == 6
test_addition.py:24: AssertionError
================ 1 failed, 1 passed, 2 skipped, 1 xfailed, 1 xpassed in 0.07 seconds =================
Hasil dalam Format XML
Kita dapat membuat hasil pengujian dalam format XML, yang dapat kita berikan ke server Integrasi Berkelanjutan untuk diproses lebih lanjut. Ini dapat dilakukan dengan perintah py.test test_sample1.py -v โjunitxml=โresult.xmlโ. File result.xml akan mencatat hasil eksekusi pengujian. Temukan contoh result.xml di bawah ini.
<?xml version="1.0" encoding="UTF-8"?> <testsuite errors="0" failures="1" name="pytest" skips="0" tests="2" time="0.046"> <testcase classname="test_sample1" file="test_sample1.py" line="3" name="test_file1_method1" time="0.001384973526"> <failure message="AssertionError:test failed because x=5 y=6 assert 5 ==6"> @pytest.mark.set1 def test_file1_method1(): x=5 y=6 assert x+1 == y,"test failed" > assert x == y,"test failed because x=" + str(x) + " y=" + str(y) E AssertionError: test failed because x=5 y=6 E assert 5 == 6 test_sample1.py:9: AssertionError </failure> </testcase> <testcase classname="test_sample1" file="test_sample1.py" line="10" name="test_file1_method2" time="0.000830173492432" /> </testsuite>
Dari Kita dapat melihat total dua pengujian, di mana satu di antaranya gagal. Di bawahnya, Anda dapat melihat detail mengenai setiap pengujian yang dijalankan di bawah menandai.
Kerangka Kerja Pytest untuk Menguji API
Sekarang kita akan membuat kerangka kerja pytest kecil untuk menguji sebuah API. API yang digunakan di sini adalah API gratis dari persyaratan.inSitus web ini hanya menyediakan API yang dapat diuji dan tidak menyimpan data kami. Di sini kita akan menulis beberapa pengujian untuk hal-hal berikut:
- Mencantumkan beberapa pengguna.
- Masuk dengan akun pengguna.
Buat file-file di bawah ini dengan kode yang diberikan. Pertama, conftest.py memiliki fixture yang akan menyediakan basisnya. URL untuk semua metode pengujian.
import pytest @pytest.fixture def supply_url(): return "https://reqres.in/api"
Selanjutnya, test_list_user.py berisi metode pengujian untuk mendaftarkan pengguna yang valid dan tidak valid.
- `test_list_valid_user` menguji apakah pengguna yang diambil valid dan memverifikasi responsnya.
- test_list_invaliduser menguji pengambilan data pengguna yang tidak valid dan memverifikasi responsnya.
import pytest import requests import json @pytest.mark.parametrize("userid, firstname",[(1,"George"),(2,"Janet")]) def test_list_valid_user(supply_url,userid,firstname): url = supply_url + "/users/" + str(userid) resp = requests.get(url) j = json.loads(resp.text) assert resp.status_code == 200, resp.text assert j['data']['id'] == userid, resp.text assert j['data']['first_name'] == firstname, resp.text def test_list_invaliduser(supply_url): url = supply_url + "/users/50" resp = requests.get(url) assert resp.status_code == 404, resp.text
Kemudian, test_login_user.py berisi metode pengujian untuk menguji fungsionalitas login.
- test_login_valid menguji upaya login yang valid dengan email dan kata sandi.
- test_login_no_password menguji upaya login yang tidak valid tanpa memasukkan kata sandi.
- test_login_no_email menguji upaya login yang tidak valid tanpa mengirimkan email.
import pytest import requests import json def test_login_valid(supply_url): url = supply_url + "/login/" data = {'email':'test@test.com','password':'something'} resp = requests.post(url, data=data) j = json.loads(resp.text) assert resp.status_code == 200, resp.text assert j['token'] == "QpwL5tke4Pnpja7X", resp.text def test_login_no_password(supply_url): url = supply_url + "/login/" data = {'email':'test@test.com'} resp = requests.post(url, data=data) j = json.loads(resp.text) assert resp.status_code == 400, resp.text assert j['error'] == "Missing password", resp.text def test_login_no_email(supply_url): url = supply_url + "/login/" data = {} resp = requests.post(url, data=data) j = json.loads(resp.text) assert resp.status_code == 400, resp.text assert j['error'] == "Missing email or username", resp.text
Jalankan pengujian menggunakan py.test -v dan lihat hasilnya sebagai berikut.
test_list_user.py::test_list_valid_user[1-George] PASSED test_list_user.py::test_list_valid_user[2-Janet] PASSED test_list_user.py::test_list_invaliduser PASSED test_login_user.py::test_login_valid PASSED test_login_user.py::test_login_no_password PASSED test_login_user.py::test_login_no_email PASSED
Perbarui pengujian dan coba berbagai output.




