Ví dụ thử nghiệm đơn vị mô phỏng Python

Thư viện unittest của Python giúp bạn kiểm tra mã ứng dụng của mình để tìm lỗi theo cách tự động. Đó là một trong những phương pháp thử nghiệm được thảo luận trong hướng dẫn của chúng tôi, Tổng quan về Khung kiểm tra Python để kiểm tra đơn vị. Thử nghiệm mô phỏng đặc biệt hữu ích khi mã của bạn chưa được hoàn thành và quá trình phát triển của bạn đang tiến triển. Nó thực hiện kiểm tra liên tục trong quá trình phát triển và cung cấp thông tin chi tiết tốt về cách ứng dụng cuối cùng có thể hoạt động. Hướng dẫn này chỉ cho bạn cách sử dụng thư viện unittest của Python để tạo các đối tượng giả để kiểm tra mã của bạn

Mục đích của các đối tượng giả trong thử nghiệm đơn vị là gì?

Thử nghiệm ứng dụng và đơn vị kiểm tra cách mã của bạn hoạt động trong các tình huống khác nhau. Các nhà phát triển sử dụng một số phương pháp để thực hiện thử nghiệm, nhưng ba phương pháp phổ biến nhất được giải thích bên dưới

  • Chế giễu. Phương pháp này hữu ích khi Hệ thống đang thử nghiệm [SUT] cung cấp đủ chức năng để bạn có thể đặt các giá trị và theo dõi các phương thức được gọi trong mã của mình. Với Mocking, kết quả được tạo bằng cách sử dụng phương tiện ngắn nhất có thể. Mô hình giả có thể được kết hợp chặt chẽ hoặc lỏng lẻo với dữ liệu được mã của bạn sử dụng. Có thể thực hiện các xác nhận đối với giả. Mocks thường được sử dụng để hiểu hành vi của một ứng dụng khi nó hình thành. Nó cũng cung cấp một mức độ giám sát mà sơ khai và giả mạo không thể cung cấp. Chi phí chính của chế nhạo là sự phức tạp thêm vào

  • còn sơ khai. Phương pháp này hiệu quả nhất khi bạn muốn kiểm tra một tính năng cụ thể và SUT có thể cung cấp phản hồi cho các truy vấn. Dữ liệu được mã hóa cứng như một phần của sơ khai, vì vậy dữ liệu được liên kết chặt chẽ. Kết quả bắt chước những gì ứng dụng dự kiến ​​sẽ thực hiện trong giới hạn và có thể cung cấp một số kiểm soát thông qua các giá trị đầu vào. Sơ khai thường được sử dụng để kiểm tra khả năng sử dụng đơn vị hoặc ứng dụng tổng thể để đảm bảo rằng các vấn đề như kết nối được giải quyết. Nhiều nhà phát triển sử dụng sơ khai để kiểm tra các đường gọi phương thức thông qua một ứng dụng hoặc đơn vị

  • hàng giả. Giả mạo là một lựa chọn tốt để kiểm tra ứng dụng khi SUT cung cấp phản hồi soạn trước cho các truy vấn có thể khớp hoặc không khớp với những gì ứng dụng cuối cùng đưa ra. Đầu ra là cố định, do đó không thể kiểm tra bất kỳ loại hành vi logic hoặc đơn vị nào. Hàng giả cho phép kiểm tra chức năng đơn vị tổng thể. Fakes cũng cung cấp một phương pháp để trừu tượng hóa bất kỳ chức năng nào chưa được phát triển hoặc có thể không truy cập được từ môi trường thử nghiệm. Ví dụ: thay vì kết nối với cơ sở dữ liệu trên máy chủ, giả mạo có thể phụ thuộc vào cơ sở dữ liệu trong bộ nhớ thay thế

Hầu hết các nhà phát triển sử dụng các khung chuyên dụng, chẳng hạn như thư viện unittest của Python, để tạo các bản mô phỏng và sơ khai. Hàng giả thường được mã hóa mà không cần sự trợ giúp của thư viện hoặc khung

