Ví dụ về bộ unittest Python

Giờ đây, bạn có thể xem báo cáo HTML đính kèm và thấy rằng báo cáo này trình bày tất cả các chi tiết bắt buộc của quá trình thực thi thử nghiệm. Từ các liên kết lỗi, bạn thậm chí có thể đi sâu vào vấn đề thực tế. Nhìn chung, đó là một báo cáo đẹp mắt mà bạn có thể tự hào chia sẻ với tất cả các bên liên quan

Bạn có muốn ngủ ngon hơn vào ban đêm khi biết rằng mã của bạn sẽ không bị hỏng không?

Ảnh của Brett Jordan trên Bapt

Kiểm tra đơn vị là gì, tại sao kiểm tra đơn vị lại quan trọng, các phương pháp hay nhất để kiểm tra đơn vị là gì và làm cách nào để triển khai kiểm tra đơn vị trong Python?

Các bài kiểm tra là gì?

Kiểm thử là một khái niệm đơn giản và trực quan. Bạn viết các bài kiểm tra song song với mã chính của mình để đảm bảo rằng nó hoạt động theo cách bạn mong đợi. Mọi người đều kiểm tra mã của họ theo cách này hay cách khác - nhưng có những cách tốt hơn và tệ hơn để làm như vậy

Hầu hết mọi người sẽ chạy thử nghiệm nhanh trong thiết bị đầu cuối hoặc với sự kết hợp hỗn hợp giữa câu lệnh khẳng định và câu lệnh in. Tôi không nói là đừng làm điều này, nhưng có nhiều cách hiệu quả hơn để kiểm tra mã của bạn mà tôi sẽ giải thích ngay sau đây. Nhưng trước tiên, hãy để tôi thuyết phục bạn rằng việc kiểm tra mã của bạn là điều cần thiết

Tại sao sử dụng các bài kiểm tra?

Trước hết, nếu bạn đang viết bài kiểm tra cùng với mã của mình, điều đó sẽ khiến bạn nghĩ về mã của mình ở mức độ sâu hơn nhiều. Nó sẽ khiến bạn suy nghĩ nhiều hơn về đầu vào, đầu ra và mục tiêu của đoạn mã bạn đang viết. Điều này sẽ khuyến khích bạn viết mã hiệu quả hơn ngay từ đầu

Nó có thể giúp bạn tiết kiệm hàng giờ gỡ lỗi vô tận. Hãy nghĩ về việc viết bài kiểm tra như một khoản đầu tư vào thời gian của bạn [và mức độ căng thẳng]. Khi bạn viết mã, bạn viết các bài kiểm tra cùng với nó. Nếu một cái gì đó có hình quả lê, khoản đầu tư của bạn vào các thử nghiệm này sẽ thưởng cho bạn một mũi tên lớn chỉ vào vấn đề. Điều này đặc biệt đúng khi nói đến các hàm dài và phức tạp.

Các thử nghiệm cũng có thể nhân rộng. Giống như cách bạn sao chép và dán một chức năng từ dự án này sang dự án khác, bạn có thể thực hiện tương tự với các bài kiểm tra. Các chức năng và bài kiểm tra của bạn giống như Batman và Robin

Bạn thậm chí có thể viết các bài kiểm tra trước các chức năng của mình. Có một trường phái tư tưởng gọi là phát triển dựa trên thử nghiệm [TDD] gợi ý rằng bạn nên viết các hàm trước khi kiểm tra. Liệu đó có phải là một ý tưởng hay hay không là một cuộc tranh luận rất gay gắt và là một cuộc tranh luận mà tôi không có ý định tham gia.

Làm thế nào để sử dụng các bài kiểm tra?

Bài kiểm tra tích hợp đơn vị v

Trước hết, chúng ta cần thảo luận về hai loại thử nghiệm chính. Loại thử nghiệm chính mà bạn sẽ gặp là thử nghiệm đơn vị. Đây là thử nghiệm của một đơn vị hoặc thành phần cụ thể - phổ biến nhất là một chức năng. Kiểm thử tích hợp đang kiểm tra xem tất cả các thành phần này khớp với nhau như thế nào. Các ví dụ sau sẽ tập trung vào thử nghiệm đơn vị

