Fungsi tiruan python dalam modul

Pada artikel sebelumnya tentang mocking, kita telah melihat mengapa mocking bermanfaat dan cara menginstal pytest-mock. Kami juga telah melihat bagaimana kami dapat meniru fungsi yang lambat untuk membuat rangkaian pengujian kami lebih cepat

Mocking with pytest

Pada artikel ini, kita akan mempelajari beberapa cara lagi untuk mengejek fungsi. Singkatnya, kami memiliki modul bernama application1.py dengan dua fungsi

# application1.py

from time import sleep

def is_windows():
# This sleep could be some complex operation instead
sleep(5)
return True


def get_operating_system():
return 'Windows' if is_windows() else 'Linux'

Fungsi get_operating_system bergantung pada fungsi

# test_application1.py

from application1 import get_operating_system

# mocker is a fixture provided by "pytest-mock"
def test_get_operating_system(mocker):
mocker.patch('application1.is_windows', return_value=True)
assert get_operating_system() == 'Windows'
0, yang lambat (disimulasikan dengan tidur). Untuk dapat menguji get_operating_system, kami memutuskan untuk meniru fungsi
# test_application1.py

from application1 import get_operating_system

# mocker is a fixture provided by "pytest-mock"
def test_get_operating_system(mocker):
mocker.patch('application1.is_windows', return_value=True)
assert get_operating_system() == 'Windows'
0

Fungsi tes adalah sebagai berikut

# test_application1.py

from application1 import get_operating_system

# mocker is a fixture provided by "pytest-mock"
def test_get_operating_system(mocker):
mocker.patch('application1.is_windows', return_value=True)
assert get_operating_system() == 'Windows'
_

Dengan tambalan, fungsi

# test_application1.py

from application1 import get_operating_system

# mocker is a fixture provided by "pytest-mock"
def test_get_operating_system(mocker):
mocker.patch('application1.is_windows', return_value=True)
assert get_operating_system() == 'Windows'
_0 tidak akan memakan waktu 5 detik lagi dan akan segera mengembalikan nilai

Ini dapat divisualisasikan seperti yang ditunjukkan di bawah ini. Alur default di mana get_operating_system panggilan

# test_application1.py

from application1 import get_operating_system

# mocker is a fixture provided by "pytest-mock"
def test_get_operating_system(mocker):
mocker.patch('application1.is_windows', return_value=True)
assert get_operating_system() == 'Windows'
0 akan menjadi sebagai berikut

mock visualization

Saat kami melakukan tambalan, kami membuat fungsi tiruan baru yang dipanggil, melewati fungsi aslinya

mock visualization

Begitulah cara kerja tiruan. Mereka mengganti benda aslinya dengan boneka

Sekarang, Mari kita ubah sedikit. Katakanlah, fungsi

# test_application1.py

from application1 import get_operating_system

# mocker is a fixture provided by "pytest-mock"
def test_get_operating_system(mocker):
mocker.patch('application1.is_windows', return_value=True)
assert get_operating_system() == 'Windows'
_0, alih-alih menjadi bagian dari
# test_application1.py

from application1 import get_operating_system

# mocker is a fixture provided by "pytest-mock"
def test_get_operating_system(mocker):
mocker.patch('application1.is_windows', return_value=True)
assert get_operating_system() == 'Windows'
6, diimpor dari modul lain bernama
# test_application1.py

from application1 import get_operating_system

# mocker is a fixture provided by "pytest-mock"
def test_get_operating_system(mocker):
mocker.patch('application1.is_windows', return_value=True)
assert get_operating_system() == 'Windows'
7

# windows_utils.py

from time import sleep

def is_windows():
# This sleep could be some complex operation instead
sleep(5)
return True
_

Kami mengimpor fungsi ini ke dalam modul aplikasi kami

# application2.py

from windows_utils import is_windows

def get_operating_system():
return 'Windows' if is_windows() else 'Linux'

Dan itu adalah cerita yang sama lagi di sini. Kita perlu mengejek fungsi lambat. Sekarang, fungsi

# test_application1.py

from application1 import get_operating_system

# mocker is a fixture provided by "pytest-mock"
def test_get_operating_system(mocker):
mocker.patch('application1.is_windows', return_value=True)
assert get_operating_system() == 'Windows'
_0 berasal dari modul
# test_application1.py

from application1 import get_operating_system

# mocker is a fixture provided by "pytest-mock"
def test_get_operating_system(mocker):
mocker.patch('application1.is_windows', return_value=True)
assert get_operating_system() == 'Windows'
7. Jadi, Anda mungkin tergoda untuk melakukan hal berikut

mocker.patch('windows_utils.is_windows', return_value=True)

Tapi itu tidak akan bekerja seperti yang Anda harapkan. Dalam hal mengejek, kami selalu mengejek di mana fungsi itu digunakan. Meskipun

# test_application1.py

from application1 import get_operating_system

# mocker is a fixture provided by "pytest-mock"
def test_get_operating_system(mocker):
mocker.patch('application1.is_windows', return_value=True)
assert get_operating_system() == 'Windows'
_0 berasal dari modul
# test_application1.py

from application1 import get_operating_system

# mocker is a fixture provided by "pytest-mock"
def test_get_operating_system(mocker):
mocker.patch('application1.is_windows', return_value=True)
assert get_operating_system() == 'Windows'
7, karena digunakan di
# windows_utils.py

from time import sleep

def is_windows():
# This sleep could be some complex operation instead
sleep(5)
return True
2, kita harus mengejek
# windows_utils.py

from time import sleep