Trong thử nghiệm giả, unittest dựa trên một đối tượng giả. Đối tượng mô phỏng này được thiết kế để chấp nhận cùng loại tham số đầu vào như đối tượng mà nó đang kiểm tra. Nó cũng phải có cùng kiểu trả về với đối tượng mà nó đang thử nghiệm. Bản vá giả Python là một khai báo đại diện cho chức năng thực cho đến khi chức năng thực khả dụng. Một bản vá được viết dưới dạng trang trí chức năng. Khi chức năng khả dụng, bản vá được hoàn tác. Mocks được sử dụng trong các trường hợp sau

  • Khi ứng dụng bạn đang thử nghiệm chưa có quyền truy cập vào máy chủ API, ứng dụng đó sẽ kết nối với

  • Cần cung cấp hành vi có thể dự đoán được mà không thể tính được khi làm việc với các dịch vụ của bên thứ ba

  • Bạn cần một môi trường được kiểm soát để có thể mô phỏng nhiều loại mất điện, hành vi không thể đoán trước và lỗi

  • Ứng dụng yêu cầu truy cập dữ liệu, nhưng không thể truy cập dữ liệu thực trên máy chủ khác. Có lẽ, nó chỉ có quyền truy cập vào một máy chủ thử nghiệm với dữ liệu hạn chế

  • Có nhu cầu hỗ trợ microservice hiện không tồn tại

  • Ứng dụng cuối cùng sẽ tương tác với các dịch vụ của bên thứ ba, nhưng quyền truy cập hiện không khả dụng

  • Tài nguyên cần thiết cho đơn vị hoặc ứng dụng hiện không có sẵn

  • Đơn vị hoặc ứng dụng cần xuất dữ liệu và nhận phản hồi thực tế cho mục đích thử nghiệm

  • Bạn cần thực hiện kiểm tra mã hiếm khi được sử dụng trong môi trường sản xuất. Chức năng của mã có bản chất đặc biệt hoặc chỉ đơn giản là bao gồm các trường hợp ngẫu nhiên có xác suất xảy ra thấp

Thư viện đối tượng Mock Object đơn giản nhất của Python

Thư viện đối tượng giả định unittest của Python cho phép bạn kiểm tra các khu vực trong ứng dụng của mình bằng các đối tượng giả định và bằng các xác nhận. Một lợi thế lớn khi sử dụng các đối tượng giả là mã thử nghiệm được đặt ở một vị trí trung tâm. Các kỹ thuật kiểm tra khác, chẳng hạn như sơ khai, yêu cầu bạn thêm sơ khai trong toàn bộ mã, điều này có thể khiến việc duy trì kiểm tra của bạn trở nên khó khăn hơn

Tạo đối tượng giả mới

Làm việc với một mô hình khác với làm việc với các đối tượng tiêu chuẩn. Mô hình có thể thực hiện các xác nhận và tạo kết quả nhất quán bằng cách đặt các phương thức đối tượng thành một giá trị cụ thể. Các đối tượng giả cũng có thể tìm kiếm các tác dụng phụ do thực hiện các cuộc gọi cụ thể. Tuy nhiên, một bản giả không phải là mã thực. Một đối tượng giả hoạt động giống như một đối tượng “thực”, nhưng không làm thay đổi mã của bạn. Các bước sau đây đi qua một số khái niệm cơ bản về đối tượng mô phỏng để minh họa những gì mô hình có thể thực hiện

Ghi chú

Bạn có thể chạy các bước trong các phần sau bằng trình thông dịch Python của máy tính. Để truy cập trình thông dịch Python, hãy đưa ra lệnh sau

python3