Vì vậy, hãy bắt đầu với một ví dụ cơ bản về bài kiểm tra đơn vị độc lập. Giả sử chúng ta có chức năng dưới đây

def add[x,y]:
return x + y

Sau đó, một ví dụ về bài kiểm tra đơn vị cho điều này sẽ là

assert add[2,4] == 6, "Should be 6"

Từ khóa

assert add[2,4] == 6, "Should be 6"
0 cho phép bạn kiểm tra xem một điều kiện trong mã của bạn có trả về True hay không, nếu không, chương trình sẽ đưa ra lỗi AssertionError. Hãy cẩn thận với dấu ngoặc đơn ở đây, vì khẳng định là một câu lệnh

Nếu bạn chạy cái này trong thiết bị đầu cuối Python của mình, sẽ không có gì xảy ra vì 2 + 4 thực tế bằng 6. Hãy thử lại, thay đổi 6 thành 7 và như đã hứa, bạn sẽ gặp lỗi AssertionError

Tạo bởi tác giả

Như bạn có thể thấy, nó hiển thị thông báo lỗi theo sau câu lệnh khẳng định

Mặc dù vậy, chúng tôi có thể hiệu quả hơn và có tổ chức hơn với thử nghiệm của mình

Các trường hợp thử nghiệm, bộ thử nghiệm và người chạy thử nghiệm

Xin giới thiệu với các bạn một vài khái niệm

Đầu tiên, các trường hợp thử nghiệm. Một trường hợp thử nghiệm là một thử nghiệm cụ thể của một trường hợp hoặc một phản hồi. Câu lệnh khẳng định là một ví dụ về trường hợp thử nghiệm. Chúng tôi đang kiểm tra xem trong trường hợp 2 + 4 được nhập vào, thì chúng tôi nhận được câu trả lời là 6

Nếu chúng ta nhóm nhiều trường hợp thử nghiệm lại với nhau, chúng ta sẽ có một Bộ thử nghiệm. Thông thường, sẽ hợp lý khi cộng nhiều trường hợp tương tự lại với nhau

Khi chúng tôi chạy các trường hợp thử nghiệm và bộ thử nghiệm của mình, chúng tôi cần một cách làm có tổ chức và hiệu quả. Đây là nơi chúng tôi sử dụng Trình chạy thử. Người chạy thử điều phối việc thực hiện các bài kiểm tra và làm cho cuộc sống của chúng tôi dễ dàng hơn rất nhiều

Có rất nhiều trình chạy thử nghiệm, nhưng trình chạy thử nghiệm yêu thích của tôi và được tích hợp sẵn trong python là Unittest. Đó là những gì chúng ta sẽ làm việc với ngày hôm nay

Sử dụng Unittest

Unittest có một vài quy tắc mà bạn phải tuân theo. Nó đơn giản, thanh lịch và dễ sử dụng khi bạn hiểu rõ về nó

Đầu tiên, bạn phải đặt tất cả các bài kiểm tra của mình vào các lớp dưới dạng phương thức. Khi bạn làm điều này, bạn thay thế từ khóa khẳng định bằng các phương thức xác nhận đặc biệt được kế thừa từ unittest. lớp TestCase

Vì vậy, đây là một ví dụ sử dụng cùng một ví dụ mà chúng ta đã xem xét. Tôi đã tạo một tệp mới có tên là “kiểm tra. py”, đó là một quy ước tiêu chuẩn. Tôi đã lưu chức năng thêm trong một thư mục có tên là chức năng ở cùng cấp độ với kiểm tra. py

