Contoh dekorator patch mock python

Ringkasan. dalam tutorial ini, Anda akan mempelajari cara menggunakan Python

1 2 3

Code language: Python (python)
6 untuk mengganti target dengan objek tiruan untuk sementara

Pengantar tambalan Python

Modul

1 2 3

Code language: Python (python)
7 memiliki

1 2 3

Code language: Python (python)
6 yang memungkinkan Anda untuk sementara mengganti target dengan objek tiruan

Target dapat berupa fungsi, metode, atau kelas. Ini adalah string dengan format berikut

'package.module.className'

Code language: Python (python)

Untuk menggunakan

1 2 3

Code language: Python (python)
_6 dengan benar, Anda perlu memahami dua langkah penting

  • Identifikasi target
  • Cara memanggil

    1 2 3

    Code language: Python (python)
    6

Mengidentifikasi target

Untuk mengidentifikasi target

  • Target harus dapat diimpor
  • Dan menambal target di mana itu digunakan, bukan dari mana asalnya

Panggilan tambalan

Python memberi Anda tiga cara untuk memanggil

1 2 3

Code language: Python (python)
6

  • Dekorator untuk fungsi atau kelas
  • Manajer konteks
  • Mulai/berhenti manual

Saat Anda menggunakan

1 2 3

Code language: Python (python)
_6 sebagai dekorator fungsi atau kelas, di dalam fungsi atau kelas target diganti dengan objek baru

Jika Anda menggunakan tambalan di pengelola konteks, di dalam pernyataan

[1, 2, 3]

Code language: Python (python)
3, target diganti dengan objek baru

Dalam kedua kasus tersebut, ketika fungsi atau pernyataan

[1, 2, 3]

Code language: Python (python)
3 keluar, tambalan dibatalkan

Contoh tambalan python

Mari buat modul baru bernama

[1, 2, 3]

Code language: Python (python)
5 untuk tujuan demonstrasi

def read(filename): """ read a text file and return a list of numbers """ with open(filename) as f: lines = f.readlines() return [float(line.strip()) for line in lines] def calculate_total(filename): """ return the sum of numbers in a text file """ numbers = read(filename) return sum(numbers)

Code language: Python (python)

Bagaimana itu bekerja

Fungsi

[1, 2, 3]

Code language: Python (python)
6 membaca file teks, mengubah setiap baris menjadi angka, dan mengembalikan daftar angka. Misalnya, file teks memiliki baris berikut

1 2 3

Code language: Python (python)

fungsi

[1, 2, 3]

Code language: Python (python)
_6 akan mengembalikan daftar berikut

[1, 2, 3]

Code language: Python (python)
_

Fungsi

[1, 2, 3]

Code language: Python (python)
8 menggunakan fungsi

[1, 2, 3]

Code language: Python (python)
6 untuk mendapatkan daftar angka dari file dan mengembalikan jumlah angka

Untuk menguji

[1, 2, 3]

Code language: Python (python)
_8, Anda dapat membuat modul

import unittest from unittest.mock import MagicMock import total class TestTotal(unittest.TestCase): def test_calculate_total(self): total.read = MagicMock() total.read.return_value = [1, 2, 3] result = total.calculate_total('') self.assertEqual(result, 6)

Code language: Python (python)
1 dan meniru fungsi

[1, 2, 3]

Code language: Python (python)
6 sebagai berikut

import unittest from unittest.mock import MagicMock import total class TestTotal(unittest.TestCase): def test_calculate_total(self): total.read = MagicMock() total.read.return_value = [1, 2, 3] result = total.calculate_total('') self.assertEqual(result, 6)

Code language: Python (python)

Jalankan pengujian

python -m unittest test_total_mock.py -v

Code language: Python (python)

Keluaran

test_calculate_total (test_total_mock.TestTotal) .. ok ---------------------------------------------------------------------- Ran 1 test in 0.001s OK

Code language: Python (python)

Alih-alih menggunakan objek

import unittest from unittest.mock import MagicMock import total class TestTotal(unittest.TestCase): def test_calculate_total(self): total.read = MagicMock() total.read.return_value = [1, 2, 3] result = total.calculate_total('') self.assertEqual(result, 6)

Code language: Python (python)
_3 secara langsung, Anda dapat menggunakan objek

1 2 3

Code language: Python (python)
6

1) Menggunakan patch() sebagai dekorator

Modul pengujian berikut

import unittest from unittest.mock import MagicMock import total class TestTotal(unittest.TestCase): def test_calculate_total(self): total.read = MagicMock() total.read.return_value = [1, 2, 3] result = total.calculate_total('') self.assertEqual(result, 6)

Code language: Python (python)
5 menguji modul

[1, 2, 3]

Code language: Python (python)
5 menggunakan

1 2 3

Code language: Python (python)
6 sebagai dekorator fungsi