Bạn sẽ thấy lời nhắc của trình thông dịch 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. Khởi tạo một đối tượng giả mới và xác minh rằng Python trả về mã định danh duy nhất của đối tượng

     from unittest.mock import Mock
     myMock = Mock[]
     print[myMock]
    

    Bạn thấy một đầu ra cung cấp ID giả, chẳng hạn như

     from unittest.mock import Mock
     myMock = Mock[]
     print[myMock]
    
    9. Bạn có thể sử dụng một mô hình giống như bất kỳ đối tượng nào khác thuộc một loại cụ thể. Ví dụ: bạn có thể giả định một lớp có phương thức
     myMock.setResult[1, 2]
     print[myMock.getResult[]]
    
    0 và phương thức
     myMock.setResult[1, 2]
     print[myMock.getResult[]]
    
    1

  2. Kiểm tra việc sử dụng mô phỏng để thực hiện các cuộc gọi phương thức bằng đoạn mã sau

     myMock.setResult[1, 2]
     print[myMock.getResult[]]
    

    Kết quả của cuộc gọi tới

     myMock.setResult[1, 2]
     print[myMock.getResult[]]
    
    2 cho thấy rằng bạn vẫn đang làm việc với một bản mô phỏng.
     from unittest.mock import Mock
     myMock = Mock[]
     print[myMock]
    
    9. Đầu ra này chứa văn bản của cuộc gọi. Bản mô phỏng theo dõi cách bạn làm việc với các lệnh gọi phương thức khác nhau mặc dù không có mã lệnh gọi phương thức nào. Bạn có thể sử dụng hành vi này để tạo lợi thế cho mình bằng cách đưa ra các xác nhận

  3. Để đưa ra khẳng định đối với phương thức

     myMock.setResult[1, 2]
     print[myMock.getResult[]]
    
    1, hãy sử dụng đoạn mã sau

    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

    Trong trường hợp này, không có đầu ra vì

     myMock.setResult[1, 2]
     print[myMock.getResult[]]
    
    1 đã được gọi bằng cách sử dụng
     myMock.setResult[1, 2]
     print[myMock.getResult[]]
    
    6 ở bước trước. Nếu mã không được gọi là
     myMock.setResult[1, 2]
     print[myMock.getResult[]]
    
    1, thì bạn sẽ thấy một
     myMock.setResult[1, 2]
     print[myMock.getResult[]]
    
    8

  4. Tạo điều kiện

     myMock.setResult[1, 2]
     print[myMock.getResult[]]
    
    8 bằng mã sau

    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

    Tùy thuộc vào cách bạn thiết lập hệ thống của mình, bạn có thể thấy các chi tiết khác nhau cho

     myMock.setResult[1, 2]
     print[myMock.getResult[]]
    
    8. Đầu ra bên dưới hiển thị
     myMock.setResult[1, 2]
     print[myMock.getResult[]]
    
    8 cơ bản mà bạn có thể mong đợi

    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
  5. Mô hình cũng có thể kiểm tra các cuộc gọi với các giá trị cụ thể. Ví dụ:

     myMock.setResult[1, 2]
     print[myMock.getResult[]]
    
    0 có thể yêu cầu hai đầu vào có giá trị cụ thể. Sử dụng mã bên dưới để xem kết quả kiểm tra thành công

     from unittest.mock import Mock
     myMock = Mock[]
     print[myMock]
    
    1

    Mã này thành công vì

     myMock.setResult[1, 2]
     print[myMock.getResult[]]
    
    0 đã được gọi với các giá trị đầu vào là
    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.
    >>>
    04 và
    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.
    >>>
    05 [theo thứ tự đó]. Thứ tự là quan trọng. Thay vào đó, nếu bạn sử dụng
    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.
    >>>
    06, đầu ra sẽ tăng một
     myMock.setResult[1, 2]
     print[myMock.getResult[]]
    
    8 tương tự như sau

     from unittest.mock import Mock
     myMock = Mock[]
     print[myMock]
    
    7

    Bạn có thể kiểm tra đầu vào rất cụ thể để đảm bảo mã của bạn đang làm chính xác những gì nó nên làm. Ngoài ra còn có một cuộc gọi để xác minh rằng

     myMock.setResult[1, 2]
     print[myMock.getResult[]]
    
    0 chỉ được gọi một lần với các giá trị cụ thể mà bạn cung cấp bằng cách sử dụng
    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.
    >>>
    09. Đối tượng
    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.
    >>>
    60 đi kèm với nhiều bài kiểm tra xác nhận mà bạn có thể thực hiện

  6. Bạn có thể cần định cấu hình mô hình để trả về một giá trị cụ thể. Trong trường hợp này, bạn mong đợi rằng

    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.
    >>>
    61 sẽ cung cấp giá trị trả về của
     myMock.setResult[1, 2]
     print[myMock.getResult[]]
    
    1 là
    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.
    >>>
    63, nhưng hiện tại nó không làm như vậy. Sử dụng đoạn mã sau để cung cấp giá trị đầu ra cần thiết

     from unittest.mock import Mock
     myMock = Mock[]
     print[myMock]
    
    4

    Khi bạn chạy mã, có giá trị đầu ra là

    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.
    >>>
    63. Nếu bạn thay đổi giá trị đầu vào bằng cách sử dụng
     myMock.setResult[1, 2]
     print[myMock.getResult[]]
    
    0, thì đầu ra
     myMock.setResult[1, 2]
     print[myMock.getResult[]]
    
    1 không thay đổi. Loại nhất quán này không hữu ích trong ứng dụng sản xuất. Tuy nhiên, nó khá hữu ích trong quá trình thử nghiệm vì bạn có thể chắc chắn rằng
     myMock.setResult[1, 2]
     print[myMock.getResult[]]
    
    1 luôn trả về
    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.
    >>>
    63 cho đến khi bạn chọn thay đổi nó

