Bagaimana Anda membuat objek tiruan dengan python?

Pustaka unittest Python membantu Anda menguji kode aplikasi Anda untuk kesalahan dengan cara otomatis. Itu salah satu metode pengujian yang dibahas dalam panduan kami,. Pengujian tiruan sangat berguna saat kode Anda belum selesai dan pengembangan Anda sedang berlangsung. Itu melakukan pengujian berkelanjutan selama pengembangan dan memberikan wawasan yang baik tentang bagaimana suatu aplikasi pada akhirnya dapat berfungsi. Panduan ini menunjukkan cara menggunakan pustaka unittest Python untuk membuat objek tiruan untuk menguji kode Anda

Apa Tujuan Objek Mock dalam Pengujian Unit?

Pengujian aplikasi dan unit memeriksa cara kerja kode Anda dalam berbagai situasi. Pengembang menggunakan sejumlah pendekatan untuk melakukan pengujian, namun tiga pendekatan yang paling populer dijelaskan di bawah ini

  • Mengejek. Metode ini berguna ketika System Under Test (SUT) menyediakan fungsionalitas yang cukup di mana Anda dapat menetapkan nilai dan melacak metode yang dipanggil dalam kode Anda. Dengan Mocking, hasil dihasilkan menggunakan cara sesingkat mungkin. Mock dapat digabungkan dengan erat atau longgar dengan data yang digunakan oleh kode Anda. Dimungkinkan untuk melakukan pernyataan terhadap tiruan. Mock umumnya digunakan untuk memahami perilaku aplikasi saat aplikasi mulai terbentuk. Ini juga memberikan tingkat pemantauan yang tidak dapat disediakan oleh stubbing dan fakes. Biaya utama dari ejekan adalah menambah kerumitan

  • Mati rasa. Metode ini paling efektif bila Anda ingin menguji fitur tertentu dan SUT dapat memberikan respons terhadap kueri. Data dikodekan keras sebagai bagian dari stub, sehingga data digabungkan dengan erat. Hasilnya meniru apa yang diharapkan dilakukan aplikasi dalam batas, dan memungkinkan untuk memberikan beberapa kontrol melalui nilai input. Rintisan bertopik umumnya digunakan untuk menguji keseluruhan unit atau kegunaan aplikasi untuk memastikan bahwa masalah seperti konektivitas ditangani. Banyak pengembang menggunakan stubbing untuk menguji jalur pemanggilan metode melalui aplikasi atau unit

  • Palsu. Pemalsuan adalah opsi yang baik untuk menguji aplikasi ketika SUT memberikan tanggapan terekam untuk kueri yang mungkin cocok atau tidak cocok dengan apa yang akhirnya dihasilkan oleh aplikasi. Outputnya tetap, sehingga tidak mungkin untuk menguji logika atau perilaku unit apa pun. Pemalsuan memungkinkan pengujian fungsionalitas unit secara keseluruhan. Pemalsuan juga menyediakan metode untuk mengabstraksi fungsionalitas apa pun yang belum dikembangkan, atau mungkin tidak dapat diakses dari lingkungan pengujian. Misalnya, alih-alih menghubungkan ke database di server, pemalsuan mungkin bergantung pada database dalam memori

Sebagian besar pengembang menggunakan kerangka kerja khusus, seperti perpustakaan unittest Python, untuk membuat tiruan, dan bertopik. Pemalsuan umumnya dikodekan tanpa bantuan perpustakaan atau kerangka kerja

Dalam pengujian tiruan, unittest bergantung pada objek tiruan. Objek tiruan ini dirancang untuk menerima jenis parameter input yang sama dengan objek yang sedang diuji. Itu juga harus memiliki tipe pengembalian yang sama dengan objek pengujiannya. Patch tiruan Python adalah deklarasi yang menggantikan fungsi sebenarnya hingga fungsi sebenarnya tersedia. Tambalan ditulis sebagai dekorator fungsi. Saat fungsi tersedia, tambalan dibatalkan. Mocks digunakan dalam skenario berikut

  • Saat aplikasi yang Anda uji belum memiliki akses ke server API, aplikasi tersebut akhirnya terhubung

  • Ada kebutuhan untuk memberikan perilaku yang dapat diprediksi yang tidak dapat diandalkan saat bekerja dengan layanan pihak ketiga

  • Anda memerlukan lingkungan terkontrol yang memungkinkan untuk mensimulasikan berbagai jenis gangguan, perilaku yang tidak dapat diprediksi, dan kesalahan

  • Aplikasi memerlukan akses ke data, tetapi tidak dapat mengakses data nyata di server lain. Mungkin, itu hanya memiliki akses ke server uji dengan data terbatas

  • Ada kebutuhan untuk dukungan layanan mikro yang saat ini belum ada

  • Aplikasi akhirnya berinteraksi dengan layanan pihak ketiga, tetapi akses saat ini tidak tersedia

  • Sumber daya yang dibutuhkan oleh unit atau aplikasi saat ini tidak tersedia

  • Unit atau aplikasi perlu mengeluarkan data dan menerima respons yang realistis untuk tujuan pengujian

  • Anda perlu melakukan pengujian pada kode yang jarang digunakan di lingkungan produksi. Fungsionalitas kode bersifat luar biasa, atau hanya mencakup kontinjensi dengan kemungkinan kejadian yang rendah

Pustaka Objek Mock Python yang paling unik