Tạo bởi tác giả.
import unittestimport functions
class TestAdd[unittest.TestCase]: def test_add[self]: self.assertEqual[functions.add[2, 4], 6]
if __name__ == '__main__':
unittest.main[]
  1. Đầu tiên, chúng tôi phải nhập khẩu
    assert add[2,4] == 6, "Should be 6"
    1 theo tiêu chuẩn
  2. Tạo một lớp tên là
    assert add[2,4] == 6, "Should be 6"
    2 kế thừa từ lớp
    assert add[2,4] == 6, "Should be 6"
    3
  3. Thay đổi các chức năng kiểm tra thành các phương thức
  4. Thay đổi các xác nhận để sử dụng phương thức
    assert add[2,4] == 6, "Should be 6"
    4 trong lớp
    assert add[2,4] == 6, "Should be 6"
    3. Một danh sách đầy đủ các phương pháp có sẵn có thể được nhìn thấy dưới đây
  5. Thay đổi điểm nhập dòng lệnh để gọi
    assert add[2,4] == 6, "Should be 6"
    6

Danh sách đầy đủ các phương thức xác nhận nhỏ nhất — https. // tài liệu. con trăn. org/3/library/unittest. html#unittest. Trường hợp thử nghiệm. khẳng địnhTrue

Vì vậy, bây giờ, nếu bạn chạy thử nghiệm. py trong thiết bị đầu cuối, bạn sẽ thấy điều này

Tạo bởi tác giả

Mỗi dấu chấm phía trên đường đứt nét thể hiện một bài kiểm tra đã được chạy. Nếu thử nghiệm này phát sinh lỗi, nó sẽ được thay thế bằng E hoặc F nếu không thành công

Vì vậy, nếu chúng ta thay thế 6 bằng 7 thì chúng ta sẽ nhận được điều này

Tạo bởi tác giả

Tạo bởi tác giả

Tất nhiên, chúng tôi chỉ có một bài kiểm tra ở đây nên chúng tôi đã biết nó bị lỗi ở đâu. Nếu chúng tôi có nhiều hơn nữa, sẽ rất dễ dàng để biết nó đã thất bại ở đâu vì nó rất cụ thể

Làm thế nào để viết bài kiểm tra tốt?

Đặt tên rõ ràng cho các bài kiểm tra của bạn — và đừng quên gọi chúng là các bài kiểm tra

Thử nghiệm này sẽ không chạy

assert add[2,4] == 6, "Should be 6"
0

Phương pháp thử nghiệm phải bắt đầu bằng 'thử nghiệm'. 'thêm thử nghiệm' sẽ chạy nhưng 'thêm thử nghiệm' sẽ không. Nếu bạn định nghĩa một phương thức không bắt đầu bằng ‘test’ thì nó sẽ tự động vượt qua - vì nó chưa bao giờ chạy. Vì vậy, nó cũng có thể không có ở đó. Trên thực tế, có một bài kiểm tra mà bạn cho là đã vượt qua còn tệ hơn rất nhiều so với một bài kiểm tra không tồn tại. Nó có thể loại bỏ việc sửa lỗi của bạn. Ngoài ra, đừng sợ một cái tên dài, hãy cụ thể. Nó làm cho việc tìm ra lỗi dễ dàng hơn rất nhiều

Bắt đầu với các bài kiểm tra trực quan đơn giản và xây dựng

Bắt đầu với các bài kiểm tra nảy ra trong đầu. Những điều này sẽ đảm bảo rằng mục tiêu chính của chức năng của bạn là chính xác. Khi các bài kiểm tra này vượt qua, thì bạn có thể nghĩ về các bài kiểm tra phức tạp hơn. Đừng phức tạp cho đến khi bạn đảm bảo chức năng cơ bản là chính xác

Trường hợp cạnh và vượt qua ranh giới

Tôi thích bắt đầu và suy nghĩ về các trường hợp cạnh. Hãy lấy ví dụ về làm việc với các số. Điều gì xảy ra nếu chúng ta nhập phủ định? . Zeros thích phá mã vì vậy thật tốt khi có một bài kiểm tra cho điều đó. Vì vậy, hãy tặc lưỡi thêm một số ví dụ trong đó

assert add[2,4] == 6, "Should be 6"
1

và voila, mã của chúng tôi có vẻ tốt

Mỗi bài kiểm tra phải độc lập

Các bài kiểm tra không bao giờ nên phụ thuộc vào nhau. Unittest có chức năng tích hợp để ngăn bạn làm điều này. Các phương pháp