Sử dụng số liệu thống kê giả

Khi một ứng dụng quá phức tạp để thực hiện phân tích từng bước cho mọi cuộc gọi giả, hãy sử dụng số liệu thống kê giả để xác định tình trạng của ứng dụng. Các bước trong phần này cho bạn biết cách hoạt động của số liệu thống kê đối tượng mô phỏng. Phần này dựa trên đối tượng

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.
>>>
69 mà bạn đã tạo trong phần Khởi tạo đối tượng mô phỏng mới

Một trong những số liệu thống kê hữu ích nhất là số lần một mô phỏng cụ thể được gọi. Nếu bạn mong đợi năm lời gọi đến một hàm hoặc đối tượng và chỉ nhận được bốn lời gọi thì có vấn đề. Sử dụng mã bên dưới để xem cách hoạt động của thuộc tính

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.
>>>
90

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

Đôi khi bạn cần biết một phương thức được gọi như thế nào. Ví dụ, với

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.
>>>
91, bạn không chỉ cần biết tần suất nó được gọi mà còn với những đối số nào. Bạn có hai lựa chọn. chỉ yêu cầu thông tin cuộc gọi mới nhất bằng cách sử dụng
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.
>>>
92 hoặc yêu cầu tất cả thông tin cuộc gọi bằng cách sử dụng
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.
>>>
93. Bạn có thể sử dụng cả hai như hình dưới đây

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

Để tìm hiểu cách thức mô phỏng được gọi và thứ tự các cuộc gọi đến, thuộc tính

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.
>>>
94 giúp bạn có được thông tin này

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

Đầu ra từ cuộc gọi này hiển thị một danh sách các cuộc gọi phương thức theo thứ tự mà chúng xuất hiện tương tự như sau

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

Đối tượng MagicMock