Pustaka objek mock unittest Python memungkinkan Anda untuk menguji area aplikasi Anda dengan objek tiruan dan dengan pernyataan. Satu keuntungan besar menggunakan objek tiruan adalah bahwa kode pengujian terletak di satu lokasi pusat. Teknik pengujian lainnya, seperti stubbing, mengharuskan Anda menambahkan stub di seluruh kode, yang dapat mempersulit pemeliharaan pengujian Anda

Membuat Objek Mock Baru

Bekerja dengan tiruan berbeda dengan bekerja dengan objek standar. Mock dapat melakukan pernyataan dan membuat hasil yang konsisten dengan menyetel metode objek ke nilai tertentu. Objek tiruan juga dapat mencari efek samping yang dihasilkan dari melakukan panggilan tertentu. Namun, tiruan bukanlah kode asli. Objek tiruan berperilaku seperti objek "asli", tetapi tidak mengubah kode Anda. Langkah-langkah berikut membahas beberapa dasar objek tiruan untuk mencontohkan apa yang dapat dicapai oleh tiruan

Catatan

Anda dapat menjalankan langkah-langkah di bagian berikut menggunakan juru bahasa Python komputer Anda. Untuk mengakses juru bahasa Python, keluarkan perintah berikut

python3

Anda akan melihat prompt juru bahasa Python