def is_windows():
# This sleep could be some complex operation instead
sleep(5)
return True
3 sebagai gantinya. Ini karena cara kerja impor di python. Di Python, setiap kali Anda mengimpor sesuatu ke dalam modul, itu menjadi bagian dari modul. Jadi, Anda selalu menyebutnya sebagai
# windows_utils.py

from time import sleep

def is_windows():
# This sleep could be some complex operation instead
sleep(5)
return True
_4

Jadi, fungsi tes akan tetap sama seperti sebelumnya

# test_application2.py

from application2 import get_operating_system

def test_get_operation_system(mocker):
mocker.patch('application2.is_windows', return_value=True)
assert get_operating_system() == 'Windows'

Seperti dibahas di atas, target tiruan Anda harus mencerminkan bagaimana sesuatu diimpor. Di

# windows_utils.py

from time import sleep

def is_windows():
# This sleep could be some complex operation instead
sleep(5)
return True
_2 kami telah mengimpor
# test_application1.py

from application1 import get_operating_system

# mocker is a fixture provided by "pytest-mock"
def test_get_operating_system(mocker):
mocker.patch('application1.is_windows', return_value=True)
assert get_operating_system() == 'Windows'
0 dengan
# windows_utils.py

from time import sleep

def is_windows():
# This sleep could be some complex operation instead
sleep(5)
return True
7. Karenanya, target tiruan kami adalah
# windows_utils.py

from time import sleep

def is_windows():
# This sleep could be some complex operation instead
sleep(5)
return True
3

Sebaliknya, jika kita hanya melakukan

# windows_utils.py

from time import sleep

def is_windows():
# This sleep could be some complex operation instead
sleep(5)
return True
_9, target ejekan kita juga perlu diubah. Mari kita lihat bagaimana ini bekerja dengan sebuah contoh

# application3.py

import windows_utils

def get_operating_system():
return 'Windows' if windows_utils.is_windows() else 'Linux'

Sekarang target tiruan untuk 'is_windows' tidak lagi

# application2.py

from windows_utils import is_windows

def get_operating_system():
return 'Windows' if is_windows() else 'Linux'
0 karena tidak ada referensi langsung ke 'is_windows' di 'application3'. Sebagai gantinya kami menggunakan
# application2.py

from windows_utils import is_windows

def get_operating_system():
return 'Windows' if is_windows() else 'Linux'
1. Itu adalah referensi yang sepenuhnya memenuhi syarat. Tes baru adalah sebagai berikut

# test_application3.py

from application3 import get_operating_system

def test_get_operation_system(mocker):
mocker.patch('application3.windows_utils.is_windows', return_value=True)
assert get_operating_system() == 'Windows'

Alih-alih menggunakan

# application2.py

from windows_utils import is_windows

def get_operating_system():
return 'Windows' if is_windows() else 'Linux'
_1, kita dapat menyederhanakannya menjadi
# application2.py

from windows_utils import is_windows

def get_operating_system():
return 'Windows' if is_windows() else 'Linux'
3 juga. Tetapi mengacu pada segala sesuatu sebagai
# application2.py

from windows_utils import is_windows

def get_operating_system():
return 'Windows' if is_windows() else 'Linux'
_4 tetap bersih dan mudah dimengerti

Itu saja untuk artikel ini. Kita akan melihat bagaimana kita bisa mengejek objek di artikel berikutnya. Tetap disini

Daftar lengkap artikel dalam seri ini

Fungsi Mengejek Bagian I
Fungsi Mengejek Bagian II🢠 Artikel Saat Ini

Jika Anda menyukai artikel ini, Anda dapat bertepuk tangan untuk mendorong saya agar segera mengeluarkan artikel berikutnya. Jika menurut Anda seseorang yang Anda kenal dapat memperoleh manfaat dari artikel ini, bagikan dengan mereka

Jika Anda ingin berterima kasih kepada saya, Anda dapat menyapa saya di twitter @durgaswaroop. Dan, jika Anda ingin mendukung saya, inilah tautan paypal saya. paypal. saya/durgaswaroop

Bagaimana Anda mengejek suatu fungsi dalam modul Python?

Bagaimana kita mengejek dengan Python? .
Tulis pengujian seolah-olah Anda menggunakan API eksternal nyata
Dalam fungsi yang diuji, tentukan panggilan API mana yang perlu diejek;
Dalam fungsi pengujian, tambal panggilan API
Siapkan respons objek MagicMock
Jalankan pengujian Anda

Apa fungsi tiruan di Python?

mock adalah pustaka untuk pengujian dengan Python . Ini memungkinkan Anda untuk mengganti bagian dari sistem Anda yang sedang diuji dengan objek tiruan dan membuat pernyataan tentang bagaimana mereka telah digunakan. paling unit. mock menyediakan kelas Mock inti yang menghilangkan kebutuhan untuk membuat sejumlah rintisan bertopik di seluruh rangkaian pengujian Anda.

Bisakah Anda mengejek impor dengan Python?

Python Import Mocker menyediakan cara mudah untuk mengimpor modul dan meniru dependensinya dengan cara yang terisolasi .

Apa yang dilakukan @patch dengan Python?

patch() sebagai Dekorator . Fungsi-fungsi ini sekarang ada di file mereka sendiri, terpisah dari pengujiannya. Selanjutnya, Anda akan membuat ulang tes Anda dalam file bernama tes. py. mock an object for the duration of your entire test function, you can use patch() as a function decorator. These functions are now in their own file, separate from their tests. Next, you'll re-create your tests in a file called tests.py .