Đối tượng

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.
>>>
95 là tập con của đối tượng
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.
>>>
96. Nó cung cấp các giá trị hợp lý, chẳng hạn như giá trị trả về cho các lệnh gọi phương thức phổ biến thường xuất hiện trong Python. Dưới đây là các cuộc gọi phương thức và kết quả mặc định của chúng

  • 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.
    >>>
    97.
    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.
    >>>
    98
  • 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.
    >>>
    99.
    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.
    >>>
    98
  •  from unittest.mock import Mock
     myMock = Mock[]
     print[myMock]
    
    11.
    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.
    >>>
    98
  •  from unittest.mock import Mock
     myMock = Mock[]
     print[myMock]
    
    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.
    >>>
    98
  •  from unittest.mock import Mock
     myMock = Mock[]
     print[myMock]
    
    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.
    >>>
    04
  •  from unittest.mock import Mock
     myMock = Mock[]
     print[myMock]
    
    17.
     from unittest.mock import Mock
     myMock = Mock[]
     print[myMock]
    
    18
  •  from unittest.mock import Mock
     myMock = Mock[]
     print[myMock]
    
    19.
     from unittest.mock import Mock
     myMock = Mock[]
     print[myMock]
    
    70
  •  from unittest.mock import Mock
     myMock = Mock[]
     print[myMock]
    
    71.
     from unittest.mock import Mock
     myMock = Mock[]
     print[myMock]
    
    72
  •  from unittest.mock import Mock
     myMock = Mock[]
     print[myMock]
    
    73.
     from unittest.mock import Mock
     myMock = Mock[]
     print[myMock]
    
    18
  •  from unittest.mock import Mock
     myMock = Mock[]
     print[myMock]
    
    75.
     from unittest.mock import Mock
     myMock = Mock[]
     print[myMock]
    
    18
  •  from unittest.mock import Mock
     myMock = Mock[]
     print[myMock]
    
    77.
     from unittest.mock import Mock
     myMock = Mock[]
     print[myMock]
    
    78
  •  from unittest.mock import Mock
     myMock = Mock[]
     print[myMock]
    
    79.
     from unittest.mock import Mock
     myMock = Mock[]
     print[myMock]
    
    40
  •  from unittest.mock import Mock
     myMock = Mock[]
     print[myMock]
    
    41.
     from unittest.mock import Mock
     myMock = Mock[]
     print[myMock]
    
    42
  •  from unittest.mock import Mock
     myMock = Mock[]
     print[myMock]
    
    43.
    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.
    >>>
    04
  •  from unittest.mock import Mock
     myMock = Mock[]
     print[myMock]
    
    45. hàm băm mặc định cho giả
  •  from unittest.mock import Mock
     myMock = Mock[]
     print[myMock]
    
    46. chuỗi mặc định cho giả
  •  from unittest.mock import Mock
     myMock = Mock[]
     print[myMock]
    
    47. mặc định
     from unittest.mock import Mock
     myMock = Mock[]
     print[myMock]
    
    48 cho giả

Sử dụng

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.
>>>
95 yêu cầu thiết lập bổ sung, nhưng nó giúp bạn tiết kiệm khá nhiều thời gian. Các bước dưới đây cho bạn thấy cách sử dụng cơ bản của đối tượng
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.
>>>
95

  1. Trước khi bạn có thể làm bất cứ điều gì, bạn cần khởi tạo một đối tượng

    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.
    >>>
    95 mới, như hình bên dưới

    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. Đối tượng

    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.
    >>>
    95,
    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 có các giá trị đặt trước cụ thể. Sử dụng mã bên dưới để xem các giá trị từ danh sách được tạo bởi đối tượng
    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.
    >>>
    95

    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

    Khi bạn chạy mã này, bạn sẽ thấy các giá trị đầu ra sau

    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. Một

    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.
    >>>
    95 sẽ không hữu ích nếu bạn không thể thay đổi các giá trị mà nó xuất ra để đáp ứng các nhu cầu cụ thể. Chạy mã bên dưới để gán và xem các giá trị trả về tùy chỉnh cho đối tượng
    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 của bạn

    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

    Đầu ra hiển thị một điểm kỳ lạ trong cài đặt giá trị, giá trị

     from unittest.mock import Mock
     myMock = Mock[]
     print[myMock]
    
    47 luôn nhiều hơn giá trị bạn đặt
    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. Điều này có nghĩa là bạn phải bù vào mã thử nghiệm của mình

    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. Có hai cách để thiết lập

     from unittest.mock import Mock
     myMock = Mock[]
     print[myMock]
    
    71. Ban đầu,
     from unittest.mock import Mock
     myMock = Mock[]
     print[myMock]
    
    71 trả về một danh sách trống mặc dù bạn có thể đặt nó như bất kỳ giá trị nào khác. Cách bạn định cấu hình
     from unittest.mock import Mock
     myMock = Mock[]
     print[myMock]
    
    71 tạo ra sự khác biệt như được hiển thị trong mã bên dưới

    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

    Trường hợp đầu tiên sử dụng danh sách tiêu chuẩn, danh sách này vẫn còn nguyên sau mỗi cuộc gọi. Thay vào đó, khi bạn sử dụng

    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, dữ liệu sẽ được sử dụng sau lần sử dụng đầu tiên như thể hiện trong kết quả

     from unittest.mock import Mock
     myMock = Mock[]
     print[myMock]
    
    0

    MagicMock cũng hỗ trợ các thuộc tính trong danh sách bên dưới. Tuy nhiên, MagicMock không định cấu hình các thuộc tính này với các giá trị mặc định

  • 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

