PYTHON UNIT TESTING
CÁC CHỦ ĐỀ
BÀI MỚI NHẤT
MỚI CẬP NHẬT

Thông báo: Download 4 khóa học Python từ cơ bản đến nâng cao tại đây.

Sử dụng patch() trong unittest của Python

Trong các bài kiểm thử tự động hóa, việc kiểm tra các thành phần trong mã nguồn một cách độc lập và không bị ảnh hưởng bởi các yếu tố ngoại vi là vô cùng quan trọng. Python cung cấp công cụ patch() trong mô-đun unittest.mock, giúp chúng ta thay thế tạm thời các hàm, phương thức, hoặc lớp bằng các đối tượng mock. Việc sử dụng patch() không chỉ giúp tăng tốc độ kiểm thử mà còn đảm bảo tính chính xác của kết quả bằng cách loại bỏ các yếu tố ngoại vi và biến động không mong muốn. Trong bài viết này, bạn sẽ học cách sử dụng patch() trong unittest của Python để thay thế tạm thời một mục tiêu bằng một đối tượng mock, từ đó giúp các bài kiểm thử của bạn trở nên mạnh mẽ và đáng tin cậy hơn.

test php

banquyen png
Bài viết này được đăng tại freetuts.net, không được copy dưới mọi hình thức.

Giới thiệu về patch trong Python

Ph C6 B0 C6 A1ng 20th E1 BB A9c 20assert   20trong 20Python 20 2  png

Mô-đun unittest.mock có một hàm patch() cho phép bạn thay thế tạm thời một mục tiêu bằng một đối tượng mock. Mục tiêu có thể là một hàm, phương thức, hoặc lớp. Cú pháp của mục tiêu là một chuỗi theo định dạng sau:

'package.module.className'

Các bước quan trọng khi sử dụng patch()

Xác định mục tiêu

Để xác định một mục tiêu:

Bài viết này được đăng tại [free tuts .net]

  • Mục tiêu phải có thể import được.
  • Thay thế mục tiêu tại nơi nó được sử dụng, không phải nơi nó được định nghĩa.

Gọi patch()

Python cung cấp ba cách để gọi patch():

  • Sử dụng như một decorator cho hàm hoặc lớp.
  • Sử dụng như một context manager.
  • Khởi động và dừng thủ công.

Ví dụ về patch() trong Python

Giả sử bạn có một mô-đun total.py như sau:

def read(filename):
    """Đọc một tệp văn bản và trả về danh sách các số"""
    with open(filename) as f:
        lines = f.readlines()
        return [float(line.strip()) for line in lines]

def calculate_total(filename):
    """Trả về tổng số trong tệp văn bản"""
    numbers = read(filename)
    return sum(numbers)

Sử dụng patch() như một decorator

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)

Sử dụng patch() như một context manager

import unittest
from unittest.mock import patch
import total

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

Sử dụng patch() thủ công

import unittest
from unittest.mock import patch
import total

class TestTotal(unittest.TestCase):
    def test_calculate_total(self):
        # bắt đầu patch
        patcher = patch('total.read')

        # tạo một đối tượng mock
        mock_read = patcher.start()

        # gán giá trị trả về
        mock_read.return_value = [1, 2, 3]

        # kiểm tra calculate_total
        result = total.calculate_total('')
        self.assertEqual(result, 6)

        # dừng patch
        patcher.stop()

Kết bài

Việc sử dụng patch() từ mô-đun unittest.mock trong Python là một kỹ thuật mạnh mẽ và linh hoạt để thay thế tạm thời các mục tiêu bằng các đối tượng mock. Bằng cách sử dụng patch() như một decorator, một context manager, hoặc gọi thủ công với các phương thức start()stop(), bạn có thể đảm bảo rằng các bài kiểm thử của mình được thực hiện trong môi trường kiểm soát và dự đoán được. Điều này không chỉ giúp tăng tốc độ kiểm thử mà còn đảm bảo rằng các kết quả kiểm thử phản ánh chính xác hành vi của mã nguồn, loại bỏ các yếu tố ngoại vi không mong muốn. Qua bài viết này, bạn đã nắm bắt được cách sử dụng patch() một cách hiệu quả, giúp nâng cao chất lượng và độ tin cậy của các bài kiểm thử trong dự án của mình.

Cùng chuyên mục:

Cách thêm Progress Bar trong Python với chỉ một dòng Code

Cách thêm Progress Bar trong Python với chỉ một dòng Code

Toán tử Walrus Operator- Tính năng mới trong Python 3.8

Toán tử Walrus Operator- Tính năng mới trong Python 3.8

Cách nạp dữ liệu Machine Learning từ File trong Python

Cách nạp dữ liệu Machine Learning từ File trong Python

Hướng dẫn sử dụng Google Sheets API với Python

Hướng dẫn sử dụng Google Sheets API với Python

Xây dựng  web Python tự động hóa Twitter | Flask, Heroku, Twitter API & Google Sheets API

Xây dựng web Python tự động hóa Twitter | Flask, Heroku, Twitter API & Google Sheets API

Xây dựng Web Machine Learning đẹp mắt với Streamlit và Scikit-learn trong Python

Xây dựng Web Machine Learning đẹp mắt với Streamlit và Scikit-learn trong Python

Hướng dẫn tạo Chatbot đơn giản bằng PyTorch

Hướng dẫn tạo Chatbot đơn giản bằng PyTorch

11 mẹo và thủ thuật để viết Code Python hiệu quả hơn

11 mẹo và thủ thuật để viết Code Python hiệu quả hơn

Hướng dẫn làm ứng dụng TODO với Flask dành cho người mới bắt đầu trong Python

Hướng dẫn làm ứng dụng TODO với Flask dành cho người mới bắt đầu trong Python

Hướng dẫn viết Snake Game bằng Python

Hướng dẫn viết Snake Game bằng Python

Cách sử dụng chế độ interactive trong Python

Cách sử dụng chế độ interactive trong Python

Cách sử dụng Python Debugger với hàm breakpoint()

Cách sử dụng Python Debugger với hàm breakpoint()

Xây dựng ứng dụng Web Style Transfer với PyTorch và Streamlit

Xây dựng ứng dụng Web Style Transfer với PyTorch và Streamlit

Cách cài đặt Jupyter Notebook trong môi trường Conda và thêm Kernel

Cách cài đặt Jupyter Notebook trong môi trường Conda và thêm Kernel

Hướng dẫn xây dựng ứng dụng dự đoán giá cổ phiếu bằng Python

Hướng dẫn xây dựng ứng dụng dự đoán giá cổ phiếu bằng Python

Hướng dẫn tạo ứng dụng AI hội thoại với NVIDIA Jarvis trong Python

Hướng dẫn tạo ứng dụng AI hội thoại với NVIDIA Jarvis trong Python

Hỗ trợ Async trong Django 3.1

Hỗ trợ Async trong Django 3.1

8 mẹo tái cấu trúc Python giúp mã sạch hơn và Pythonic

8 mẹo tái cấu trúc Python giúp mã sạch hơn và Pythonic

Ý nghĩa của if __name__ ==

Ý nghĩa của if __name__ == "__main__" trong Python

Cách xóa phần tử trong danh sách Python

Cách xóa phần tử trong danh sách Python

Top