Python 3.8.10 (default, Sep 28 2021, 16:10:42)
[GCC 9.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>
_

  1. Buat instance objek tiruan baru dan verifikasi bahwa Python mengembalikan pengidentifikasi unik objek

     from unittest.mock import Mock
     myMock = Mock()
     print(myMock)
    

    Anda melihat keluaran yang menyediakan ID palsu, seperti

     from unittest.mock import Mock
     myMock = Mock()
     print(myMock)
    
    9. Anda dapat menggunakan tiruan seperti yang Anda lakukan pada objek lain dari jenis tertentu. Misalnya, Anda bisa mengejek kelas yang berisi metode
     myMock.setResult(1, 2)
     print(myMock.getResult())
    
    0 dan metode
     myMock.setResult(1, 2)
     print(myMock.getResult())
    
    1

  2. Uji penggunaan tiruan untuk membuat pemanggilan metode menggunakan kode berikut

     myMock.setResult(1, 2)
     print(myMock.getResult())
    
    _

    Hasil panggilan ke

     myMock.setResult(1, 2)
     print(myMock.getResult())
    
    _2 menunjukkan bahwa Anda masih bekerja dengan tiruan.
     from unittest.mock import Mock
     myMock = Mock()
     print(myMock)
    
    _9. Keluaran ini berisi teks panggilan. Tiruan melacak bagaimana Anda bekerja dengan berbagai pemanggilan metode meskipun tidak ada kode pemanggilan metode. Anda dapat menggunakan perilaku ini untuk keuntungan Anda dengan membuat pernyataan

  3. Untuk membuat pernyataan terhadap metode

     myMock.setResult(1, 2)
     print(myMock.getResult())
    
    _1 gunakan kode berikut

     myMock.getResult.assert_called()
    

    Dalam hal ini, tidak ada output karena

     myMock.setResult(1, 2)
     print(myMock.getResult())
    
    1 telah dipanggil menggunakan
     myMock.setResult(1, 2)
     print(myMock.getResult())
    
    6 pada langkah sebelumnya. Jika kode tidak memanggil
     myMock.setResult(1, 2)
     print(myMock.getResult())
    
    _1, Anda akan melihat
     myMock.setResult(1, 2)
     print(myMock.getResult())
    
    8

  4. Buat kondisi

     myMock.setResult(1, 2)
     print(myMock.getResult())
    
    _8 menggunakan kode berikut

     print(myMock.getResult())
     myMock.getResult.assert_called_once()
    

    Bergantung pada cara Anda menyiapkan sistem, Anda mungkin melihat detail yang berbeda untuk

     myMock.setResult(1, 2)
     print(myMock.getResult())
    
    8. Output di bawah menampilkan
     myMock.setResult(1, 2)
     print(myMock.getResult())
    
    _8 dasar yang dapat Anda harapkan

    Traceback (most recent call last):
        File "", line 1, in 
        File "C:\Users\John\anaconda3\lib\unittest\mock.py", line 892, in assert_called_once
        raise AssertionError(msg)
    AssertionError: Expected 'getResult' to have been called once. Called 2 times.
    Calls: [call(), call()].
        
  5. Mock juga dapat menguji panggilan dengan nilai tertentu. Misalnya,

     myMock.setResult(1, 2)
     print(myMock.getResult())
    
    _0 mungkin memerlukan dua input nilai tertentu. Gunakan kode di bawah ini untuk melihat hasil pengujian yang berhasil

     myMock.setResult(1, 2)
     myMock.setResult.assert_called_with(1, 2)
    

    Kode ini berhasil karena

     myMock.setResult(1, 2)
     print(myMock.getResult())
    
    0 telah dipanggil dengan nilai input
     myMock.getResult.assert_called()
    
    4 dan
     myMock.getResult.assert_called()
    
    5 (dalam urutan itu). Urutan itu penting. Jika Anda malah menggunakan
     myMock.getResult.assert_called()
    
    _6, hasilnya akan memunculkan
     myMock.setResult(1, 2)
     print(myMock.getResult())
    
    8 mirip dengan yang berikut

    Traceback (most recent call last):
      File "", line 1, in 
      File "C:\Users\John\anaconda3\lib\unittest\mock.py", line 913, in assert_called_with
        raise AssertionError(_error_message()) from cause
    AssertionError: expected call not found.
    Expected: setResult(2, 1)
    Actual: setResult(1, 2)
        

    Anda dapat menguji masukan dengan sangat spesifik untuk memastikan kode Anda melakukan apa yang seharusnya dilakukan. Ada juga panggilan untuk memverifikasi bahwa

     myMock.setResult(1, 2)
     print(myMock.getResult())
    
    _0 hanya dipanggil sekali dengan nilai spesifik yang Anda berikan menggunakan
     myMock.getResult.assert_called()
    
    9. Objek
     print(myMock.getResult())
     myMock.getResult.assert_called_once()
    
    _0 hadir dengan banyak tes pernyataan yang dapat Anda lakukan

  6. Anda mungkin perlu mengonfigurasi tiruan untuk mengembalikan nilai tertentu. Dalam hal ini, Anda berharap bahwa

     print(myMock.getResult())
     myMock.getResult.assert_called_once()
    
    _1 akan memberikan nilai pengembalian
     myMock.setResult(1, 2)
     print(myMock.getResult())
    
    1 sebesar
     print(myMock.getResult())
     myMock.getResult.assert_called_once()
    
    3, tetapi saat ini tidak melakukannya. Gunakan kode berikut untuk memberikan nilai keluaran yang diperlukan

     myMock.getResult.return_value = 3
     print(myMock.getResult())
    

    Saat Anda menjalankan kode, ada nilai keluaran

     print(myMock.getResult())
     myMock.getResult.assert_called_once()
    
    3. Jika Anda mengubah nilai input menggunakan
     myMock.setResult(1, 2)
     print(myMock.getResult())
    
    _0, output
     myMock.setResult(1, 2)
     print(myMock.getResult())
    
    1 tidak berubah. Konsistensi semacam ini tidak membantu dalam aplikasi produksi. Namun, ini cukup membantu selama pengujian karena Anda dapat yakin bahwa
     myMock.setResult(1, 2)
     print(myMock.getResult())
    
    1 selalu mengembalikan
     print(myMock.getResult())
     myMock.getResult.assert_called_once()
    
    3 hingga Anda memilih untuk mengubahnya

Menggunakan Statistik Mock

Saat aplikasi terlalu rumit untuk melakukan analisis langkah demi langkah dari setiap panggilan tiruan, gunakan statistik tiruan untuk menentukan kesehatan aplikasi. Langkah-langkah di bagian ini menunjukkan cara kerja statistik objek tiruan. Bagian ini bergantung pada objek

 print(myMock.getResult())
 myMock.getResult.assert_called_once()
_9 yang Anda buat di bagian ini

Salah satu statistik yang paling membantu adalah berapa kali tiruan tertentu dipanggil. Jika Anda mengharapkan lima panggilan ke suatu fungsi atau objek dan hanya mendapatkan empat, ada masalah. Gunakan kode di bawah ini untuk melihat cara kerja properti

Traceback (most recent call last):
    File "", line 1, in 
    File "C:\Users\John\anaconda3\lib\unittest\mock.py", line 892, in assert_called_once
    raise AssertionError(msg)
AssertionError: Expected 'getResult' to have been called once. Called 2 times.
Calls: [call(), call()].
    
0

Python 3.8.10 (default, Sep 28 2021, 16:10:42)
[GCC 9.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>
_0

Terkadang Anda perlu tahu bagaimana suatu metode dipanggil. Misalnya, dengan

Traceback (most recent call last):
    File "", line 1, in 
    File "C:\Users\John\anaconda3\lib\unittest\mock.py", line 892, in assert_called_once
    raise AssertionError(msg)
AssertionError: Expected 'getResult' to have been called once. Called 2 times.
Calls: [call(), call()].
    
_1, Anda perlu tahu, tidak hanya seberapa sering disebut, tetapi dengan argumen apa. Anda memiliki dua opsi. minta hanya informasi panggilan terbaru menggunakan
Traceback (most recent call last):
    File "", line 1, in 
    File "C:\Users\John\anaconda3\lib\unittest\mock.py", line 892, in assert_called_once
    raise AssertionError(msg)
AssertionError: Expected 'getResult' to have been called once. Called 2 times.
Calls: [call(), call()].
    
_2 atau minta semua informasi panggilan menggunakan
Traceback (most recent call last):
    File "", line 1, in 
    File "C:\Users\John\anaconda3\lib\unittest\mock.py", line 892, in assert_called_once
    raise AssertionError(msg)
AssertionError: Expected 'getResult' to have been called once. Called 2 times.
Calls: [call(), call()].
    
3. Anda dapat menggunakan keduanya seperti yang ditunjukkan di bawah ini

Python 3.8.10 (default, Sep 28 2021, 16:10:42)
[GCC 9.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>
_1

Untuk mengetahui bagaimana mock dipanggil dan bagaimana urutan panggilan datang, properti

Traceback (most recent call last):
    File "", line 1, in 
    File "C:\Users\John\anaconda3\lib\unittest\mock.py", line 892, in assert_called_once
    raise AssertionError(msg)
AssertionError: Expected 'getResult' to have been called once. Called 2 times.
Calls: [call(), call()].
    
4 membantu Anda mendapatkan informasi ini

Python 3.8.10 (default, Sep 28 2021, 16:10:42)
[GCC 9.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>
_2

Keluaran dari panggilan ini menampilkan daftar pemanggilan metode dalam urutan kemunculannya seperti berikut ini

Python 3.8.10 (default, Sep 28 2021, 16:10:42)
[GCC 9.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>
_3

Objek MagicMock

Objek

Traceback (most recent call last):
    File "", line 1, in 
    File "C:\Users\John\anaconda3\lib\unittest\mock.py", line 892, in assert_called_once
    raise AssertionError(msg)
AssertionError: Expected 'getResult' to have been called once. Called 2 times.
Calls: [call(), call()].
    
_5 adalah bagian dari objek
Traceback (most recent call last):
    File "", line 1, in 
    File "C:\Users\John\anaconda3\lib\unittest\mock.py", line 892, in assert_called_once
    raise AssertionError(msg)
AssertionError: Expected 'getResult' to have been called once. Called 2 times.
Calls: [call(), call()].
    
6. Ini memberikan nilai wajar, seperti nilai kembalian untuk pemanggilan metode umum yang sering muncul di Python. Di bawah ini adalah pemanggilan metode dan hasil defaultnya

  • Traceback (most recent call last):
        File "", line 1, in 
        File "C:\Users\John\anaconda3\lib\unittest\mock.py", line 892, in assert_called_once
        raise AssertionError(msg)
    AssertionError: Expected 'getResult' to have been called once. Called 2 times.
    Calls: [call(), call()].
        
    _7.
    Traceback (most recent call last):
        File "", line 1, in 
        File "C:\Users\John\anaconda3\lib\unittest\mock.py", line 892, in assert_called_once
        raise AssertionError(msg)
    AssertionError: Expected 'getResult' to have been called once. Called 2 times.
    Calls: [call(), call()].
        
    _8
  • Traceback (most recent call last):
        File "", line 1, in 
        File "C:\Users\John\anaconda3\lib\unittest\mock.py", line 892, in assert_called_once
        raise AssertionError(msg)
    AssertionError: Expected 'getResult' to have been called once. Called 2 times.
    Calls: [call(), call()].
        
    _9.
    Traceback (most recent call last):
        File "", line 1, in 
        File "C:\Users\John\anaconda3\lib\unittest\mock.py", line 892, in assert_called_once
        raise AssertionError(msg)
    AssertionError: Expected 'getResult' to have been called once. Called 2 times.
    Calls: [call(), call()].
        
    _8
  •  myMock.setResult(1, 2)
     myMock.setResult.assert_called_with(1, 2)
    
    1.
    Traceback (most recent call last):
        File "", line 1, in 
        File "C:\Users\John\anaconda3\lib\unittest\mock.py", line 892, in assert_called_once
        raise AssertionError(msg)
    AssertionError: Expected 'getResult' to have been called once. Called 2 times.
    Calls: [call(), call()].
        
    _8
  •  myMock.setResult(1, 2)
     myMock.setResult.assert_called_with(1, 2)
    
    3.
    Traceback (most recent call last):
        File "", line 1, in 
        File "C:\Users\John\anaconda3\lib\unittest\mock.py", line 892, in assert_called_once
        raise AssertionError(msg)
    AssertionError: Expected 'getResult' to have been called once. Called 2 times.
    Calls: [call(), call()].
        
    _8
  •  myMock.setResult(1, 2)
     myMock.setResult.assert_called_with(1, 2)
    
    5.
     myMock.getResult.assert_called()
    
    _4
  •  myMock.setResult(1, 2)
     myMock.setResult.assert_called_with(1, 2)
    
    7.
     myMock.setResult(1, 2)
     myMock.setResult.assert_called_with(1, 2)
    
    8
  •  myMock.setResult(1, 2)
     myMock.setResult.assert_called_with(1, 2)
    
    _9.
    Traceback (most recent call last):
      File "", line 1, in 
      File "C:\Users\John\anaconda3\lib\unittest\mock.py", line 913, in assert_called_with
        raise AssertionError(_error_message()) from cause
    AssertionError: expected call not found.
    Expected: setResult(2, 1)
    Actual: setResult(1, 2)
        
    _0
  • Traceback (most recent call last):
      File "", line 1, in 
      File "C:\Users\John\anaconda3\lib\unittest\mock.py", line 913, in assert_called_with
        raise AssertionError(_error_message()) from cause
    AssertionError: expected call not found.
    Expected: setResult(2, 1)
    Actual: setResult(1, 2)
        
    _1.
    Traceback (most recent call last):
      File "", line 1, in 
      File "C:\Users\John\anaconda3\lib\unittest\mock.py", line 913, in assert_called_with
        raise AssertionError(_error_message()) from cause
    AssertionError: expected call not found.
    Expected: setResult(2, 1)
    Actual: setResult(1, 2)
        
    _2
  • Traceback (most recent call last):
      File "", line 1, in 
      File "C:\Users\John\anaconda3\lib\unittest\mock.py", line 913, in assert_called_with
        raise AssertionError(_error_message()) from cause
    AssertionError: expected call not found.
    Expected: setResult(2, 1)
    Actual: setResult(1, 2)
        
    _3.
     myMock.setResult(1, 2)
     myMock.setResult.assert_called_with(1, 2)
    
    8
  • Traceback (most recent call last):
      File "", line 1, in 
      File "C:\Users\John\anaconda3\lib\unittest\mock.py", line 913, in assert_called_with
        raise AssertionError(_error_message()) from cause
    AssertionError: expected call not found.
    Expected: setResult(2, 1)
    Actual: setResult(1, 2)
        
    _5.
     myMock.setResult(1, 2)
     myMock.setResult.assert_called_with(1, 2)
    
    8
  • Traceback (most recent call last):
      File "", line 1, in 
      File "C:\Users\John\anaconda3\lib\unittest\mock.py", line 913, in assert_called_with
        raise AssertionError(_error_message()) from cause
    AssertionError: expected call not found.
    Expected: setResult(2, 1)
    Actual: setResult(1, 2)
        
    _7.
    Traceback (most recent call last):
      File "", line 1, in 
      File "C:\Users\John\anaconda3\lib\unittest\mock.py", line 913, in assert_called_with
        raise AssertionError(_error_message()) from cause
    AssertionError: expected call not found.
    Expected: setResult(2, 1)
    Actual: setResult(1, 2)
        
    _8
  • Traceback (most recent call last):
      File "", line 1, in 
      File "C:\Users\John\anaconda3\lib\unittest\mock.py", line 913, in assert_called_with
        raise AssertionError(_error_message()) from cause
    AssertionError: expected call not found.
    Expected: setResult(2, 1)
    Actual: setResult(1, 2)
        
    _9.
     myMock.getResult.return_value = 3
     print(myMock.getResult())
    
    0
  •  myMock.getResult.return_value = 3
     print(myMock.getResult())
    
    1.
     myMock.getResult.return_value = 3
     print(myMock.getResult())
    
    2
  •  myMock.getResult.return_value = 3
     print(myMock.getResult())
    
    3.
     myMock.getResult.assert_called()
    
    _4
  •  myMock.getResult.return_value = 3
     print(myMock.getResult())
    
    5. hash default untuk tiruan
  •  myMock.getResult.return_value = 3
     print(myMock.getResult())
    
    6. string default untuk mock
  •  myMock.getResult.return_value = 3
     print(myMock.getResult())
    
    7. default
     myMock.getResult.return_value = 3
     print(myMock.getResult())
    
    _8 untuk mock

Menggunakan

Traceback (most recent call last):
    File "", line 1, in 
    File "C:\Users\John\anaconda3\lib\unittest\mock.py", line 892, in assert_called_once
    raise AssertionError(msg)
AssertionError: Expected 'getResult' to have been called once. Called 2 times.
Calls: [call(), call()].
    
_5 memerlukan penyiapan tambahan, tetapi menghemat banyak waktu. Langkah-langkah di bawah ini menunjukkan kepada Anda penggunaan dasar dari objek
Traceback (most recent call last):
    File "", line 1, in 
    File "C:\Users\John\anaconda3\lib\unittest\mock.py", line 892, in assert_called_once
    raise AssertionError(msg)
AssertionError: Expected 'getResult' to have been called once. Called 2 times.
Calls: [call(), call()].
    
5

  1. Sebelum Anda dapat melakukan apa pun, Anda perlu membuat instance objek

    Traceback (most recent call last):
        File "", line 1, in 
        File "C:\Users\John\anaconda3\lib\unittest\mock.py", line 892, in assert_called_once
        raise AssertionError(msg)
    AssertionError: Expected 'getResult' to have been called once. Called 2 times.
    Calls: [call(), call()].
        
    5 baru, seperti yang ditunjukkan di bawah ini

    Python 3.8.10 (default, Sep 28 2021, 16:10:42)
    [GCC 9.3.0] on linux
    Type "help", "copyright", "credits" or "license" for more information.
    >>>
    _4
  2. Objek

    Traceback (most recent call last):
        File "", line 1, in 
        File "C:\Users\John\anaconda3\lib\unittest\mock.py", line 892, in assert_called_once
        raise AssertionError(msg)
    AssertionError: Expected 'getResult' to have been called once. Called 2 times.
    Calls: [call(), call()].
        
    _5,
    Python 3.8.10 (default, Sep 28 2021, 16:10:42)
    [GCC 9.3.0] on linux
    Type "help", "copyright", "credits" or "license" for more information.
    >>>
    03 memiliki nilai prasetel tertentu. Gunakan kode di bawah ini untuk melihat nilai dari daftar yang dibuat oleh objek
    Traceback (most recent call last):
        File "", line 1, in 
        File "C:\Users\John\anaconda3\lib\unittest\mock.py", line 892, in assert_called_once
        raise AssertionError(msg)
    AssertionError: Expected 'getResult' to have been called once. Called 2 times.
    Calls: [call(), call()].
        
    5

    Python 3.8.10 (default, Sep 28 2021, 16:10:42)
    [GCC 9.3.0] on linux
    Type "help", "copyright", "credits" or "license" for more information.
    >>>
    _5

    Saat Anda menjalankan kode ini, Anda akan melihat nilai keluaran berikut

    Python 3.8.10 (default, Sep 28 2021, 16:10:42)
    [GCC 9.3.0] on linux
    Type "help", "copyright", "credits" or "license" for more information.
    >>>
    _6
  3. A

    Traceback (most recent call last):
        File "", line 1, in 
        File "C:\Users\John\anaconda3\lib\unittest\mock.py", line 892, in assert_called_once
        raise AssertionError(msg)
    AssertionError: Expected 'getResult' to have been called once. Called 2 times.
    Calls: [call(), call()].
        
    _5 tidak membantu jika Anda tidak dapat mengubah nilai yang dihasilkannya untuk memenuhi kebutuhan tertentu. Jalankan kode di bawah ini untuk menetapkan dan melihat nilai pengembalian khusus untuk objek
    Python 3.8.10 (default, Sep 28 2021, 16:10:42)
    [GCC 9.3.0] on linux
    Type "help", "copyright", "credits" or "license" for more information.
    >>>
    03 Anda

    Python 3.8.10 (default, Sep 28 2021, 16:10:42)
    [GCC 9.3.0] on linux
    Type "help", "copyright", "credits" or "license" for more information.
    >>>
    _7

    Output menunjukkan satu keanehan dalam pengaturan nilai, nilai

     myMock.getResult.return_value = 3
     print(myMock.getResult())
    
    7 selalu
    Python 3.8.10 (default, Sep 28 2021, 16:10:42)
    [GCC 9.3.0] on linux
    Type "help", "copyright", "credits" or "license" for more information.
    >>>
    08 lebih dari yang Anda atur. Ini berarti Anda harus memberi kompensasi dalam kode pengujian Anda

    Python 3.8.10 (default, Sep 28 2021, 16:10:42)
    [GCC 9.3.0] on linux
    Type "help", "copyright", "credits" or "license" for more information.
    >>>
    _8
  4. Ada dua cara untuk menyiapkan

    Traceback (most recent call last):
      File "", line 1, in 
      File "C:\Users\John\anaconda3\lib\unittest\mock.py", line 913, in assert_called_with
        raise AssertionError(_error_message()) from cause
    AssertionError: expected call not found.
    Expected: setResult(2, 1)
    Actual: setResult(1, 2)
        
    1. Awalnya,
    Traceback (most recent call last):
      File "", line 1, in 
      File "C:\Users\John\anaconda3\lib\unittest\mock.py", line 913, in assert_called_with
        raise AssertionError(_error_message()) from cause
    AssertionError: expected call not found.
    Expected: setResult(2, 1)
    Actual: setResult(1, 2)
        
    _1 mengembalikan daftar kosong meskipun Anda dapat mengaturnya seperti nilai lainnya. Cara Anda mengonfigurasi
    Traceback (most recent call last):
      File "", line 1, in 
      File "C:\Users\John\anaconda3\lib\unittest\mock.py", line 913, in assert_called_with
        raise AssertionError(_error_message()) from cause
    AssertionError: expected call not found.
    Expected: setResult(2, 1)
    Actual: setResult(1, 2)
        
    _1 membuat perbedaan seperti yang ditunjukkan pada kode di bawah ini

    Python 3.8.10 (default, Sep 28 2021, 16:10:42)
    [GCC 9.3.0] on linux
    Type "help", "copyright", "credits" or "license" for more information.
    >>>
    _9

    Kasus pertama menggunakan daftar standar, yang tetap utuh setelah setiap panggilan. Saat Anda menggunakan

    Python 3.8.10 (default, Sep 28 2021, 16:10:42)
    [GCC 9.3.0] on linux
    Type "help", "copyright", "credits" or "license" for more information.
    >>>
    12 sebagai gantinya, data dikonsumsi setelah penggunaan pertama seperti yang ditunjukkan pada output

     from unittest.mock import Mock
     myMock = Mock()
     print(myMock)
    
    0

    MagicMock juga mendukung atribut dalam daftar di bawah ini. Namun, MagicMock tidak mengonfigurasi atribut ini dengan nilai default

  • Python 3.8.10 (default, Sep 28 2021, 16:10:42)
    [GCC 9.3.0] on linux
    Type "help", "copyright", "credits" or "license" for more information.
    >>>
    _13
  • Python 3.8.10 (default, Sep 28 2021, 16:10:42)
    [GCC 9.3.0] on linux
    Type "help", "copyright", "credits" or "license" for more information.
    >>>
    _14
  • Python 3.8.10 (default, Sep 28 2021, 16:10:42)
    [GCC 9.3.0] on linux
    Type "help", "copyright", "credits" or "license" for more information.
    >>>
    _15
  • Python 3.8.10 (default, Sep 28 2021, 16:10:42)
    [GCC 9.3.0] on linux
    Type "help", "copyright", "credits" or "license" for more information.
    >>>
    _16
  • Python 3.8.10 (default, Sep 28 2021, 16:10:42)
    [GCC 9.3.0] on linux
    Type "help", "copyright", "credits" or "license" for more information.
    >>>
    _17
  • Python 3.8.10 (default, Sep 28 2021, 16:10:42)
    [GCC 9.3.0] on linux
    Type "help", "copyright", "credits" or "license" for more information.
    >>>
    _18
  • Python 3.8.10 (default, Sep 28 2021, 16:10:42)
    [GCC 9.3.0] on linux
    Type "help", "copyright", "credits" or "license" for more information.
    >>>
    _19
  • Python 3.8.10 (default, Sep 28 2021, 16:10:42)
    [GCC 9.3.0] on linux
    Type "help", "copyright", "credits" or "license" for more information.
    >>>
    _20
  • Python 3.8.10 (default, Sep 28 2021, 16:10:42)
    [GCC 9.3.0] on linux
    Type "help", "copyright", "credits" or "license" for more information.
    >>>
    _21
  • Python 3.8.10 (default, Sep 28 2021, 16:10:42)
    [GCC 9.3.0] on linux
    Type "help", "copyright", "credits" or "license" for more information.
    >>>
    _22
  • Python 3.8.10 (default, Sep 28 2021, 16:10:42)
    [GCC 9.3.0] on linux
    Type "help", "copyright", "credits" or "license" for more information.
    >>>
    _23
  • Python 3.8.10 (default, Sep 28 2021, 16:10:42)
    [GCC 9.3.0] on linux
    Type "help", "copyright", "credits" or "license" for more information.
    >>>
    _24
  • Python 3.8.10 (default, Sep 28 2021, 16:10:42)
    [GCC 9.3.0] on linux
    Type "help", "copyright", "credits" or "license" for more information.
    >>>
    _25
  • Python 3.8.10 (default, Sep 28 2021, 16:10:42)
    [GCC 9.3.0] on linux
    Type "help", "copyright", "credits" or "license" for more information.
    >>>
    _26
  • Python 3.8.10 (default, Sep 28 2021, 16:10:42)
    [GCC 9.3.0] on linux
    Type "help", "copyright", "credits" or "license" for more information.
    >>>
    _27
  • Python 3.8.10 (default, Sep 28 2021, 16:10:42)
    [GCC 9.3.0] on linux
    Type "help", "copyright", "credits" or "license" for more information.
    >>>
    _28

Patch() Dekorator Python Mock Library

Patch tiruan Python menyediakan pengganti objek nyata. Ini memberi Anda kendali atas ruang lingkup di mana objek sebenarnya diejek. Setelah objek nyata ada dalam ruang lingkup yang diperlukan, tambalan tidak lagi menyediakan pengganti dan pembersihan dilakukan secara otomatis. Ada dua bentuk metode

Python 3.8.10 (default, Sep 28 2021, 16:10:42)
[GCC 9.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>
_29. dekorator dan manajer konteks

Mereka berdua mencapai hal yang sama; . Bagian ini memberikan metode bekerja dengan bentuk dekorator

Python 3.8.10 (default, Sep 28 2021, 16:10:42)
[GCC 9.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>
29. Langkah-langkah berikut menunjukkan penggunaan dasar
Python 3.8.10 (default, Sep 28 2021, 16:10:42)
[GCC 9.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>
29. Contoh di bawah menyoroti penggunaan dasar tambalan saat pengujian

  1. Hal pertama yang Anda butuhkan adalah objek untuk ditambal. Buat file bernama

    Python 3.8.10 (default, Sep 28 2021, 16:10:42)
    [GCC 9.3.0] on linux
    Type "help", "copyright", "credits" or "license" for more information.
    >>>
    _32 dan tambahkan kode berikut

    Mengajukan. Kelas. py

     from unittest.mock import Mock
     myMock = Mock()
     print(myMock)
    
    1
     from unittest.mock import Mock
     myMock = Mock()
     print(myMock)
    
    2

  2. Sekarang Anda memerlukan beberapa kode yang menggunakan

    Python 3.8.10 (default, Sep 28 2021, 16:10:42)
    [GCC 9.3.0] on linux
    Type "help", "copyright", "credits" or "license" for more information.
    >>>
    _33. Buat file lain bernama
    Python 3.8.10 (default, Sep 28 2021, 16:10:42)
    [GCC 9.3.0] on linux
    Type "help", "copyright", "credits" or "license" for more information.
    >>>
    34 dan tambahkan kode berikut

    Mengajukan. UseMyClass. py

     from unittest.mock import Mock
     myMock = Mock()
     print(myMock)
    
    3
     from unittest.mock import Mock
     myMock = Mock()
     print(myMock)
    
    4

    Panggilan ke

    Python 3.8.10 (default, Sep 28 2021, 16:10:42)
    [GCC 9.3.0] on linux
    Type "help", "copyright", "credits" or "license" for more information.
    >>>
    _35 di baris terakhir dikomentari, sehingga Anda dapat melihat bahwa metode
    Python 3.8.10 (default, Sep 28 2021, 16:10:42)
    [GCC 9.3.0] on linux
    Type "help", "copyright", "credits" or "license" for more information.
    >>>
    35 benar-benar mengakses
    Python 3.8.10 (default, Sep 28 2021, 16:10:42)
    [GCC 9.3.0] on linux
    Type "help", "copyright", "credits" or "license" for more information.
    >>>
    33. Untuk menjalankan kode dalam file, dari baris perintah gunakan perintah berikut

     from unittest.mock import Mock
     myMock = Mock()
     print(myMock)
    
    5
  3. Buat file ketiga bernama

    Python 3.8.10 (default, Sep 28 2021, 16:10:42)
    [GCC 9.3.0] on linux
    Type "help", "copyright", "credits" or "license" for more information.
    >>>
    _38 dengan kode uji seperti yang ditunjukkan di bawah ini

    Mengajukan. TestUseMyClass. py

     from unittest.mock import Mock
     myMock = Mock()
     print(myMock)
    
    6
     from unittest.mock import Mock
     myMock = Mock()
     print(myMock)
    
    7

Anda perlu mengimpor fungsionalitas

Python 3.8.10 (default, Sep 28 2021, 16:10:42)
[GCC 9.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>
_39 untuk melakukan pengujian. Paket
Python 3.8.10 (default, Sep 28 2021, 16:10:42)
[GCC 9.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>
40 menyediakan kemampuan untuk menggunakan dekorator
Python 3.8.10 (default, Sep 28 2021, 16:10:42)
[GCC 9.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>
29, dan
Traceback (most recent call last):
    File "", line 1, in 
    File "C:\Users\John\anaconda3\lib\unittest\mock.py", line 892, in assert_called_once
    raise AssertionError(msg)
AssertionError: Expected 'getResult' to have been called once. Called 2 times.
Calls: [call(), call()].
    
5 sebagai pengganti objek. Anda juga memerlukan akses ke file yang sedang diuji (bukan file kelas, tetapi file yang benar-benar menggunakan objek). Untuk menggunakan
Python 3.8.10 (default, Sep 28 2021, 16:10:42)
[GCC 9.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>
_43 Anda perlu menentukan yang berikut ini

  • nama file,
    Python 3.8.10 (default, Sep 28 2021, 16:10:42)
    [GCC 9.3.0] on linux
    Type "help", "copyright", "credits" or "license" for more information.
    >>>
    _44
  • nama kelas,
    Python 3.8.10 (default, Sep 28 2021, 16:10:42)
    [GCC 9.3.0] on linux
    Type "help", "copyright", "credits" or "license" for more information.
    >>>
    _45
  • nama metode,
    Python 3.8.10 (default, Sep 28 2021, 16:10:42)
    [GCC 9.3.0] on linux
    Type "help", "copyright", "credits" or "license" for more information.
    >>>
    _46

Penting untuk menyampaikan informasi ini sebagai string sehingga pesan kesalahan Anda berisi informasi yang dapat membantu Anda mengidentifikasi sumber kesalahan

Untuk menggunakan tiruan (

Python 3.8.10 (default, Sep 28 2021, 16:10:42)
[GCC 9.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>
_47 dalam kasus ini), berikan parameter untuknya sebagai bagian dari panggilan ke metode pengujian. Contoh ini benar-benar menunjukkan bahwa Anda menggunakan
Traceback (most recent call last):
    File "", line 1, in 
    File "C:\Users\John\anaconda3\lib\unittest\mock.py", line 892, in assert_called_once
    raise AssertionError(msg)
AssertionError: Expected 'getResult' to have been called once. Called 2 times.
Calls: [call(), call()].
    
5 sebagai pengganti
Python 3.8.10 (default, Sep 28 2021, 16:10:42)
[GCC 9.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>
33 dengan membuat berbagai pernyataan. Jadi, sampai Anda benar-benar menelepon
Python 3.8.10 (default, Sep 28 2021, 16:10:42)
[GCC 9.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>
_35,
Python 3.8.10 (default, Sep 28 2021, 16:10:42)
[GCC 9.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>
47 belum dipanggil untuk menggantikannya. Setelah Anda memanggil
Python 3.8.10 (default, Sep 28 2021, 16:10:42)
[GCC 9.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>
35 dalam kode, Anda dapat mulai menggunakan berbagai fitur
Traceback (most recent call last):
    File "", line 1, in 
    File "C:\Users\John\anaconda3\lib\unittest\mock.py", line 892, in assert_called_once
    raise AssertionError(msg)
AssertionError: Expected 'getResult' to have been called once. Called 2 times.
Calls: [call(), call()].
    
5 untuk menentukan bagaimana fungsi mocking dilakukan

Kode menyediakan dua pernyataan cetak untuk memastikan bahwa kode telah berjalan seperti yang diharapkan. Proses yang berhasil tidak menampilkan informasi apa pun kecuali pesan sukses. Pesan sukses mungkin tidak berisi informasi sebanyak yang Anda perlukan untuk debugging. Dua baris kode terakhir dalam file

Python 3.8.10 (default, Sep 28 2021, 16:10:42)
[GCC 9.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>
_38 memulai proses pengujian. Ada beberapa metode untuk memulai tes. Salah satu metode tersebut ditunjukkan di bawah ini

Pada baris perintah ketik

Python 3.8.10 (default, Sep 28 2021, 16:10:42)
[GCC 9.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>
_55 dan tekan Enter. Output tes ditunjukkan di bawah ini

 from unittest.mock import Mock
 myMock = Mock()
 print(myMock)
_8

Kesimpulan

Mocking memungkinkan Anda untuk menguji aplikasi Anda saat Anda mengembangkannya, yang mengurangi utang teknis dan biaya pengembangan. Meskipun stubbing dan faking memiliki tempat tersendiri dalam perangkat pengujian Anda, mocking secara signifikan lebih fleksibel daripada metodologi lainnya. Mengejek dapat sangat mengurangi waktu pembersihan untuk rangkaian pengujian Anda nanti. Menggunakan dekorator

Python 3.8.10 (default, Sep 28 2021, 16:10:42)
[GCC 9.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>
_29 dalam file terpisah, seperti yang ditunjukkan pada bagian sebelumnya, menghilangkan kebutuhan untuk pembersihan kode nanti. Ini terutama terjadi ketika bekerja dengan aplikasi yang kompleks

Bagaimana Anda mengejek objek dengan Python?

Jika Anda ingin meniru objek selama seluruh fungsi pengujian, Anda dapat menggunakan patch() sebagai dekorator fungsi . Fungsi-fungsi ini sekarang ada di file mereka sendiri, terpisah dari pengujiannya. Selanjutnya, Anda akan membuat ulang tes Anda dalam file bernama tes. py.

Bagaimana Anda menulis file tiruan dengan Python?

Untuk memalsukan file pembuka dan menulis konten di dalamnya, kita dapat menggunakan mock_open(). .
panggil metode kami yang sebenarnya FileWriter(). .
tegaskan jika mocked_file dibuka dengan jalur file tertentu. fake_file_path , dan tulis mode terbuka. w

Bagaimana cara mengejek suatu objek?

Cara Mock Up Java Objek Secara Manual .
Buat objek palsu dari kelas/antarmuka nyata
Instrumen objek palsu untuk merespons dengan data spesifik untuk setiap metode
Verifikasi eksekusi metode pada objek palsu tersebut
Verifikasi argumen yang diteruskan dalam metode objek palsu tersebut
Lempar Pengecualian opsional untuk beberapa panggilan

Bagaimana cara kerja tiruan dengan Python?

Mengejek hanyalah tindakan mengganti bagian aplikasi yang Anda uji dengan versi tiruan dari bagian tersebut yang disebut tiruan . Alih-alih memanggil implementasi yang sebenarnya, Anda akan memanggil tiruan, dan kemudian membuat pernyataan tentang apa yang Anda harapkan terjadi.