import unittest from unittest.mock import patch import total class TestTotal(unittest.TestCase): @patch('total.read') def test_calculate_total(self, mock_read): mock_read.return_value = [1, 2, 3] result = total.calculate_total('') self.assertEqual(result, 6)

Code language: Python (python)

Bagaimana itu bekerja

Pertama, impor tambalan dari modul

1 2 3

Code language: Python (python)
7

from unittest.mock import patch

Code language: Python (python)

Kedua, hiasi metode pengujian

import unittest from unittest.mock import MagicMock import total class TestTotal(unittest.TestCase): def test_calculate_total(self): total.read = MagicMock() total.read.return_value = [1, 2, 3] result = total.calculate_total('') self.assertEqual(result, 6)

Code language: Python (python)
_9 dengan dekorator

python -m unittest test_total_mock.py -v

Code language: Python (python)
0. Targetnya adalah fungsi baca dari total modul

@patch('total.read') def test_calculate_total(self, mock_read): # ...

Code language: Python (python)

Karena dekorator

python -m unittest test_total_mock.py -v

Code language: Python (python)
0, metode

import unittest from unittest.mock import MagicMock import total class TestTotal(unittest.TestCase): def test_calculate_total(self): total.read = MagicMock() total.read.return_value = [1, 2, 3] result = total.calculate_total('') self.assertEqual(result, 6)

Code language: Python (python)
9 memiliki argumen tambahan mock_read yang merupakan turunan dari MagicMock

Perhatikan bahwa Anda dapat memberi nama parameter apa pun yang Anda inginkan

Di dalam metode

import unittest from unittest.mock import MagicMock import total class TestTotal(unittest.TestCase): def test_calculate_total(self): total.read = MagicMock() total.read.return_value = [1, 2, 3] result = total.calculate_total('') self.assertEqual(result, 6)

Code language: Python (python)
_9,

1 2 3

Code language: Python (python)
6 akan menggantikan total.

[1, 2, 3]

Code language: Python (python)
6 dengan objek mock_read

Ketiga, tetapkan daftar ke return_value dari objek tiruan

def read(filename): """ read a text file and return a list of numbers """ with open(filename) as f: lines = f.readlines() return [float(line.strip()) for line in lines] def calculate_total(filename): """ return the sum of numbers in a text file """ numbers = read(filename) return sum(numbers)

Code language: Python (python)
_0

Terakhir, panggil fungsi

[1, 2, 3]

Code language: Python (python)
_8 dan gunakan metode

python -m unittest test_total_mock.py -v

Code language: Python (python)
7 untuk menguji apakah totalnya 6

Karena objek mock_read akan dipanggil, bukan total.

[1, 2, 3]

Code language: Python (python)
_6 fungsi, Anda dapat meneruskan nama file apa pun ke fungsi

[1, 2, 3]

Code language: Python (python)
8

def read(filename): """ read a text file and return a list of numbers """ with open(filename) as f: lines = f.readlines() return [float(line.strip()) for line in lines] def calculate_total(filename): """ return the sum of numbers in a text file """ numbers = read(filename) return sum(numbers)

Code language: Python (python)
_1

Jalankan pengujian

def read(filename): """ read a text file and return a list of numbers """ with open(filename) as f: lines = f.readlines() return [float(line.strip()) for line in lines] def calculate_total(filename): """ return the sum of numbers in a text file """ numbers = read(filename) return sum(numbers)

Code language: Python (python)
_2

Keluaran

def read(filename): """ read a text file and return a list of numbers """ with open(filename) as f: lines = f.readlines() return [float(line.strip()) for line in lines] def calculate_total(filename): """ return the sum of numbers in a text file """ numbers = read(filename) return sum(numbers)

Code language: Python (python)
_3

2) Menggunakan patch() sebagai manajer konteks

Contoh berikut mengilustrasikan cara menggunakan

1 2 3

Code language: Python (python)
6 sebagai pengelola konteks

def read(filename): """ read a text file and return a list of numbers """ with open(filename) as f: lines = f.readlines() return [float(line.strip()) for line in lines] def calculate_total(filename): """ return the sum of numbers in a text file """ numbers = read(filename) return sum(numbers)

Code language: Python (python)
_4

Bagaimana itu bekerja

Pertama, tambal fungsi

test_calculate_total (test_total_mock.TestTotal) .. ok ---------------------------------------------------------------------- Ran 1 test in 0.001s OK

Code language: Python (python)
_1 menggunakan sebagai objek

test_calculate_total (test_total_mock.TestTotal) .. ok ---------------------------------------------------------------------- Ran 1 test in 0.001s OK

Code language: Python (python)
2 dalam pengelola konteks

def read(filename): """ read a text file and return a list of numbers """ with open(filename) as f: lines = f.readlines() return [float(line.strip()) for line in lines] def calculate_total(filename): """ return the sum of numbers in a text file """ numbers = read(filename) return sum(numbers)

