Thử nghiệm trong Python là gì?

Một đơn vị là một đoạn mã cụ thể sẽ được kiểm tra, chẳng hạn như một chức năng hoặc một lớp. Các bài kiểm tra đơn vị sau đó là các đoạn mã khác thực hiện cụ thể đơn vị mã với đầy đủ các đầu vào khác nhau, bao gồm các trường hợp ranh giới và cạnh. Cả hai khung công tác unittest và pytest đều có thể được sử dụng để viết các bài kiểm tra đơn vị

Ví dụ: giả sử bạn có chức năng xác thực định dạng của số tài khoản mà người dùng nhập vào biểu mẫu web

def validate_account_number_format(account_string):
    # Return False if invalid, True if valid
    # ...

Các bài kiểm tra đơn vị chỉ quan tâm đến giao diện của đơn vị—các đối số và giá trị trả về của đơn vị—không liên quan đến việc triển khai của nó (đó là lý do tại sao không có mã nào được hiển thị ở đây trong thân hàm; thông thường, bạn sẽ sử dụng các thư viện đã được kiểm tra tốt khác để giúp triển khai chức năng . Trong ví dụ này, hàm chấp nhận bất kỳ chuỗi nào và trả về true nếu chuỗi đó chứa số tài khoản được định dạng đúng, ngược lại là false

Để kiểm tra kỹ lưỡng chức năng này, bạn muốn đưa vào nó mọi đầu vào có thể tưởng tượng được. chuỗi hợp lệ, chuỗi nhập sai (tắt một hoặc hai ký tự hoặc chứa ký tự không hợp lệ), chuỗi quá ngắn hoặc quá dài, chuỗi trống, đối số null, chuỗi chứa ký tự điều khiển (mã không phải văn bản), chuỗi chứa HTML, chuỗi . Điều đặc biệt quan trọng là kiểm tra các trường hợp bảo mật như tấn công tiêm chích nếu chuỗi đã xác thực sau đó được sử dụng trong các truy vấn cơ sở dữ liệu hoặc được hiển thị trong giao diện người dùng của ứng dụng

Đối với mỗi đầu vào, sau đó bạn xác định (hoặc các giá trị) giá trị trả về dự kiến ​​của hàm. Trong ví dụ này, một lần nữa, hàm chỉ trả về giá trị true cho các chuỗi được định dạng đúng. (Cho dù bản thân số đó có phải là tài khoản thực hay không là một vấn đề khác sẽ được xử lý ở nơi khác thông qua truy vấn cơ sở dữ liệu. )

Với tất cả các đối số và giá trị trả về dự kiến ​​trong tay, bây giờ bạn tự viết các bài kiểm tra, đó là các đoạn mã gọi hàm với một đầu vào cụ thể, sau đó so sánh giá trị trả về thực tế với giá trị trả về dự kiến ​​(sự so sánh này được gọi là một xác nhận

# Import the code to be tested
import validator

# Import the test framework (this is a hypothetical module)
import test_framework

# This is a generalized example, not specific to a test framework
class Test_TestAccountValidator(test_framework.TestBaseClass):
    def test_validator_valid_string():
        # The exact assertion call depends on the framework as well
        assert(validate_account_number_format("1234567890"), True)

    # ...

    def test_validator_blank_string():
        # The exact assertion call depends on the framework as well
        assert(validate_account_number_format(""), False)

    # ...

    def test_validator_sql_injection():
        # The exact assertion call depends on the framework as well
        assert(validate_account_number_format("drop database master"), False)

    # .. tests for all other cases

Cấu trúc chính xác của mã phụ thuộc vào khung thử nghiệm mà bạn đang sử dụng và các ví dụ cụ thể sẽ được cung cấp ở phần sau của bài viết này. Trong mọi trường hợp, như bạn có thể thấy, mỗi bài kiểm tra đều đơn giản. gọi hàm với một đối số và xác nhận giá trị trả về dự kiến

Kết quả tổng hợp của tất cả các thử nghiệm là báo cáo thử nghiệm của bạn, báo cáo này cho bạn biết liệu chức năng (đơn vị) có hoạt động như mong đợi trong tất cả các trường hợp thử nghiệm hay không. Nghĩa là, khi một thiết bị vượt qua tất cả các bài kiểm tra, bạn có thể yên tâm rằng thiết bị đó hoạt động bình thường. (Thực hành phát triển dựa trên thử nghiệm là nơi bạn thực sự viết các bài kiểm tra trước, sau đó viết mã để vượt qua các bài kiểm tra ngày càng nhiều hơn cho đến khi tất cả chúng đều vượt qua. )

Vì các bài kiểm tra đơn vị là các đoạn mã nhỏ, tách biệt (trong kiểm tra đơn vị, bạn tránh được các phụ thuộc bên ngoài và sử dụng dữ liệu giả hoặc các đầu vào mô phỏng khác), nên chúng chạy nhanh và không tốn kém. Đặc điểm này có nghĩa là bạn có thể chạy thử nghiệm đơn vị sớm và thường xuyên. Các nhà phát triển thường chạy thử nghiệm đơn vị ngay cả trước khi đưa mã vào kho lưu trữ; . Nhiều hệ thống tích hợp liên tục cũng chạy thử nghiệm đơn vị sau mỗi lần xây dựng. Chạy thử nghiệm đơn vị sớm và thường có nghĩa là bạn nhanh chóng nắm bắt được hồi quy, đó là những thay đổi không mong muốn trong hành vi của mã mà trước đó đã vượt qua tất cả các thử nghiệm đơn vị của nó. Bởi vì lỗi thử nghiệm có thể dễ dàng bắt nguồn từ một thay đổi mã cụ thể, nên dễ dàng tìm và khắc phục nguyên nhân gây ra lỗi, điều này chắc chắn tốt hơn so với việc phát hiện ra sự cố sau này trong quy trình

Để biết thông tin cơ bản chung về kiểm tra đơn vị, hãy đọc Kiểm tra đơn vị trên Wikipedia. Để biết các ví dụ kiểm tra đơn vị hữu ích, bạn có thể xem lại https. //github. com/gwtw/py-sorting, kho chứa các bài kiểm tra cho các thuật toán sắp xếp khác nhau

Hướng dẫn thử nghiệm ví dụ

Các bài kiểm tra Python là các lớp Python nằm trong các tệp riêng biệt với mã đang được kiểm tra. Mỗi khung kiểm tra chỉ định cấu trúc và đặt tên cho các bài kiểm tra và tệp kiểm tra. Khi bạn viết các bài kiểm tra và kích hoạt khung kiểm tra, Mã VS sẽ định vị các bài kiểm tra đó và cung cấp cho bạn các lệnh khác nhau để chạy và gỡ lỗi chúng

Đối với phần này, hãy tạo một thư mục và mở nó trong Mã VS. Sau đó tạo một tệp có tên

# Import the code to be tested
import validator

# Import the test framework (this is a hypothetical module)
import test_framework

# This is a generalized example, not specific to a test framework
class Test_TestAccountValidator(test_framework.TestBaseClass):
    def test_validator_valid_string():
        # The exact assertion call depends on the framework as well
        assert(validate_account_number_format("1234567890"), True)

    # ...

    def test_validator_blank_string():
        # The exact assertion call depends on the framework as well
        assert(validate_account_number_format(""), False)

    # ...

    def test_validator_sql_injection():
        # The exact assertion call depends on the framework as well
        assert(validate_account_number_format("drop database master"), False)

    # .. tests for all other cases
1 với đoạn mã sau để được kiểm tra

def increment(x):
    return x + 1

def decrement(x):
    return x - 1

Với mã này, bạn có thể trải nghiệm làm việc với các thử nghiệm trong Mã VS như được mô tả trong các phần tiếp theo

Định cấu hình kiểm tra

Khi bạn đã cài đặt tiện ích mở rộng Python và mở tệp Python trong trình chỉnh sửa, biểu tượng cốc thử nghiệm sẽ được hiển thị trên thanh Hoạt động mã VS. Biểu tượng cốc dành cho chế độ xem Test Explorer. Khi mở Test Explorer, bạn sẽ thấy nút Cấu hình kiểm tra nếu bạn chưa bật khung kiểm tra. Khi bạn chọn Cấu hình kiểm tra, bạn sẽ được nhắc chọn khung kiểm tra và thư mục chứa các kiểm tra. Nếu bạn đang sử dụng unittest, bạn cũng sẽ được yêu cầu chọn mẫu toàn cầu tệp được sử dụng để xác định các tệp thử nghiệm của mình

Ghi chú. Mẫu toàn cầu tệp là một mẫu chuỗi được xác định khớp với tên tệp hoặc thư mục dựa trên ký tự đại diện để bao gồm hoặc không bao gồm

Thử nghiệm trong Python là gì?

Bạn có thể định cấu hình các bài kiểm tra của mình bất cứ lúc nào bằng cách sử dụng Python. Cấu hình lệnh Kiểm tra từ. Bạn cũng có thể định cấu hình kiểm tra theo cách thủ công bằng cách đặt

# Import the code to be tested
import validator

# Import the test framework (this is a hypothetical module)
import test_framework

# This is a generalized example, not specific to a test framework
class Test_TestAccountValidator(test_framework.TestBaseClass):
    def test_validator_valid_string():
        # The exact assertion call depends on the framework as well
        assert(validate_account_number_format("1234567890"), True)

    # ...

    def test_validator_blank_string():
        # The exact assertion call depends on the framework as well
        assert(validate_account_number_format(""), False)

    # ...

    def test_validator_sql_injection():
        # The exact assertion call depends on the framework as well
        assert(validate_account_number_format("drop database master"), False)

    # .. tests for all other cases
2 hoặc
# Import the code to be tested
import validator

# Import the test framework (this is a hypothetical module)
import test_framework

# This is a generalized example, not specific to a test framework
class Test_TestAccountValidator(test_framework.TestBaseClass):
    def test_validator_valid_string():
        # The exact assertion call depends on the framework as well
        assert(validate_account_number_format("1234567890"), True)

    # ...

    def test_validator_blank_string():
        # The exact assertion call depends on the framework as well
        assert(validate_account_number_format(""), False)

    # ...

    def test_validator_sql_injection():
        # The exact assertion call depends on the framework as well
        assert(validate_account_number_format("drop database master"), False)

    # .. tests for all other cases
3, có thể được thực hiện trong trình chỉnh sửa Cài đặt hoặc trong tệp
# Import the code to be tested
import validator

# Import the test framework (this is a hypothetical module)
import test_framework

# This is a generalized example, not specific to a test framework
class Test_TestAccountValidator(test_framework.TestBaseClass):
    def test_validator_valid_string():
        # The exact assertion call depends on the framework as well
        assert(validate_account_number_format("1234567890"), True)

    # ...

    def test_validator_blank_string():
        # The exact assertion call depends on the framework as well
        assert(validate_account_number_format(""), False)

    # ...

    def test_validator_sql_injection():
        # The exact assertion call depends on the framework as well
        assert(validate_account_number_format("drop database master"), False)

    # .. tests for all other cases
4 như được mô tả trong tài liệu Cài đặt mã VS. Mỗi khung cũng có các cài đặt cấu hình cụ thể như được mô tả bên dưới cho các thư mục và mẫu của chúng

Nếu cả hai khung được bật, thì tiện ích mở rộng Python sẽ chỉ chạy

# Import the code to be tested
import validator

# Import the test framework (this is a hypothetical module)
import test_framework

# This is a generalized example, not specific to a test framework
class Test_TestAccountValidator(test_framework.TestBaseClass):
    def test_validator_valid_string():
        # The exact assertion call depends on the framework as well
        assert(validate_account_number_format("1234567890"), True)

    # ...

    def test_validator_blank_string():
        # The exact assertion call depends on the framework as well
        assert(validate_account_number_format(""), False)

    # ...

    def test_validator_sql_injection():
        # The exact assertion call depends on the framework as well
        assert(validate_account_number_format("drop database master"), False)

    # .. tests for all other cases
5

Nếu bạn bật pytest, Mã VS sẽ nhắc bạn cài đặt gói khung nếu nó chưa có trong môi trường hiện đang được kích hoạt

Thử nghiệm trong Python là gì?

Tạo bài kiểm tra

Mỗi khung kiểm tra có các quy ước riêng để đặt tên tệp kiểm tra và cấu trúc các kiểm tra bên trong, như được mô tả trong các phần sau. Mỗi trường hợp bao gồm hai phương pháp thử nghiệm, một trong số đó được cố tình đặt thành không thành công cho mục đích trình diễn

Các bài kiểm tra trong unittest

Tạo một tệp có tên

# Import the code to be tested
import validator

# Import the test framework (this is a hypothetical module)
import test_framework

# This is a generalized example, not specific to a test framework
class Test_TestAccountValidator(test_framework.TestBaseClass):
    def test_validator_valid_string():
        # The exact assertion call depends on the framework as well
        assert(validate_account_number_format("1234567890"), True)

    # ...

    def test_validator_blank_string():
        # The exact assertion call depends on the framework as well
        assert(validate_account_number_format(""), False)

    # ...

    def test_validator_sql_injection():
        # The exact assertion call depends on the framework as well
        assert(validate_account_number_format("drop database master"), False)

    # .. tests for all other cases
6 chứa một lớp kiểm tra với hai phương thức kiểm tra

import inc_dec    # The code to test
import unittest   # The test framework

class Test_TestIncrementDecrement(unittest.TestCase):
    def test_increment(self):
        self.assertEqual(inc_dec.increment(3), 4)

    # This test is designed to fail for demonstration purposes.
    def test_decrement(self):
        self.assertEqual(inc_dec.decrement(3), 4)

if __name__ == '__main__':
    unittest.main()

Các thử nghiệm trong pytest

Tạo một tệp có tên

# Import the code to be tested
import validator

# Import the test framework (this is a hypothetical module)
import test_framework

# This is a generalized example, not specific to a test framework
class Test_TestAccountValidator(test_framework.TestBaseClass):
    def test_validator_valid_string():
        # The exact assertion call depends on the framework as well
        assert(validate_account_number_format("1234567890"), True)

    # ...

    def test_validator_blank_string():
        # The exact assertion call depends on the framework as well
        assert(validate_account_number_format(""), False)

    # ...

    def test_validator_sql_injection():
        # The exact assertion call depends on the framework as well
        assert(validate_account_number_format("drop database master"), False)

    # .. tests for all other cases
7 chứa hai phương thức kiểm tra

import inc_dec    # The code to test

def test_increment():
    assert inc_dec.increment(3) == 4

# This test is designed to fail for demonstration purposes.
def test_decrement():
    assert inc_dec.decrement(3) == 4

Khám phá thử nghiệm

Theo mặc định, tiện ích mở rộng Python sẽ cố gắng khám phá các bài kiểm tra sau khi bạn bật khung. Bạn cũng có thể kích hoạt khám phá kiểm tra bất kỳ lúc nào bằng cách sử dụng Kiểm tra. Làm mới lệnh Kiểm tra từ Bảng lệnh

# Import the code to be tested
import validator

# Import the test framework (this is a hypothetical module)
import test_framework

# This is a generalized example, not specific to a test framework
class Test_TestAccountValidator(test_framework.TestBaseClass):
    def test_validator_valid_string():
        # The exact assertion call depends on the framework as well
        assert(validate_account_number_format("1234567890"), True)

    # ...

    def test_validator_blank_string():
        # The exact assertion call depends on the framework as well
        assert(validate_account_number_format(""), False)

    # ...

    def test_validator_sql_injection():
        # The exact assertion call depends on the framework as well
        assert(validate_account_number_format("drop database master"), False)

    # .. tests for all other cases
8 được đặt thành
# Import the code to be tested
import validator

# Import the test framework (this is a hypothetical module)
import test_framework

# This is a generalized example, not specific to a test framework
class Test_TestAccountValidator(test_framework.TestBaseClass):
    def test_validator_valid_string():
        # The exact assertion call depends on the framework as well
        assert(validate_account_number_format("1234567890"), True)

    # ...

    def test_validator_blank_string():
        # The exact assertion call depends on the framework as well
        assert(validate_account_number_format(""), False)

    # ...

    def test_validator_sql_injection():
        # The exact assertion call depends on the framework as well
        assert(validate_account_number_format("drop database master"), False)

    # .. tests for all other cases
9 theo mặc định, nghĩa là khám phá kiểm tra cũng được thực hiện tự động bất cứ khi nào bạn thêm, xóa hoặc cập nhật bất kỳ tệp Python nào trong không gian làm việc. Để tắt tính năng này, hãy đặt giá trị thành
def increment(x):
    return x + 1

def decrement(x):
    return x - 1
0, có thể được thực hiện trong trình chỉnh sửa Cài đặt hoặc trong tệp
# Import the code to be tested
import validator

# Import the test framework (this is a hypothetical module)
import test_framework

# This is a generalized example, not specific to a test framework
class Test_TestAccountValidator(test_framework.TestBaseClass):
    def test_validator_valid_string():
        # The exact assertion call depends on the framework as well
        assert(validate_account_number_format("1234567890"), True)

    # ...

    def test_validator_blank_string():
        # The exact assertion call depends on the framework as well
        assert(validate_account_number_format(""), False)

    # ...

    def test_validator_sql_injection():
        # The exact assertion call depends on the framework as well
        assert(validate_account_number_format("drop database master"), False)

    # .. tests for all other cases
4 như được mô tả trong tài liệu Cài đặt mã VS. Bạn sẽ cần tải lại cửa sổ để cài đặt này có hiệu lực

Khám phá thử nghiệm áp dụng các mẫu khám phá cho khung hiện tại (có thể được tùy chỉnh bằng cách sử dụng). Hành vi mặc định như sau

  • def increment(x):
        return x + 1
    
    def decrement(x):
        return x - 1
    
    2. Tìm bất kỳ tệp Python (
    def increment(x):
        return x + 1
    
    def decrement(x):
        return x - 1
    
    3) nào có tên "test" trong thư mục dự án cấp cao nhất. Tất cả các tệp thử nghiệm phải là các mô-đun hoặc gói có thể nhập được. Bạn có thể tùy chỉnh mẫu đối sánh tệp với cài đặt cấu hình
    def increment(x):
        return x + 1
    
    def decrement(x):
        return x - 1
    
    4 và tùy chỉnh thư mục với cài đặt
    def increment(x):
        return x + 1
    
    def decrement(x):
        return x - 1
    
    5

  • def increment(x):
        return x + 1
    
    def decrement(x):
        return x - 1
    
    6. Tìm kiếm bất kỳ tệp Python (
    def increment(x):
        return x + 1
    
    def decrement(x):
        return x - 1
    
    3) nào có tên bắt đầu bằng "test_" hoặc kết thúc bằng "_test", nằm ở bất kỳ đâu trong thư mục hiện tại và tất cả các thư mục con

Mẹo. Đôi khi các bài kiểm tra được đặt trong các thư mục con không được phát hiện vì không thể nhập các tệp kiểm tra đó. Để làm cho chúng có thể nhập được, hãy tạo một tệp trống có tên

def increment(x):
    return x + 1

def decrement(x):
    return x - 1
8 trong thư mục đó

Nếu quá trình khám phá thử nghiệm thành công, bạn sẽ thấy các thử nghiệm được liệt kê trong Trình khám phá thử nghiệm

Thử nghiệm trong Python là gì?

Nếu phát hiện không thành công (ví dụ: khung thử nghiệm chưa được cài đặt hoặc bạn gặp lỗi cú pháp trong tệp thử nghiệm của mình), bạn sẽ thấy thông báo lỗi hiển thị trong Trình khám phá thử nghiệm. Bạn có thể kiểm tra bảng đầu ra của Python để xem toàn bộ thông báo lỗi (sử dụng lệnh menu View > Output để hiển thị bảng đầu ra, sau đó chọn Python từ danh sách thả xuống ở bên phải)

Thử nghiệm trong Python là gì?

Khi Mã VS nhận ra các bài kiểm tra, nó cung cấp một số cách để chạy các bài kiểm tra đó như được mô tả trong

Chạy thử nghiệm

Bạn có thể chạy thử nghiệm bằng bất kỳ hành động nào sau đây

  • Khi tệp kiểm tra đang mở, hãy chọn biểu tượng chạy màu xanh lá cây được hiển thị trong rãnh bên cạnh dòng định nghĩa kiểm tra, như được hiển thị trong phần trước. Lệnh này chỉ chạy một phương thức đó

    Thử nghiệm trong Python là gì?

  • Từ Bảng lệnh, bằng cách chạy bất kỳ lệnh nào sau đây

    • Bài kiểm tra. Chạy tất cả các bài kiểm tra - Chạy tất cả các bài kiểm tra đã được phát hiện
    • Bài kiểm tra. Chạy thử nghiệm trong tệp hiện tại - Chạy tất cả các thử nghiệm trong một tệp được mở trong trình chỉnh sửa
    • Bài kiểm tra. Chạy thử nghiệm tại con trỏ - Chỉ chạy phương pháp thử nghiệm dưới con trỏ của bạn trong trình chỉnh sửa
  • Từ Test Explorer

    • Để chạy tất cả các thử nghiệm đã phát hiện, hãy chọn nút phát ở đầu Test Explorer

      Thử nghiệm trong Python là gì?

    • Để chạy một nhóm bài kiểm tra cụ thể hoặc một bài kiểm tra đơn lẻ, hãy chọn tệp, lớp hoặc bài kiểm tra, sau đó chọn nút phát ở bên phải của mục đó

      Thử nghiệm trong Python là gì?

    • Bạn cũng có thể chạy một loạt các thử nghiệm thông qua Test Explorer. Để làm điều đó, hãy Ctrl+Click (hoặc Cmd+Click trên macOS .

Sau khi chạy thử, VS Code hiển thị kết quả trực tiếp trong trình chỉnh sửa dưới dạng trang trí máng xối. Các lần kiểm tra không thành công cũng sẽ được đánh dấu trong trình chỉnh sửa, với Chế độ xem Peek hiển thị thông báo lỗi chạy kiểm tra và lịch sử của tất cả các lần chạy kiểm tra. Bạn có thể nhấn Thoát để loại bỏ chế độ xem và bạn có thể tắt chế độ xem bằng cách mở Cài đặt người dùng (Tùy chọn. Mở lệnh Cài đặt (UI) trong Bảng lệnh) và thay đổi giá trị của Kiểm tra. Cài đặt Tự động Mở Peek View thành

def increment(x):
    return x + 1

def decrement(x):
    return x - 1
9.

Trong Test Explorer, kết quả được hiển thị cho các bài kiểm tra riêng lẻ và bất kỳ lớp và tệp nào chứa các bài kiểm tra đó. Các thư mục sẽ hiển thị biểu tượng lỗi nếu bất kỳ bài kiểm tra nào trong thư mục đó không vượt qua

Thử nghiệm trong Python là gì?

Mã VS cũng hiển thị kết quả kiểm tra trong bảng đầu ra Nhật ký kiểm tra Python

Thử nghiệm trong Python là gì?

Chạy thử nghiệm song song

Hỗ trợ chạy thử nghiệm song song với pytest có sẵn thông qua gói

import inc_dec    # The code to test
import unittest   # The test framework

class Test_TestIncrementDecrement(unittest.TestCase):
    def test_increment(self):
        self.assertEqual(inc_dec.increment(3), 4)

    # This test is designed to fail for demonstration purposes.
    def test_decrement(self):
        self.assertEqual(inc_dec.decrement(3), 4)

if __name__ == '__main__':
    unittest.main()
0. Để kích hoạt thử nghiệm song song

  1. Mở thiết bị đầu cuối tích hợp và cài đặt gói

    import inc_dec    # The code to test
    import unittest   # The test framework
    
    class Test_TestIncrementDecrement(unittest.TestCase):
        def test_increment(self):
            self.assertEqual(inc_dec.increment(3), 4)
    
        # This test is designed to fail for demonstration purposes.
        def test_decrement(self):
            self.assertEqual(inc_dec.decrement(3), 4)
    
    if __name__ == '__main__':
        unittest.main()
    
    0. Để biết thêm chi tiết, hãy tham khảo trang tài liệu của dự án

    Cho cửa sổ

    py -3 -m pip install pytest-xdist
    

    Đối với macOS/Linux

    python3 -m pip install pytest-xdist
    
  2. Tiếp theo, tạo một tệp có tên

    import inc_dec    # The code to test
    import unittest   # The test framework
    
    class Test_TestIncrementDecrement(unittest.TestCase):
        def test_increment(self):
            self.assertEqual(inc_dec.increment(3), 4)
    
        # This test is designed to fail for demonstration purposes.
        def test_decrement(self):
            self.assertEqual(inc_dec.decrement(3), 4)
    
    if __name__ == '__main__':
        unittest.main()
    
    2 trong thư mục dự án của bạn và thêm nội dung bên dưới, chỉ định số lượng CPU sẽ được sử dụng. Ví dụ: để thiết lập nó cho 4 CPU

     [pytest]
     addopts=-n4
    

    Hoặc, nếu bạn đang sử dụng tệp

    import inc_dec    # The code to test
    import unittest   # The test framework
    
    class Test_TestIncrementDecrement(unittest.TestCase):
        def test_increment(self):
            self.assertEqual(inc_dec.increment(3), 4)
    
        # This test is designed to fail for demonstration purposes.
        def test_decrement(self):
            self.assertEqual(inc_dec.decrement(3), 4)
    
    if __name__ == '__main__':
        unittest.main()
    
    3

     [tool.pytest.ini_options]
     addopts="-n 4"
    
  3. Chạy thử nghiệm của bạn, giờ sẽ chạy song song

kiểm tra gỡ lỗi

Đôi khi, bạn có thể cần phải xem qua và phân tích các kiểm tra trong trình gỡ lỗi, bởi vì bản thân các kiểm tra đó có lỗi mã mà bạn cần theo dõi hoặc để hiểu rõ hơn lý do tại sao một vùng mã đang được kiểm tra không thành công. Để biết thêm thông tin về gỡ lỗi hoặc để hiểu cách nó hoạt động trong Mã VS, bạn có thể đọc cấu hình gỡ lỗi Python và các bài viết chung về Gỡ lỗi mã VS

Ví dụ: các hàm

import inc_dec    # The code to test
import unittest   # The test framework

class Test_TestIncrementDecrement(unittest.TestCase):
    def test_increment(self):
        self.assertEqual(inc_dec.increment(3), 4)

    # This test is designed to fail for demonstration purposes.
    def test_decrement(self):
        self.assertEqual(inc_dec.decrement(3), 4)

if __name__ == '__main__':
    unittest.main()
4 được cung cấp trước đó không thành công vì bản thân xác nhận bị lỗi. Các bước sau đây trình bày cách phân tích bài kiểm tra

  1. Đặt điểm dừng trên dòng đầu tiên trong hàm

    import inc_dec    # The code to test
    import unittest   # The test framework
    
    class Test_TestIncrementDecrement(unittest.TestCase):
        def test_increment(self):
            self.assertEqual(inc_dec.increment(3), 4)
    
        # This test is designed to fail for demonstration purposes.
        def test_decrement(self):
            self.assertEqual(inc_dec.decrement(3), 4)
    
    if __name__ == '__main__':
        unittest.main()
    
    4

  2. Nhấp chuột phải vào trang trí máng xối bên cạnh định nghĩa chức năng và chọn Kiểm tra gỡ lỗi hoặc chọn biểu tượng Kiểm tra gỡ lỗi bên cạnh kiểm tra đó trong Test Explorer. Mã VS khởi động trình gỡ lỗi và tạm dừng tại điểm ngắt

    Thử nghiệm trong Python là gì?

  3. Trong bảng điều khiển Gỡ lỗi, nhập

    import inc_dec    # The code to test
    import unittest   # The test framework
    
    class Test_TestIncrementDecrement(unittest.TestCase):
        def test_increment(self):
            self.assertEqual(inc_dec.increment(3), 4)
    
        # This test is designed to fail for demonstration purposes.
        def test_decrement(self):
            self.assertEqual(inc_dec.decrement(3), 4)
    
    if __name__ == '__main__':
        unittest.main()
    
    6 để thấy rằng kết quả thực tế là 2, trong khi kết quả mong đợi được chỉ định trong thử nghiệm là giá trị không chính xác của 4

  4. Dừng trình gỡ lỗi và sửa mã bị lỗi

    # unittest
    self.assertEqual(inc_dec.decrement(3), 2)
    
    # pytest
    assert inc_dec.decrement(3) == 2
    
  5. Lưu tệp và chạy lại các bài kiểm tra để xác nhận rằng chúng đã vượt qua và xem trang trí máng xối cũng cho biết trạng thái vượt qua

    Ghi chú. Chạy hoặc gỡ lỗi kiểm tra không tự động lưu tệp kiểm tra. Luôn đảm bảo lưu các thay đổi đối với một bài kiểm tra trước khi chạy nó, nếu không, bạn có thể sẽ bị nhầm lẫn với các kết quả vì chúng vẫn phản ánh phiên bản trước của tệp

Bạn có thể sử dụng các lệnh sau từ Bảng lệnh để kiểm tra gỡ lỗi

  • Bài kiểm tra. Gỡ lỗi tất cả các bài kiểm tra - Khởi chạy trình gỡ lỗi cho tất cả các bài kiểm tra trong không gian làm việc của bạn
  • Bài kiểm tra. Kiểm tra gỡ lỗi trong tệp hiện tại - Khởi chạy trình gỡ lỗi cho các kiểm tra bạn đã xác định trong tệp bạn đã mở trong trình chỉnh sửa
  • Bài kiểm tra. Kiểm tra gỡ lỗi tại con trỏ - Chỉ khởi chạy trình gỡ lỗi cho phương pháp mà bạn tập trung con trỏ vào trình chỉnh sửa. Bạn cũng có thể sử dụng các biểu tượng Kiểm tra gỡ lỗi trong Test Explorer để khởi chạy trình gỡ lỗi cho tất cả các kiểm tra trong phạm vi đã chọn và tất cả các kiểm tra đã phát hiện

Bạn cũng có thể thay đổi hành vi mặc định là nhấp vào trang trí máng xối để gỡ lỗi kiểm tra thay vì chạy, bằng cách thay đổi giá trị cài đặt

import inc_dec    # The code to test
import unittest   # The test framework

class Test_TestIncrementDecrement(unittest.TestCase):
    def test_increment(self):
        self.assertEqual(inc_dec.increment(3), 4)

    # This test is designed to fail for demonstration purposes.
    def test_decrement(self):
        self.assertEqual(inc_dec.decrement(3), 4)

if __name__ == '__main__':
    unittest.main()
7 thành
import inc_dec    # The code to test
import unittest   # The test framework

class Test_TestIncrementDecrement(unittest.TestCase):
    def test_increment(self):
        self.assertEqual(inc_dec.increment(3), 4)

    # This test is designed to fail for demonstration purposes.
    def test_decrement(self):
        self.assertEqual(inc_dec.decrement(3), 4)

if __name__ == '__main__':
    unittest.main()
8 trong tệp
# Import the code to be tested
import validator

# Import the test framework (this is a hypothetical module)
import test_framework

# This is a generalized example, not specific to a test framework
class Test_TestAccountValidator(test_framework.TestBaseClass):
    def test_validator_valid_string():
        # The exact assertion call depends on the framework as well
        assert(validate_account_number_format("1234567890"), True)

    # ...

    def test_validator_blank_string():
        # The exact assertion call depends on the framework as well
        assert(validate_account_number_format(""), False)

    # ...

    def test_validator_sql_injection():
        # The exact assertion call depends on the framework as well
        assert(validate_account_number_format("drop database master"), False)

    # .. tests for all other cases
4 của bạn

Trình gỡ lỗi hoạt động tương tự đối với các bài kiểm tra cũng như đối với các mã Python khác, bao gồm các điểm dừng, kiểm tra biến, v.v. Để tùy chỉnh cài đặt cho kiểm tra gỡ lỗi, bạn có thể chỉ định

import inc_dec    # The code to test

def test_increment():
    assert inc_dec.increment(3) == 4

# This test is designed to fail for demonstration purposes.
def test_decrement():
    assert inc_dec.decrement(3) == 4
0 trong tệp
import inc_dec    # The code to test

def test_increment():
    assert inc_dec.increment(3) == 4

# This test is designed to fail for demonstration purposes.
def test_decrement():
    assert inc_dec.decrement(3) == 4
1 trong thư mục
import inc_dec    # The code to test

def test_increment():
    assert inc_dec.increment(3) == 4

# This test is designed to fail for demonstration purposes.
def test_decrement():
    assert inc_dec.decrement(3) == 4
2 từ không gian làm việc của bạn. Cấu hình này sẽ được sử dụng khi bạn chạy Test. Gỡ lỗi tất cả các bài kiểm tra, kiểm tra. Kiểm tra gỡ lỗi trong tệp hiện tại và kiểm tra. Kiểm tra gỡ lỗi tại các lệnh Con trỏ

Ví dụ: cấu hình bên dưới trong tệp

import inc_dec    # The code to test

def test_increment():
    assert inc_dec.increment(3) == 4

# This test is designed to fail for demonstration purposes.
def test_decrement():
    assert inc_dec.decrement(3) == 4
1 vô hiệu hóa cài đặt
import inc_dec    # The code to test

def test_increment():
    assert inc_dec.increment(3) == 4

# This test is designed to fail for demonstration purposes.
def test_decrement():
    assert inc_dec.decrement(3) == 4
4 để kiểm tra gỡ lỗi

# Import the code to be tested
import validator

# Import the test framework (this is a hypothetical module)
import test_framework

# This is a generalized example, not specific to a test framework
class Test_TestAccountValidator(test_framework.TestBaseClass):
    def test_validator_valid_string():
        # The exact assertion call depends on the framework as well
        assert(validate_account_number_format("1234567890"), True)

    # ...

    def test_validator_blank_string():
        # The exact assertion call depends on the framework as well
        assert(validate_account_number_format(""), False)

    # ...

    def test_validator_sql_injection():
        # The exact assertion call depends on the framework as well
        assert(validate_account_number_format("drop database master"), False)

    # .. tests for all other cases
0

Nếu bạn có nhiều mục nhập cấu hình với

import inc_dec    # The code to test

def test_increment():
    assert inc_dec.increment(3) == 4

# This test is designed to fail for demonstration purposes.
def test_decrement():
    assert inc_dec.decrement(3) == 4
0, thì định nghĩa đầu tiên sẽ được sử dụng vì chúng tôi hiện không hỗ trợ nhiều định nghĩa cho loại yêu cầu này

Lệnh kiểm tra

Dưới đây là tất cả các lệnh được hỗ trợ để thử nghiệm với phần mở rộng Python trong VS Code. Tất cả đều được tìm thấy thông qua Bảng lệnh

Tên lệnh Mô tảPython. Cấu hình kiểm traĐịnh cấu hình khung kiểm tra sẽ được sử dụng với tiện ích mở rộng Python. Bài kiểm tra. Xóa tất cả kết quảXóa tất cả trạng thái kiểm tra vì giao diện người dùng vẫn duy trì kết quả kiểm tra qua các phiên. Bài kiểm tra. Gỡ lỗi các bài kiểm tra không thành côngGỡ lỗi các bài kiểm tra không thành công trong lần chạy thử nghiệm gần đây nhất. Bài kiểm tra. Gỡ lỗi Lần chạy cuối cùngCác bài kiểm tra gỡ lỗi đã được thực hiện trong lần chạy thử gần đây nhất. Bài kiểm tra. Kiểm tra Gỡ lỗi tại Con trỏ Gỡ lỗi phương pháp kiểm tra mà con trỏ của bạn tập trung vào trình chỉnh sửa. Tương tự với Python. Phương pháp kiểm tra gỡ lỗi. trên các phiên bản trước năm 2021. 9. Bài kiểm tra. Kiểm tra gỡ lỗi trong tệp hiện tại Kiểm tra gỡ lỗi trong tệp hiện đang tập trung vào trình chỉnh sửa. Bài kiểm tra. Chuyển đến phần Kiểm tra thất bại tiếp theoNếu chế độ xem nhanh lỗi đang mở, hãy mở và di chuyển đến chế độ xem nhanh của lần kiểm tra tiếp theo trong trình khám phá không thành công. Bài kiểm tra. Đi tới Lỗi kiểm tra trước đó Nếu chế độ xem nhanh lỗi đang mở, hãy mở và di chuyển đến chế độ xem nhanh của kiểm tra trước đó trong trình khám phá đã thất bại. Bài kiểm tra. Đầu ra PeekMở chế độ xem lỗi cho một phương pháp kiểm tra không thành công. Bài kiểm tra. Làm mới TestsThực hiện khám phá kiểm tra và cập nhật Test Explorer để phản ánh mọi thay đổi, bổ sung hoặc xóa kiểm tra. Tương tự với Python. Khám phá các Thử nghiệm trên các phiên bản trước năm 2021. 9. Bài kiểm tra. Chạy lại các bài kiểm tra thất bạiChạy các bài kiểm tra không thành công trong lần chạy thử nghiệm gần đây nhất. Tương tự với Python. Chạy Thử nghiệm không thành công trên các phiên bản trước năm 2021. 9. Bài kiểm tra. Chạy lại các bài kiểm tra RunDebug cuối cùng đã được thực hiện trong lần chạy thử nghiệm gần đây nhất. Bài kiểm tra. Chạy tất cả các bài kiểm tra Chạy tất cả các bài kiểm tra đã phát hiện. Tương đương với Python. Chạy tất cả các thử nghiệm trên các phiên bản trước năm 2021. 9. Bài kiểm tra. Chạy thử nghiệm tại con trỏChạy phương pháp thử nghiệm mà con trỏ của bạn tập trung vào trình chỉnh sửa. Tương tự với Python. Chạy phương pháp thử nghiệm. trên các phiên bản trước năm 2021. 9. Bài kiểm tra. Chạy thử nghiệm trong tệp hiện tạiChạy thử nghiệm trong tệp hiện đang tập trung vào trình chỉnh sửa. Tương đương với Python. Chạy tệp thử nghiệm hiện tại trên các phiên bản trước năm 2021. 9. Bài kiểm tra. Hiển thị đầu raMở đầu ra với thông tin chi tiết về tất cả các lần chạy thử. Tương tự với Python. Hiển thị Kết quả thử nghiệm trên các phiên bản trước năm 2021. 9. thử nghiệm. Tập trung vào Chế độ xem Test ExplorerMở chế độ xem Test Explorer. Tương tự với Thử nghiệm. Tập trung vào Chế độ xem Python trên các phiên bản trước năm 2021. 9. Bài kiểm tra. Dừng làm mới bài kiểm traHủy khám phá bài kiểm tra

Cài đặt cấu hình thử nghiệm

Hành vi thử nghiệm với Python được điều khiển bởi các cài đặt giao diện người dùng chung do Mã VS cung cấp và các cài đặt dành riêng cho Python và cho bất kỳ khung nào bạn đã bật

Cài đặt giao diện người dùng chung

Các cài đặt ảnh hưởng đến giao diện người dùng của các tính năng thử nghiệm do chính Mã VS cung cấp và có thể tìm thấy trong trình chỉnh sửa Cài đặt mã VS khi bạn tìm kiếm "Thử nghiệm"

Cài đặt Python chung

Cài đặt
(trăn. thử nghiệm. )DefaultDescriptionautoTestDiscoverOnSaveEnabled
# Import the code to be tested
import validator

# Import the test framework (this is a hypothetical module)
import test_framework

# This is a generalized example, not specific to a test framework
class Test_TestAccountValidator(test_framework.TestBaseClass):
    def test_validator_valid_string():
        # The exact assertion call depends on the framework as well
        assert(validate_account_number_format("1234567890"), True)

    # ...

    def test_validator_blank_string():
        # The exact assertion call depends on the framework as well
        assert(validate_account_number_format(""), False)

    # ...

    def test_validator_sql_injection():
        # The exact assertion call depends on the framework as well
        assert(validate_account_number_format("drop database master"), False)

    # .. tests for all other cases
9Chỉ định bật hay tắt tự động chạy kiểm tra khám phá khi lưu tệp kiểm tra. Bạn có thể cần tải lại cửa sổ sau khi thay đổi cài đặt này để áp dụng. cwdnullChỉ định một thư mục làm việc tùy chọn cho các bài kiểm tra. debugPort
import inc_dec    # The code to test

def test_increment():
    assert inc_dec.increment(3) == 4

# This test is designed to fail for demonstration purposes.
def test_decrement():
    assert inc_dec.decrement(3) == 4
7Số cổng được sử dụng để gỡ lỗi các bài kiểm tra nhỏ nhất. promptToConfigure
# Import the code to be tested
import validator

# Import the test framework (this is a hypothetical module)
import test_framework

# This is a generalized example, not specific to a test framework
class Test_TestAccountValidator(test_framework.TestBaseClass):
    def test_validator_valid_string():
        # The exact assertion call depends on the framework as well
        assert(validate_account_number_format("1234567890"), True)

    # ...

    def test_validator_blank_string():
        # The exact assertion call depends on the framework as well
        assert(validate_account_number_format(""), False)

    # ...

    def test_validator_sql_injection():
        # The exact assertion call depends on the framework as well
        assert(validate_account_number_format("drop database master"), False)

    # .. tests for all other cases
9Chỉ định xem Mã VS có nhắc cấu hình khung thử nghiệm hay không nếu phát hiện ra các thử nghiệm tiềm năng

cài đặt cấu hình unittest

Cài đặt
(trăn. thử nghiệm. )DefaultDescriptionunittestEnabled_______3_______0Chỉ định xem có bật unittest làm khung thử nghiệm hay không. Cài đặt tương đương cho pytest nên bị tắt. unittestArgs
py -3 -m pip install pytest-xdist
0Các đối số để chuyển đến unittest, trong đó mỗi phần tử được phân tách bằng dấu cách là một mục riêng biệt trong danh sách. Xem bên dưới để biết mô tả về các giá trị mặc định

Các đối số mặc định cho unittest như sau

  • py -3 -m pip install pytest-xdist
    
    1 đặt độ dài mặc định. Xóa đối số này để có đầu ra đơn giản hơn
  • py -3 -m pip install pytest-xdist
    
    2 chỉ định thư mục bắt đầu để khám phá các bài kiểm tra. Nếu bạn có các bài kiểm tra trong thư mục "kiểm tra", hãy thay đổi đối số thành
    py -3 -m pip install pytest-xdist
    
    3 (có nghĩa là
    py -3 -m pip install pytest-xdist
    
    4 trong mảng đối số)
  • py -3 -m pip install pytest-xdist
    
    5 là mẫu khám phá được sử dụng để tìm kiếm các bài kiểm tra. Trong trường hợp này, đó là bất kỳ tệp
    def increment(x):
        return x + 1
    
    def decrement(x):
        return x - 1
    
    3 nào có chứa từ "kiểm tra". Nếu bạn đặt tên tệp thử nghiệm theo cách khác, chẳng hạn như thêm "_test" vào mọi tên tệp, thì hãy sử dụng mẫu như
    py -3 -m pip install pytest-xdist
    
    7 trong đối số thích hợp của mảng

Để dừng chạy thử ở lần lỗi đầu tiên, hãy thêm tùy chọn fail fast

py -3 -m pip install pytest-xdist
8 vào mảng đối số

Xem đầy đủ các tùy chọn có sẵn

cài đặt cấu hình pytest

Cài đặt
(trăn. thử nghiệm. )DefaultDescriptionpytestEnabled
def increment(x):
    return x + 1

def decrement(x):
    return x - 1
0Chỉ định liệu pytest có được bật làm khung thử nghiệm hay không. Cài đặt tương đương cho unittest nên bị tắt. pytestPath
python3 -m pip install pytest-xdist
0Đường dẫn tới pytest. Sử dụng đường dẫn đầy đủ nếu pytest nằm ngoài môi trường hiện tại. pytestArgs
python3 -m pip install pytest-xdist
1Các đối số để chuyển đến pytest, trong đó mỗi phần tử được phân tách bằng dấu cách là một mục riêng biệt trong danh sách. Nhìn thấy

Bạn cũng có thể định cấu hình pytest bằng tệp

import inc_dec    # The code to test
import unittest   # The test framework

class Test_TestIncrementDecrement(unittest.TestCase):
    def test_increment(self):
        self.assertEqual(inc_dec.increment(3), 4)

    # This test is designed to fail for demonstration purposes.
    def test_decrement(self):
        self.assertEqual(inc_dec.decrement(3), 4)

if __name__ == '__main__':
    unittest.main()
2 như được mô tả trên Cấu hình pytest

Lưu ý Nếu bạn đã cài đặt mô-đun bảo hiểm pytest-cov, Mã VS không dừng tại các điểm dừng trong khi gỡ lỗi vì pytest-cov đang sử dụng cùng một kỹ thuật để truy cập mã nguồn đang được chạy. Để ngăn chặn hành vi này, hãy bao gồm

python3 -m pip install pytest-xdist
3 trong
python3 -m pip install pytest-xdist
4 khi kiểm tra gỡ lỗi, ví dụ bằng cách thêm
python3 -m pip install pytest-xdist
5 vào cấu hình gỡ lỗi của bạn. (Xem bên trên về cách thiết lập cấu hình khởi chạy đó. ) (Để biết thêm thông tin, hãy xem Trình gỡ lỗi và PyCharm trong tài liệu pytest-cov. )

Thử nghiệm và các loại thử nghiệm trong Python là gì?

Có bốn loại thử nghiệm khác nhau, mỗi loại tùy thuộc vào mức độ chi tiết của mã được thử nghiệm, cũng như mục tiêu của thử nghiệm. .
Bài kiểm tra đơn vị. Điều này kiểm tra các phương pháp và logic cụ thể trong mã. .
Kiểm tra tính năng. Điều này kiểm tra chức năng của thành phần. .
Kiểm tra tích hợp. .
Kiểm tra hiệu năng

Mục đích của thử nghiệm trong Python là gì?

Mục tiêu của thử nghiệm đơn vị python là để phát hiện càng nhiều lỗi và sự không nhất quán trong giai đoạn phát triển ứng dụng sơ khai càng tốt . Điều này đạt được bằng cách thiết kế và viết kịch bản các bài kiểm tra đơn vị chất lượng và chính xác cũng có thể đóng vai trò là tài liệu chi tiết cho quy trình phát triển.

Các bài kiểm tra trong mã hóa là gì?

Kiểm tra dựa trên mã bao gồm kiểm tra từng dòng mã của chương trình để xác định lỗi hoặc sai sót trong quá trình phát triển phần mềm . Các trường hợp kiểm tra cụ thể được kiểm tra trên chương trình để xem nó có thực hiện các chức năng được yêu cầu không. Hơn nữa, kiểm thử dựa trên mã có thể được chia thành kiểm thử cấu trúc và kiểm thử tĩnh.