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 Unittest Subtest trong Python

Trong bài viết này, bạn sẽ học cách định nghĩa các bài kiểm thử tham số hóa bằng cách sử dụng subTest() của unittest. Việc tham số hóa các bài kiểm thử giúp bạn dễ dàng kiểm thử nhiều trường hợp khác nhau với cùng một phương thức kiểm thử, giảm thiểu sự lặp lại mã nguồn và tăng cường hiệu quả của quá trình kiểm thử. Chúng ta sẽ cùng khám phá cách sử dụng subTest() để tạo ra các bài kiểm thử linh hoạt và hiệu quả hơn trong Python.

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ề context manager unittest subTest trong Python

Đầu tiên, tạo một mô-đun mới gọi là pricing.py và định nghĩa hàm calculate() như sau:

def calculate(price, tax=0, discount=0):
    return round((price - discount) * (1 + tax), 2)

Hàm calculate() tính toán giá trị thực tế từ giá ban đầu, thuế và chiết khấu.

Tiếp theo, tạo mô-đun kiểm thử test_pricing.py để kiểm thử hàm calculate():

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

import unittest

from pricing import calculate


class TestPricing(unittest.TestCase):
    def test_calculate(self):
        pass

Để kiểm thử hàm calculate(), bạn cần đưa ra nhiều trường hợp kiểm thử, ví dụ:

  • Có giá mà không có thuế và chiết khấu
  • Có giá và thuế nhưng không có chiết khấu
  • Có giá và chiết khấu nhưng không có thuế
  • Có giá, thuế và chiết khấu

Để bao quát các trường hợp này, bạn có thể định nghĩa nhiều phương thức kiểm thử hoặc sử dụng một phương thức kiểm thử duy nhất và cung cấp dữ liệu kiểm thử từ một danh sách các trường hợp. Ví dụ:

import unittest

from pricing import calculate


class TestPricing(unittest.TestCase):
    def test_calculate(self):
        items = (
            {'case': 'Không thuế, không chiết khấu', 'price': 10, 'tax': 0, 'discount': 0, 'net_price': 10},
            {'case': 'Có thuế, không chiết khấu', 'price': 10, 'tax': 0.1, 'discount': 0, 'net_price': 11},
            {'case': 'Không thuế, có chiết khấu', 'price': 10, 'tax': 0, 'discount': 1, 'net_price': 9},
            {'case': 'Có thuế, có chiết khấu', 'price': 10, 'tax': 0.1, 'discount': 1, 'net_price': 9.9},
        )

        for item in items:
            with self.subTest(item['case']):
                net_price = calculate(
                    item['price'],
                    item['tax'],
                    item['discount']
                )
                self.assertEqual(
                    net_price,
                    item['net_price']
                )

Chạy kiểm thử:

Chạy kiểm thử bằng lệnh sau:

python -m unittest test_pricing -v

Output:

test_calculate (test_pricing.TestPricing) ... FAIL

======================================================================
FAIL: test_calculate (test_pricing.TestPricing)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "D:\python-unit-testing\test_pricing.py", line 26, in test_calculate
    self.assertEqual(
AssertionError: 11.0 != 10

----------------------------------------------------------------------
Ran 1 test in 0.002s

FAILED (failures=1)

Vấn đề với cách tiếp cận này là kiểm thử dừng lại sau khi gặp lỗi đầu tiên. Để giải quyết vấn đề này, unittest cung cấp cho bạn context manager subTest(). Ví dụ:

import unittest

from pricing import calculate


class TestPricing(unittest.TestCase):
    def test_calculate(self):
        items = (
            {'case': 'Không thuế, không chiết khấu', 'price': 10, 'tax': 0, 'discount': 0, 'net_price': 10},
            {'case': 'Có thuế, không chiết khấu', 'price': 10, 'tax': 0.1, 'discount': 0, 'net_price': 11},
            {'case': 'Không thuế, có chiết khấu', 'price': 10, 'tax': 0, 'discount': 1, 'net_price': 9},
            {'case': 'Có thuế, có chiết khấu', 'price': 10, 'tax': 0.1, 'discount': 1, 'net_price': 9.9},
        )

        for item in items:
            with self.subTest(item['case']):
                net_price = calculate(
                    item['price'],
                    item['tax'],
                    item['discount']
                )
                self.assertEqual(
                    net_price,
                    item['net_price']
                )

Chạy kiểm thử:

Chạy kiểm thử bằng lệnh sau:

python -m unittest test_pricing -v

Output:

test_calculate (test_pricing.TestPricing) ... 
======================================================================
FAIL: test_calculate (test_pricing.TestPricing) [Có thuế, không chiết khấu]
----------------------------------------------------------------------
Traceback (most recent call last):
  File "D:\python-unit-testing\test_pricing.py", line 26, in test_calculate
    self.assertEqual(
AssertionError: 11.0 != 10

======================================================================
FAIL: test_calculate (test_pricing.TestPricing) [Không thuế, có chiết khấu]
----------------------------------------------------------------------
Traceback (most recent call last):
  File "D:\python-unit-testing\test_pricing.py", line 26, in test_calculate
    self.assertEqual(
AssertionError: 9 != 10

----------------------------------------------------------------------
Ran 1 test in 0.001s

FAILED (failures=2)

Bằng cách sử dụng subTest(), kiểm thử không dừng lại sau khi gặp lỗi đầu tiên. Đồng thời, nó hiển thị thông điệp chi tiết sau mỗi lỗi giúp bạn dễ dàng kiểm tra từng trường hợp.

Cú pháp context manager subTest() trong Python

Cú pháp của subTest() như sau:

def subTest(self, msg=_subtest_msg_sentinel, **params):

subTest() trả về một context manager. Tham số tùy chọn msg xác định khối đóng của subtest được trả về bởi context manager.

Nếu có lỗi xảy ra, nó sẽ đánh dấu trường hợp kiểm thử là thất bại. Tuy nhiên, nó sẽ tiếp tục thực thi sau khối được bao bởi context manager, cho phép các mã kiểm thử tiếp theo được thực thi.

Kết bài

Trong hướng dẫn này, chúng ta đã tìm hiểu cách sử dụng context manager subTest() của unittest để tham số hóa các kiểm thử. Bằng cách áp dụng subTest(), chúng ta có thể kiểm thử nhiều trường hợp khác nhau trong cùng một phương thức kiểm thử, giúp mã nguồn kiểm thử trở nên gọn gàng, dễ bảo trì và dễ hiểu hơn. Điều này không chỉ tiết kiệm thời gian mà còn giúp đảm bảo rằng tất cả các trường hợp đều được kiểm thử một cách chính xác và hiệu quả. Hãy áp dụng kỹ thuật này vào các dự án của bạn để nâng cao chất lượng và độ tin cậy của phần mềm.

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