Code language: Python (python)
_5

Artinya di dalam blok

[1, 2, 3]

Code language: Python (python)
3,

1 2 3

Code language: Python (python)
6 menggantikan fungsi

test_calculate_total (test_total_mock.TestTotal) .. ok ---------------------------------------------------------------------- Ran 1 test in 0.001s OK

Code language: Python (python)
1 dengan objek mock_read

Kedua, tetapkan daftar nomor ke properti ________23______6 dari objek

test_calculate_total (test_total_mock.TestTotal) .. ok ---------------------------------------------------------------------- Ran 1 test in 0.001s OK

Code language: Python (python)
2

def read(filename): """ read a text file and return a list of numbers """ with open(filename) as f: lines = f.readlines() return [float(line.strip()) for line in lines] def calculate_total(filename): """ return the sum of numbers in a text file """ numbers = read(filename) return sum(numbers)

Code language: Python (python)
_6

Ketiga, panggil fungsi

[1, 2, 3]

Code language: Python (python)
8 dan uji apakah hasil dari fungsi

[1, 2, 3]

Code language: Python (python)
8 sama dengan 6 menggunakan metode

python -m unittest test_total_mock.py -v

Code language: Python (python)
7

def read(filename): """ read a text file and return a list of numbers """ with open(filename) as f: lines = f.readlines() return [float(line.strip()) for line in lines] def calculate_total(filename): """ return the sum of numbers in a text file """ numbers = read(filename) return sum(numbers)

Code language: Python (python)
_1

Jalankan pengujian

def read(filename): """ read a text file and return a list of numbers """ with open(filename) as f: lines = f.readlines() return [float(line.strip()) for line in lines] def calculate_total(filename): """ return the sum of numbers in a text file """ numbers = read(filename) return sum(numbers)

Code language: Python (python)
_8

Keluaran

def read(filename): """ read a text file and return a list of numbers """ with open(filename) as f: lines = f.readlines() return [float(line.strip()) for line in lines] def calculate_total(filename): """ return the sum of numbers in a text file """ numbers = read(filename) return sum(numbers)

Code language: Python (python)
_9

3) Menggunakan patch() secara manual

Modul pengujian berikut (

import unittest from unittest.mock import patch import total class TestTotal(unittest.TestCase): @patch('total.read') def test_calculate_total(self, mock_read): mock_read.return_value = [1, 2, 3] result = total.calculate_total('') self.assertEqual(result, 6)

Code language: Python (python)
_1) menunjukkan cara menggunakan

1 2 3

Code language: Python (python)
6 secara manual

1 2 3

Code language: Python (python)
0

Bagaimana itu bekerja

Pertama, mulai tambalan dengan memanggil

1 2 3

Code language: Python (python)
_6 dengan target adalah fungsi

[1, 2, 3]

Code language: Python (python)
6 dari modul

import unittest from unittest.mock import patch import total class TestTotal(unittest.TestCase): @patch('total.read') def test_calculate_total(self, mock_read): mock_read.return_value = [1, 2, 3] result = total.calculate_total('') self.assertEqual(result, 6)

Code language: Python (python)
5

Bagaimana cara menggunakan patch tiruan Python?

Bagaimana kita mengejek dengan Python? . Saat patch mencegat panggilan, ia mengembalikan objek MagicMock secara default. Dengan menyetel properti pada objek MagicMock, Anda dapat meniru panggilan API untuk mengembalikan nilai apa pun yang Anda inginkan atau memunculkan Pengecualian. using patch to hijack an API function or object creation call. When patch intercepts a call, it returns a MagicMock object by default. By setting properties on the MagicMock object, you can mock the API call to return any value you want or raise an Exception .

Bagaimana Anda menambal dekorator dengan Python?

Berikut cara menambal dekorator yang hanya bertahan melalui satu pengujian. .
Hilangkan pernyataan impor yang memuat target pengujian
Tambal dekorator saat memulai pengujian seperti yang diterapkan di atas
Panggil importlib. import_module() segera setelah menambal untuk memuat target pengujian
Jalankan tes secara normal

Apa gunanya dekorator tambalan di Python?

Dekorator patch() memudahkan penggantian sementara kelas dalam modul tertentu dengan objek Mock . Secara default patch() akan membuat MagicMock untuk Anda. Anda dapat menentukan kelas Mock alternatif menggunakan argumen new_callable ke patch(). Buat objek Mock baru.

Apa perbedaan antara mock dan patch Python?

Tindakan mengganti dependensi disebut patching, penggantiannya disebut mock . Bergantung pada apa sebenarnya tiruan itu, Anda mungkin juga mendengar ini disebut sebagai Uji Ganda, Uji Rintisan, Mata-Mata Uji, atau Objek Palsu. Dalam praktiknya di Python, perbedaannya tidak menjadi masalah.