Trình trang trí bản vá [] của Thư viện Mock Python

Bản vá mô phỏng Python cung cấp sự thay thế cho một đối tượng thực. Điều này cho phép bạn kiểm soát phạm vi trong đó đối tượng thực được mô phỏng. Khi đối tượng thực tồn tại trong phạm vi được yêu cầu, bản vá không còn cung cấp vật thay thế nữa và quá trình dọn dẹp sẽ tự động. Có hai hình thức của phương pháp

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. trang trí và quản lý bối cảnh

Cả hai đều hoàn thành cùng một việc; . Phần này cung cấp một phương pháp làm việc với biểu mẫu trang trí của

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. Các bước sau đây cho bạn thấy cách sử dụng cơ bản của
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. Ví dụ dưới đây nêu bật cách sử dụng cơ bản của một bản vá khi thử nghiệm

  1. Điều đầu tiên bạn cần là một đối tượng để vá. Tạo một tệp có tên

    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 và thêm đoạn mã sau

    Tập tin. Một lớp học. py

     from unittest.mock import Mock
     myMock = Mock[]
     print[myMock]
    
    1
     from unittest.mock import Mock
     myMock = Mock[]
     print[myMock]
    
    2

  2. Bây giờ bạn cần một số mã sử dụng

    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. Tạo một tệp khác có tên
    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 và thêm đoạn mã sau

    Tập tin. Sử dụngMyClass. py

     from unittest.mock import Mock
     myMock = Mock[]
     print[myMock]
    
    3____24

    Cuộc gọi đến

    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 ở dòng cuối cùng được chú thích, vì vậy bạn có thể thấy rằng phương thức
    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 thực sự truy cập vào
    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. Để chạy mã trong tệp, từ dòng lệnh, hãy sử dụng lệnh sau

     from unittest.mock import Mock
     myMock = Mock[]
     print[myMock]
    
    5
  3. Tạo một tệp thứ ba có tên là

    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 với mã kiểm tra như hình bên dưới

    Tập tin. Kiểm traSử dụngMyClass. py

     from unittest.mock import Mock
     myMock = Mock[]
     print[myMock]
    
    6
     from unittest.mock import Mock
     myMock = Mock[]
     print[myMock]
    
    7

Bạn cần nhập chức năng

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 để thực hiện kiểm tra. Gói
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 cung cấp khả năng sử dụng trình trang trí
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 và
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.
>>>
95 làm đối tượng thay thế. Bạn cũng cần truy cập vào tệp đang được kiểm tra [không phải tệp lớp, mà là tệp đang thực sự sử dụng đối tượng]. Để sử dụng
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, bạn cần chỉ định những điều sau

  • tên của tệp,
    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
  • tên của lớp học, ____145
  • tên của phương thức,
    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

Điều quan trọng là chuyển thông tin này dưới dạng một chuỗi để thông báo lỗi của bạn chứa thông tin có thể giúp bạn xác định nguồn gốc của lỗi

