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. >>>
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ư
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ứcfrom unittest.mock import Mock myMock = Mock[] print[myMock]
0 và phương thứcmyMock.setResult[1, 2] print[myMock.getResult[]]
1myMock.setResult[1, 2] print[myMock.getResult[]]
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
2 cho thấy rằng bạn vẫn đang làm việc với một bản mô phỏng.myMock.setResult[1, 2] print[myMock.getResult[]]
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ậnfrom unittest.mock import Mock myMock = Mock[] print[myMock]
Để đưa ra khẳng định đối với phương thức
1, hãy sử dụng đoạn mã saumyMock.setResult[1, 2] print[myMock.getResult[]]
0Python 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. >>>
Trong trường hợp này, không có đầu ra vì
1 đã được gọi bằng cách sử dụngmyMock.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ộtmyMock.setResult[1, 2] print[myMock.getResult[]]
8myMock.setResult[1, 2] print[myMock.getResult[]]
Tạo điều kiện
8 bằng mã saumyMock.setResult[1, 2] print[myMock.getResult[]]
6Python 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. >>>
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
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 đợimyMock.setResult[1, 2] print[myMock.getResult[]]
9Python 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. >>>
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ụ:
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ôngmyMock.setResult[1, 2] print[myMock.getResult[]]
1from unittest.mock import Mock myMock = Mock[] print[myMock]
Mã này thành công vì
0 đã được gọi với các giá trị đầu vào làmyMock.setResult[1, 2] print[myMock.getResult[]]
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ụngPython 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ộtPython 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 tương tự như saumyMock.setResult[1, 2] print[myMock.getResult[]]
7from unittest.mock import Mock myMock = Mock[] print[myMock]
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
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ụngmyMock.setResult[1, 2] print[myMock.getResult[]]
09. Đối tượngPython 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ệnPython 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. >>>
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
61 sẽ cung cấp giá trị trả về củaPython 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 làmyMock.setResult[1, 2] print[myMock.getResult[]]
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ếtPython 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. >>>
4from unittest.mock import Mock myMock = Mock[] print[myMock]
Khi bạn chạy mã, có giá trị đầu ra là
63. Nếu bạn thay đổi giá trị đầu vào bằng cách sử dụngPython 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, thì đầu ramyMock.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ằngmyMock.setResult[1, 2] print[myMock.getResult[]]
1 luôn trả vềmyMock.setResult[1, 2] print[myMock.getResult[]]
63 cho đến khi bạn chọn thay đổ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. >>>
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ớiMộ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.
>>>
90Python 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 đâyPython 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àyPython 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
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. >>>
98Python 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. >>>
98Python 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. >>>
11.from unittest.mock import Mock myMock = Mock[] print[myMock]
98Python 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.from unittest.mock import Mock myMock = Mock[] print[myMock]
98Python 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.from unittest.mock import Mock myMock = Mock[] print[myMock]
04Python 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.from unittest.mock import Mock myMock = Mock[] print[myMock]
18from unittest.mock import Mock myMock = Mock[] print[myMock]
19.from unittest.mock import Mock myMock = Mock[] print[myMock]
70from unittest.mock import Mock myMock = Mock[] print[myMock]
71.from unittest.mock import Mock myMock = Mock[] print[myMock]
72from unittest.mock import Mock myMock = Mock[] print[myMock]
73.from unittest.mock import Mock myMock = Mock[] print[myMock]
18from unittest.mock import Mock myMock = Mock[] print[myMock]
75.from unittest.mock import Mock myMock = Mock[] print[myMock]
18from unittest.mock import Mock myMock = Mock[] print[myMock]
77.from unittest.mock import Mock myMock = Mock[] print[myMock]
78from unittest.mock import Mock myMock = Mock[] print[myMock]
79.from unittest.mock import Mock myMock = Mock[] print[myMock]
40from unittest.mock import Mock myMock = Mock[] print[myMock]
41.from unittest.mock import Mock myMock = Mock[] print[myMock]
42from unittest.mock import Mock myMock = Mock[] print[myMock]
43.from unittest.mock import Mock myMock = Mock[] print[myMock]
04Python 3.8.10 [default, Sep 28 2021, 16:10:42] [GCC 9.3.0] on linux Type "help", "copyright", "credits" or "license" for more information. >>>
45. 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 địnhfrom unittest.mock import Mock myMock = Mock[] print[myMock]
48 cho giảfrom unittest.mock import Mock myMock = Mock[] print[myMock]
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.
>>>
95Trướ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
95 mới, như hình bên dướiPython 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. >>>
4Python 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. >>>
Đối tượng
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ượngPython 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. >>>
95Python 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. >>>
5Python 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. >>>
Khi bạn chạy mã này, bạn sẽ thấy các giá trị đầu ra sau
6Python 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. >>>
Một
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ượngPython 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ạnPython 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. >>>
7Python 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. >>>
Đầu ra hiển thị một điểm kỳ lạ trong cài đặt giá trị, giá trị
47 luôn nhiều hơn giá trị bạn đặtfrom unittest.mock import Mock myMock = Mock[] print[myMock]
08. Điều này có nghĩa là bạn phải bù vào mã thử nghiệm của mìnhPython 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. >>>
8Python 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. >>>
Có hai cách để thiết lập
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ìnhfrom 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ướifrom unittest.mock import Mock myMock = Mock[] print[myMock]
9Python 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. >>>
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
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ả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. >>>
0from unittest.mock import Mock myMock = Mock[] print[myMock]
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
13Python 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. >>>
14Python 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. >>>
15Python 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. >>>
16Python 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. >>>
17Python 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. >>>
18Python 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. >>>
19Python 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. >>>
20Python 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. >>>
21Python 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. >>>
22Python 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. >>>
23Python 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. >>>
24Python 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. >>>
25Python 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. >>>
26Python 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. >>>
27Python 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. >>>
28Python 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. >>>
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ảnhCả 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Đ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
32 và thêm đoạn mã sauTập tin. Một lớp học. pyPython 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. >>>
1from unittest.mock import Mock myMock = Mock[] print[myMock]
2from unittest.mock import Mock myMock = Mock[] print[myMock]
Bây giờ bạn cần một số mã sử dụng
33. Tạo một tệp khác có tênPython 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ã sauTập tin. Sử dụngMyClass. pyPython 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____24from unittest.mock import Mock myMock = Mock[] print[myMock]
Cuộc gọi đến
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ứcPython 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àoPython 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 sauPython 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. >>>
5from unittest.mock import Mock myMock = Mock[] print[myMock]
Tạo một tệp thứ ba có tên là
38 với mã kiểm tra như hình bên dướiTập tin. Kiểm traSử dụngMyClass. pyPython 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. >>>
6from unittest.mock import Mock myMock = Mock[] print[myMock]
7from unittest.mock import Mock myMock = Mock[] print[myMock]
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,
44Python 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. >>>
- tên của lớp học, ____145
- tên của phương thức,
46Python 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. >>>
Đ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àoMã 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 đâyTạ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]
8Phầ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