Hướng dẫn này sẽ hướng dẫn bạn cách viết bài kiểm tra đơn vị cho các hàm Python. Nhưng tại sao bạn nên xem xét việc viết bài kiểm tra đơn vị?
Chà, khi làm việc trong một dự án lớn, bạn sẽ thường phải cập nhật một số mô-đun nhất định và mã tái cấu trúc khi cần thiết. Nhưng những thay đổi như vậy có thể gây ra hậu quả ngoài ý muốn đối với các mô-đun khác sử dụng mô-đun được cập nhật bên trong chúng. Điều này đôi khi có thể phá vỡ chức năng hiện có
Là nhà phát triển, bạn nên kiểm tra mã của mình để đảm bảo rằng tất cả các mô-đun trong ứng dụng đều hoạt động như dự kiến. Kiểm tra đơn vị cho phép bạn kiểm tra xem các đơn vị mã nhỏ bị cô lập có hoạt động chính xác hay không và cho phép bạn khắc phục sự không nhất quán phát sinh từ các bản cập nhật và tái cấu trúc
Hướng dẫn này sẽ giúp bạn bắt đầu thử nghiệm đơn vị trong Python. Bạn sẽ học cách sử dụng mô-đun
# .py
import unittest
from import
# all entries within are placeholders
class TestClass[unittest.TestCase]:
def test_[self]:
# check function_to_test
def test_[self]:
# check function_to_test
:
:
:
def test_[self]:
# check function_to_test
2 tích hợp sẵn của Python để thiết lập và chạy các bài kiểm tra đơn vị cũng như viết các trường hợp kiểm tra để kiểm tra các chức năng của Python. Bạn cũng sẽ học cách kiểm tra các chức năng đưa ra ngoại lệBắt đầu nào
Thử nghiệm bằng Python – Những bước đầu tiên
Chúng ta sẽ bắt đầu bằng cách định nghĩa một hàm Python và viết các bài kiểm tra đơn vị để kiểm tra xem nó có hoạt động như mong đợi không. Để tập trung vào cách thiết lập các bài kiểm tra đơn vị, chúng ta sẽ xem xét một hàm đơn giản
# .py
import unittest
from import
# all entries within are placeholders
class TestClass[unittest.TestCase]:
def test_[self]:
# check function_to_test
def test_[self]:
# check function_to_test
:
:
:
def test_[self]:
# check function_to_test
3, hàm này nhận vào một số và kiểm tra xem đó có phải là số nguyên tố hay khôngimport math
def is_prime[num]:
'''Check if num is prime or not.'''
for i in range[2,int[math.sqrt[num]]+1]:
if num%i==0:
return False
return True
Hãy bắt đầu một REPL Python, gọi hàm
# .py
import unittest
from import
# all entries within are placeholders
class TestClass[unittest.TestCase]:
def test_[self]:
# check function_to_test
def test_[self]:
# check function_to_test
:
:
:
def test_[self]:
# check function_to_test
3 với các đối số và xác minh kết quả>>> from prime_number import is_prime
>>> is_prime[3]
True
>>> is_prime[5]
True
>>> is_prime[12]
False
>>> is_prime[8]
False
>>> assert is_prime[7] == True
Bạn cũng có thể sử dụng câu lệnh
# .py
import unittest
from import
# all entries within are placeholders
class TestClass[unittest.TestCase]:
def test_[self]:
# check function_to_test
def test_[self]:
# check function_to_test
:
:
:
def test_[self]:
# check function_to_test
5 để xác minh rằng # .py
import unittest
from import
# all entries within are placeholders
class TestClass[unittest.TestCase]:
def test_[self]:
# check function_to_test
def test_[self]:
# check function_to_test
:
:
:
def test_[self]:
# check function_to_test
3 trả về giá trị Boolean dự kiến, như minh họa ở trên. Nếu giá trị trả về từ hàm khác với giá trị Boolean dự kiến, thì một # .py
import unittest
from import
# all entries within are placeholders
class TestClass[unittest.TestCase]:
def test_[self]:
# check function_to_test
def test_[self]:
# check function_to_test
:
:
:
def test_[self]:
# check function_to_test
7 sẽ xuất hiệnLoại thử nghiệm thủ công này không hiệu quả khi bạn muốn kiểm tra toàn diện chức năng của mình để tìm danh sách đối số lớn hơn nhiều. Bạn có thể muốn thiết lập thử nghiệm tự động để chạy và xác thực đầu ra của chức năng đối với các trường hợp thử nghiệm được xác định trong bộ thử nghiệm
Cách sử dụng Mô-đun # .py
import unittest
from import
# all entries within are placeholders
class TestClass[unittest.TestCase]:
def test_[self]:
# check function_to_test
def test_[self]:
# check function_to_test
:
:
:
def test_[self]:
# check function_to_test
2 của Python
# .py
import unittest
from import
# all entries within are placeholders
class TestClass[unittest.TestCase]:
def test_[self]:
# check function_to_test
def test_[self]:
# check function_to_test
:
:
:
def test_[self]:
# check function_to_test
Python đi kèm với mô-đun
# .py
import unittest
from import
# all entries within are placeholders
class TestClass[unittest.TestCase]:
def test_[self]:
# check function_to_test
def test_[self]:
# check function_to_test
:
:
:
def test_[self]:
# check function_to_test
2 cho phép bạn định cấu hình các bài kiểm tra tự động cho các chức năng và lớp trong ứng dụng của bạn. Quy trình chung để thiết lập các bài kiểm tra đơn vị trong Python như sau# .py
import unittest
from import
# all entries within are placeholders
class TestClass[unittest.TestCase]:
def test_[self]:
# check function_to_test
def test_[self]:
# check function_to_test
:
:
:
def test_[self]:
# check function_to_test
Đoạn mã trên
$ python -m unittest .py
0 thực hiện như sau- Nhập mô-đun
2 tích hợp sẵn của Python# .py import unittest from import # all entries within are placeholders class TestClass[unittest.TestCase]: def test_[self]: # check function_to_test def test_[self]: # check function_to_test : : : def test_[self]: # check function_to_test
- Nhập hàm Python để kiểm tra,
2 từ mô-đun mà nó được xác định,$ python -m unittest .py
3$ python -m unittest .py
- Tạo một lớp kiểm tra [
4] kế thừa từ lớp$ python -m unittest .py
5$ python -m unittest .py
- Mỗi bài kiểm tra sẽ được chạy phải được định nghĩa là các phương thức bên trong lớp kiểm tra
- 💡 Lưu ý. Để mô-đun
2 xác định các phương pháp này dưới dạng thử nghiệm và chạy chúng, tên của các phương pháp này phải bắt đầu bằng# .py import unittest from import # all entries within are placeholders class TestClass[unittest.TestCase]: def test_[self]: # check function_to_test def test_[self]: # check function_to_test : : : def test_[self]: # check function_to_test
7$ python -m unittest .py
- Lớp
8 trong mô-đun$ python -m unittest .py
2 cung cấp các phương thức khẳng định hữu ích để kiểm tra xem hàm được kiểm tra có trả về các giá trị mong đợi hay không# .py import unittest from import # all entries within are placeholders class TestClass[unittest.TestCase]: def test_[self]: # check function_to_test def test_[self]: # check function_to_test : : : def test_[self]: # check function_to_test
Các phương thức xác nhận phổ biến nhất được liệt kê bên dưới và chúng tôi sẽ sử dụng một số trong số chúng trong hướng dẫn này
Phương phápMô tảif __name__=='__main__':
unittest.main[]
0Khẳng định rằng if __name__=='__main__':
unittest.main[]
1if __name__=='__main__':
unittest.main[]
2Khẳng định rằng if __name__=='__main__':
unittest.main[]
3 là if __name__=='__main__':
unittest.main[]
4if __name__=='__main__':
unittest.main[]
5Khẳng định rằng if __name__=='__main__':
unittest.main[]
3 là if __name__=='__main__':
unittest.main[]
7if __name__=='__main__':
unittest.main[]
8Khẳng định rằng if __name__=='__main__':
unittest.main[]
9 làm tăng $ python .py
0📑 Để biết danh sách đầy đủ các phương thức xác nhận, hãy tham khảo tài liệu unittest
Để chạy các bài kiểm tra này, chúng ta nên chạy unittest làm mô-đun chính, sử dụng lệnh sau
$ python -m unittest .py
Chúng ta có thể thêm điều kiện
$ python .py
1 để chạy # .py
import unittest
from import
# all entries within are placeholders
class TestClass[unittest.TestCase]:
def test_[self]:
# check function_to_test
def test_[self]:
# check function_to_test
:
:
:
def test_[self]:
# check function_to_test
2 làm mô-đun chínhif __name__=='__main__':
unittest.main[]
Việc thêm điều kiện ở trên sẽ cho phép chúng tôi chạy thử nghiệm bằng cách chạy trực tiếp mô-đun Python chứa các thử nghiệm
$ python .py
Cách xác định các trường hợp thử nghiệm cho các hàm Python
Trong phần này, chúng ta sẽ viết các bài kiểm tra đơn vị cho hàm
# .py
import unittest
from import
# all entries within are placeholders
class TestClass[unittest.TestCase]:
def test_[self]:
# check function_to_test
def test_[self]:
# check function_to_test
:
:
:
def test_[self]:
# check function_to_test
3 bằng cách sử dụng cú pháp mà chúng ta đã họcĐể kiểm tra hàm
# .py
import unittest
from import
# all entries within are placeholders
class TestClass[unittest.TestCase]:
def test_[self]:
# check function_to_test
def test_[self]:
# check function_to_test
:
:
:
def test_[self]:
# check function_to_test
3 trả về Boolean, chúng ta có thể sử dụng các phương thức $ python .py
5 và $ python .py
6. Chúng ta định nghĩa bốn phương thức kiểm tra trong lớp $ python .py
7 kế thừa từ lớp $ python -m unittest .py
5import unittest
# import the is_prime function
from prime_number import is_prime
class TestPrime[unittest.TestCase]:
def test_two[self]:
self.assertTrue[is_prime[2]]
def test_five[self]:
self.assertTrue[is_prime[5]]
def test_nine[self]:
self.assertFalse[is_prime[9]]
def test_eleven[self]:
self.assertTrue[is_prime[11]]
if __name__=='__main__':
unittest.main[]
$ python test_prime.py
Trong đầu ra bên dưới, '. ' chỉ ra một thử nghiệm thành công
Output
....
----------------------------------------------------------------------
Ran 4 tests in 0.001s
OK
Trong đoạn mã trên, có bốn phương pháp kiểm tra, mỗi phương pháp kiểm tra một đầu vào cụ thể. Thay vào đó, bạn có thể xác định một phương thức kiểm tra duy nhất để xác nhận xem đầu ra có đúng không, cho cả bốn đầu vào
import unittest
from prime_number import is_prime
class TestPrime[unittest.TestCase]:
def test_prime_not_prime[self]:
self.assertTrue[is_prime[2]]
self.assertTrue[is_prime[5]]
self.assertFalse[is_prime[9]]
self.assertTrue[is_prime[11]]
Khi chạy mô-đun
$ python .py
9, chúng tôi thấy rằng một thử nghiệm đã được chạy thành công. Nếu bất kỳ phương thức xác nhận nào đưa ra kết quả # .py
import unittest
from import
# all entries within are placeholders
class TestClass[unittest.TestCase]:
def test_[self]:
# check function_to_test
def test_[self]:
# check function_to_test
:
:
:
def test_[self]:
# check function_to_test
7, thì thử nghiệm không thành công$ python test_prime.py
>>> from prime_number import is_prime
>>> is_prime[3]
True
>>> is_prime[5]
True
>>> is_prime[12]
False
>>> is_prime[8]
False
>>> assert is_prime[7] == True
1Cách viết bài kiểm tra đơn vị để kiểm tra ngoại lệ
Trong phần trước, chúng ta đã thử nghiệm hàm
# .py
import unittest
from import
# all entries within are placeholders
class TestClass[unittest.TestCase]:
def test_[self]:
# check function_to_test
def test_[self]:
# check function_to_test
:
:
:
def test_[self]:
# check function_to_test
3 với đầu vào là các số nguyên tố và không nguyên tố. Cụ thể, các đầu vào đều là số nguyên dươngChúng tôi vẫn chưa thực thi rằng các đối số trong lệnh gọi hàm tới
# .py
import unittest
from import
# all entries within are placeholders
class TestClass[unittest.TestCase]:
def test_[self]:
# check function_to_test
def test_[self]:
# check function_to_test
:
:
:
def test_[self]:
# check function_to_test
3 phải là số nguyên dương. Bạn có thể sử dụng gợi ý loại để thực thi các loại hoặc đưa ra ngoại lệ cho các đầu vào không hợp lệKhi thử nghiệm chức năng
# .py
import unittest
from import
# all entries within are placeholders
class TestClass[unittest.TestCase]:
def test_[self]:
# check function_to_test
def test_[self]:
# check function_to_test
:
:
:
def test_[self]:
# check function_to_test
3, chúng tôi chưa tính đến những điều sau- Đối với một đối số dấu phẩy động, hàm
3 sẽ vẫn chạy và trả về# .py import unittest from import # all entries within are placeholders class TestClass[unittest.TestCase]: def test_[self]: # check function_to_test def test_[self]: # check function_to_test : : : def test_[self]: # check function_to_test
4 hoặcif __name__=='__main__': unittest.main[]
7, điều này không chính xácif __name__=='__main__': unittest.main[]
- Đối với các đối số thuộc các loại khác, chẳng hạn, chuỗi 'năm' thay vì số 5, hàm sẽ đưa ra TypeError
- Nếu đối số là một số nguyên âm, thì hàm
7 sẽ đưa ra lỗi ValueError. Bình phương của mọi số thực [dương, âm hoặc 0] luôn không âm. Vì vậy, căn bậc hai chỉ được xác định cho các số không âmimport unittest # import the is_prime function from prime_number import is_prime class TestPrime[unittest.TestCase]: def test_two[self]: self.assertTrue[is_prime[2]] def test_five[self]: self.assertTrue[is_prime[5]] def test_nine[self]: self.assertFalse[is_prime[9]] def test_eleven[self]: self.assertTrue[is_prime[11]] if __name__=='__main__': unittest.main[]
Hãy xác minh những điều trên bằng cách chạy một số ví dụ trong Python REPL
>>> from prime_number import is_prime
>>> is_prime[3]
True
>>> is_prime[5]
True
>>> is_prime[12]
False
>>> is_prime[8]
False
>>> assert is_prime[7] == True
2Cách tăng ngoại lệ cho đầu vào không hợp lệ
Để giải quyết vấn đề trên, chúng tôi sẽ xác thực giá trị được sử dụng trong lệnh gọi hàm cho
import unittest
# import the is_prime function
from prime_number import is_prime
class TestPrime[unittest.TestCase]:
def test_two[self]:
self.assertTrue[is_prime[2]]
def test_five[self]:
self.assertTrue[is_prime[5]]
def test_nine[self]:
self.assertFalse[is_prime[9]]
def test_eleven[self]:
self.assertTrue[is_prime[11]]
if __name__=='__main__':
unittest.main[]
8 và đưa ra các ngoại lệ nếu cần- Kiểm tra xem
8 có phải là số nguyên không. Nếu có, tiến hành kiểm tra tiếp theo. Khác, đưa ra một ngoại lệimport unittest # import the is_prime function from prime_number import is_prime class TestPrime[unittest.TestCase]: def test_two[self]: self.assertTrue[is_prime[2]] def test_five[self]: self.assertTrue[is_prime[5]] def test_nine[self]: self.assertFalse[is_prime[9]] def test_eleven[self]: self.assertTrue[is_prime[11]] if __name__=='__main__': unittest.main[]
0$ python test_prime.py
- Kiểm tra xem
8 có phải là số nguyên âm không. Nếu có, hãy đưa ra một ngoại lệimport unittest # import the is_prime function from prime_number import is_prime class TestPrime[unittest.TestCase]: def test_two[self]: self.assertTrue[is_prime[2]] def test_five[self]: self.assertTrue[is_prime[5]] def test_nine[self]: self.assertFalse[is_prime[9]] def test_eleven[self]: self.assertTrue[is_prime[11]] if __name__=='__main__': unittest.main[]
2$ python test_prime.py
Sửa đổi định nghĩa hàm để xác thực đầu vào và đưa ra các ngoại lệ, chúng tôi có
>>> from prime_number import is_prime
>>> is_prime[3]
True
>>> is_prime[5]
True
>>> is_prime[12]
False
>>> is_prime[8]
False
>>> assert is_prime[7] == True
3Bây giờ chúng ta đã sửa đổi chức năng để tăng ValueError và TypeError đối với các đầu vào không hợp lệ, bước tiếp theo là kiểm tra xem các ngoại lệ này có tăng không
Cách sử dụng Phương pháp $ python test_prime.py
3 để kiểm tra ngoại lệ
$ python test_prime.py
Trong định nghĩa của lớp
$ python .py
7, hãy thêm các phương thức để kiểm tra xem các ngoại lệ có được đưa ra hay khôngChúng tôi xác định các phương pháp
$ python test_prime.py
5 và $ python test_prime.py
6 để kiểm tra xem ngoại lệ $ python test_prime.py
0 có được đưa ra hay không và phương pháp $ python test_prime.py
8 để kiểm tra xem ngoại lệ $ python test_prime.py
2 có được đưa ra hay không📌 Để gọi phương thức
$ python test_prime.py
3, chúng ta có thể sử dụng cú pháp tổng quát sau>>> from prime_number import is_prime
>>> is_prime[3]
True
>>> is_prime[5]
True
>>> is_prime[12]
False
>>> is_prime[8]
False
>>> assert is_prime[7] == True
4Chúng tôi cũng có thể sử dụng cú pháp sau bằng trình quản lý ngữ cảnh [chúng tôi sẽ sử dụng cú pháp này trong ví dụ này]
>>> from prime_number import is_prime
>>> is_prime[3]
True
>>> is_prime[5]
True
>>> is_prime[12]
False
>>> is_prime[8]
False
>>> assert is_prime[7] == True
5Thêm các phương pháp kiểm tra để kiểm tra các ngoại lệ, chúng tôi có
>>> from prime_number import is_prime
>>> is_prime[3]
True
>>> is_prime[5]
True
>>> is_prime[12]
False
>>> is_prime[8]
False
>>> assert is_prime[7] == True
6Hãy chạy mô-đun
$ python .py
9 và quan sát đầu ra$ python test_prime.py
>>> from prime_number import is_prime
>>> is_prime[3]
True
>>> is_prime[5]
True
>>> is_prime[12]
False
>>> is_prime[8]
False
>>> assert is_prime[7] == True
8Trong các ví dụ chúng tôi đã mã hóa cho đến nay, tất cả các thử nghiệm đều thành công. Hãy sửa đổi một trong các phương thức, chẳng hạn,
$ python test_prime.py
6, thành như sau>>> from prime_number import is_prime
>>> is_prime[3]
True
>>> is_prime[5]
True
>>> is_prime[12]
False
>>> is_prime[8]
False
>>> assert is_prime[7] == True
9Chúng tôi gọi hàm
# .py
import unittest
from import
# all entries within are placeholders
class TestClass[unittest.TestCase]:
def test_[self]:
# check function_to_test
def test_[self]:
# check function_to_test
:
:
:
def test_[self]:
# check function_to_test
3 với số 5 là đối số. Ở đây, 5 là đầu vào hợp lệ mà hàm trả về if __name__=='__main__':
unittest.main[]
4. Do đó, chức năng không tăng một $ python test_prime.py
0. Khi chúng tôi chạy lại các bài kiểm tra, chúng tôi sẽ thấy rằng có một bài kiểm tra không thành công$ python test_prime.py
# .py
import unittest
from import
# all entries within are placeholders
class TestClass[unittest.TestCase]:
def test_[self]:
# check function_to_test
def test_[self]:
# check function_to_test
:
:
:
def test_[self]:
# check function_to_test
1Phần kết luận
Cảm ơn bạn đã đọc đến đây. 😄 Tôi hy vọng hướng dẫn này đã giúp bạn hiểu những kiến thức cơ bản về kiểm thử đơn vị trong Python
Bạn đã học cách thiết lập các bài kiểm tra để kiểm tra xem một chức năng có hoạt động như mong đợi hay đưa ra một ngoại lệ hay không—tất cả đều sử dụng mô-đun
# .py
import unittest
from import
# all entries within are placeholders
class TestClass[unittest.TestCase]:
def test_[self]:
# check function_to_test
def test_[self]:
# check function_to_test
:
:
:
def test_[self]:
# check function_to_test
2 tích hợp sẵn của PythonTiếp tục mã hóa và hẹn gặp lại bạn trong hướng dẫn tiếp theo. 👩🏽💻
QUẢNG CÁO
QUẢNG CÁO
QUẢNG CÁO
QUẢNG CÁO
QUẢNG CÁO
QUẢNG CÁO
QUẢNG CÁO
QUẢNG CÁO
QUẢNG CÁO
Tôi là một nhà phát triển và nhà văn kỹ thuật đến từ Ấn Độ. Tôi viết hướng dẫn về mọi thứ liên quan đến lập trình và máy học
Nếu bạn đọc đến đây, hãy tweet cho tác giả để cho họ thấy bạn quan tâm. Tweet một lời cảm ơn
Học cách viết mã miễn phí. Chương trình giảng dạy mã nguồn mở của freeCodeCamp đã giúp hơn 40.000 người có được việc làm với tư cách là nhà phát triển. Bắt đầu