Để sử dụng một mô phỏng [trong trường hợp này là ___147], hãy cung cấp một tham số cho nó như một phần của lệnh gọi phương thức thử nghiệm. Ví dụ này thực sự chứng minh rằng bạn đang sử dụng

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.
>>>
95 để thay thế cho
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 bằng cách đưa ra nhiều xác nhận khác nhau. Vì vậy, cho đến khi bạn thực sự gọi
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, thì
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 vẫn chưa được gọi để thay thế nó. Khi bạn gọi
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 trong mã, bạn có thể bắt đầu sử dụng các tính năng khác nhau của
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.
>>>
95 để xác định chức năng mô phỏng đã thực hiện như thế nào

Mã này cung cấp hai câu lệnh in để đảm bảo rằng mã đã chạy như mong đợi. Chạy thành công không xuất bất kỳ thông tin nào ngoại trừ thông báo thành công. Thông báo thành công có thể không chứa nhiều thông tin mà bạn có thể cần để gỡ lỗi. Hai dòng mã cuối cùng trong tệp

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 bắt đầu quá trình thử nghiệm. Có một số phương pháp để bắt đầu một bài kiểm tra. Một phương pháp như vậy được hiển thị dưới đây

Tại dòng lệnh gõ

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 và nhấn Enter. Đầu ra thử nghiệm được hiển thị dưới đây

 from unittest.mock import Mock
 myMock = Mock[]
 print[myMock]
8

Phần kết luận

Mocking giúp bạn có thể kiểm tra ứng dụng của mình khi bạn phát triển nó, giúp giảm nợ kỹ thuật và chi phí phát triển. Mặc dù sơ khai và giả mạo có vị trí của chúng trong bộ công cụ kiểm tra của bạn, nhưng chế nhạo linh hoạt hơn đáng kể so với các phương pháp khác. Mocking có thể giảm đáng kể thời gian dọn dẹp cho bộ thử nghiệm của bạn sau này. Sử dụng trình trang trí

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 trong một tệp riêng biệt, như đã trình bày trong phần trước, giúp loại bỏ nhu cầu dọn dẹp mã sau này. Điều này đặc biệt xảy ra khi làm việc với các ứng dụng phức tạp

Làm thế nào để giả lập bài kiểm tra đơn vị Python?

Làm cách nào để giả lập bằng Python? .
Viết bài kiểm tra như thể bạn đang sử dụng các API bên ngoài thực sự
Trong hàm đang thử nghiệm, hãy xác định lệnh gọi API nào cần được mô phỏng;
Trong chức năng kiểm tra, hãy vá các cuộc gọi API
Thiết lập phản hồi đối tượng MagicMock
Chạy thử nghiệm của bạn

Thử nghiệm đơn vị với ví dụ Python là gì?

Mô-đun unittest trong Python được sử dụng để kiểm tra một đơn vị mã nguồn. Giả sử, bạn cần kiểm tra dự án của mình. . Kết quả kiểm tra đơn vị Python & Chức năng cơ bản

Làm cách nào để mô phỏng chức năng trong Python?

lớp học nhạo báng . Điều này có nghĩa là bạn truy cập “phiên bản mô phỏng” bằng cách xem giá trị trả về của lớp mô phỏng. Trong ví dụ bên dưới, chúng ta có một hàm some_function khởi tạo Foo và gọi một phương thức trên đó. Cuộc gọi đến patch[] thay thế lớp Foo bằng một bản giả

Mô hình unittest hoạt động như thế nào?

đơn vị nhất. mock cung cấp một cơ chế mạnh mẽ để mô phỏng các đối tượng, được gọi là patch[], tìm kiếm một đối tượng trong một mô-đun nhất định và thay thế đối tượng đó bằng Mô phỏng . Thông thường, bạn sử dụng patch[] làm công cụ trang trí hoặc trình quản lý bối cảnh để cung cấp phạm vi mà bạn sẽ chế nhạo đối tượng đích.

Chủ Đề