assert add[2,4] == 6, "Should be 6"
7 và
assert add[2,4] == 6, "Should be 6"
8 cho phép bạn xác định các lệnh sẽ được thực hiện trước và sau mỗi phương pháp kiểm tra. Tôi nói điều này là do Unittest không đảm bảo rằng các bài kiểm tra của bạn sẽ chạy theo thứ tự bạn đã chỉ định

Tránh sử dụng Khẳng định. Là đúng

Đơn giản là nó không cung cấp cho bạn đủ thông tin. Nó sẽ không cho bạn biết gì hơn nếu giá trị là đúng hay sai. Nếu bạn sử dụng phương thức assertEqual như chúng tôi đã làm trước đó, bạn sẽ nhận được nhiều thông tin hơn

assert add[2,4] == 6, "Should be 6"
4

Dễ gỡ lỗi hơn nhiều so với

assert add[2,4] == 6, "Should be 6"
5Đôi khi bài kiểm tra của bạn vẫn bỏ sót vài thứ - không sao cả

Chỉ cần quay lại và thêm vào một bài kiểm tra mới để bạn không bỏ lỡ lần sau

Hãy xem ví dụ này về hàm làm tròn một số và cộng mười. không có gì điên rồ

assert add[2,4] == 6, "Should be 6"
6

và bộ thử nghiệm này

assert add[2,4] == 6, "Should be 6"
7

Từ việc xem xét điều này [nếu bạn chưa biết thông tin chi tiết về phương pháp làm tròn], bạn sẽ mong đợi tất cả các bài kiểm tra sẽ vượt qua. Họ không

Tạo bởi tác giả

Tạo bởi tác giả

Bạn có thể xem tại đây [nhờ tính hữu ích của người chạy thử] mà vòng 4. 5 không bằng 5. Vì vậy, khi chúng ta thêm mười, nó không bằng 14. Phương thức round làm tròn xuống ở lề thay vì lên. Đây là những lỗi nhỏ đôi khi có thể làm hỏng toàn bộ chương trình và như tôi đã nói lúc đầu, bạn thậm chí sẽ không nghĩ đến chúng

Ví dụ này làm nổi bật hai điều

1 — Bạn sẽ không bao giờ nghĩ đến tất cả các cách mà chương trình của mình có thể thất bại, nhưng thử nghiệm sẽ cải thiện cơ hội của bạn

2 — Nếu bạn bỏ lỡ điều gì đó, hãy quay lại tệp thử nghiệm của bạn và viết một xác nhận mới cho trường hợp này. Điều này có nghĩa là bạn sẽ không bỏ lỡ nó nữa trong tương lai [bao gồm bất kỳ dự án nào khác mà bạn sao chép chức năng và tệp thử nghiệm sang]

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

Unittest hay pytest tốt hơn?

Đầu ra ở trên cho chúng ta biết rằng hai bài kiểm tra đã được chạy trong 0. 001 và một thất bại, nhưng không nhiều. Cuối cùng, pytest cung cấp nhiều thông tin phản hồi hơn , rất hữu ích khi đến lúc gỡ lỗi. Nói chung, cả pytest và unittest đều là những công cụ tuyệt vời để sử dụng để kiểm tra tự động trong Python.

Bộ kiểm tra Python là gì?

bộ thử nghiệm. Bộ kiểm thử là tập hợp các trường hợp kiểm thử, bộ kiểm thử hoặc cả hai . Nó được sử dụng để tổng hợp các bài kiểm tra nên được thực hiện cùng nhau. người chạy thử. Trình chạy thử nghiệm là một thành phần điều phối việc thực hiện các thử nghiệm và cung cấp kết quả cho người dùng.

Làm cách nào để sử dụng unittest trong Python?

đơn vị nhất .
Nhập unittest từ thư viện chuẩn
Tạo một lớp gọi là TestSum kế thừa từ lớp TestCase
Chuyển đổi các hàm kiểm tra thành các phương thức bằng cách thêm self làm đối số đầu tiên
Thay đổi các xác nhận để sử dụng self. .
Thay đổi điểm nhập dòng lệnh để gọi unittest

Chủ Đề