Testcase trong python là gì?

Chuyển đến nội dung chính

Giới thiệu về Python

Nắm vững kiến ​​thức cơ bản về phân tích dữ liệu với Python chỉ trong bốn giờ. Khóa học trực tuyến này sẽ giới thiệu giao diện Python và khám phá các gói phổ biến

Python trung cấp

Nâng cao kỹ năng khoa học dữ liệu của bạn bằng cách tạo trực quan hóa bằng Matplotlib và thao tác với DataFrames bằng gấu trúc

Trong hướng dẫn này, chúng tôi sẽ triển khai kiểm tra đơn vị bằng Python. Bản thân kiểm thử đơn vị bằng Python là một chủ đề lớn, nhưng chúng tôi sẽ đề cập đến một số khái niệm cơ bản

Python unittest là gì?

Kiểm tra đơn vị là một kỹ thuật trong đó mô-đun cụ thể được kiểm tra để chính nhà phát triển kiểm tra xem có bất kỳ lỗi nào không. Trọng tâm chính của kiểm tra đơn vị là kiểm tra một đơn vị hệ thống riêng lẻ để phân tích, phát hiện và sửa lỗi

Python cung cấp module unittest để kiểm tra đơn vị mã nguồn. Unittest đóng một vai trò thiết yếu khi chúng ta viết mã khổng lồ và nó cung cấp cơ sở để kiểm tra xem đầu ra có đúng hay không

Thông thường, chúng tôi in giá trị và khớp giá trị đó với đầu ra tham chiếu hoặc kiểm tra đầu ra theo cách thủ công

Quá trình này mất nhiều thời gian. Để khắc phục vấn đề này, Python giới thiệu module unittest. Chúng tôi cũng có thể kiểm tra hiệu suất của ứng dụng bằng cách sử dụng nó

Chúng ta sẽ tìm hiểu cách tạo một bài kiểm tra cơ bản, tìm lỗi và thực thi nó trước khi gửi mã cho người dùng

Kiểm tra mã

Chúng tôi có thể kiểm tra mã của mình bằng nhiều cách. Trong phần này, chúng ta sẽ tìm hiểu các bước cơ bản hướng tới các phương pháp nâng cao

Tự động hóa so với. Kiểm tra bằng tay

Kiểm thử thủ công có một hình thức khác, được gọi là kiểm thử khám phá. Đó là một thử nghiệm được thực hiện mà không có bất kỳ kế hoạch nào. Để thực hiện kiểm thử thủ công, chúng ta cần chuẩn bị một danh sách ứng dụng;

Mỗi lần chúng tôi cung cấp thông tin đầu vào hoặc thay đổi mã, chúng tôi cần xem qua từng tính năng của danh sách và kiểm tra nó

Đây là cách kiểm tra phổ biến nhất và nó cũng tốn nhiều thời gian.

Mặt khác, kiểm tra tự động thực thi mã theo kế hoạch mã của chúng tôi, nghĩa là nó chạy một phần mã mà chúng tôi muốn kiểm tra, thứ tự mà chúng tôi muốn kiểm tra chúng bằng tập lệnh thay vì con người.

Python cung cấp một bộ công cụ và thư viện giúp chúng ta tạo các bài kiểm tra tự động cho ứng dụng

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

Giả sử chúng ta muốn kiểm tra đèn ô tô và chúng ta có thể kiểm tra chúng như thế nào. Chúng tôi sẽ bật đèn và đi ra ngoài xe hoặc hỏi người bạn rằng đèn có sáng hay không. Việc bật đèn sẽ được coi là bước kiểm tra, và đi ra ngoài hoặc hỏi bạn bè sẽ biết là kiểm tra khẳng định. Trong kiểm thử tích hợp, chúng ta có thể kiểm thử nhiều thành phần cùng một lúc

Các thành phần này có thể là bất kỳ thứ gì trong mã của chúng ta, chẳng hạn như hàm, lớp và mô-đun mà chúng ta đã viết

Nhưng có một hạn chế của thử nghiệm tích hợp; . Trong tình huống này, sẽ rất khó để nhận ra phần nào của hệ thống đang bị rơi. Hãy lấy ví dụ trước;

Đó là lý do tại sao chúng tôi xem xét kiểm tra đơn vị để biết chính xác vấn đề trong mã được kiểm tra

Kiểm thử đơn vị là một kiểm thử nhỏ hơn, nó kiểm tra một thành phần duy nhất xem nó có hoạt động đúng cách hay không. Sử dụng bài kiểm tra đơn vị, chúng tôi có thể phân biệt những gì cần thiết phải sửa trong hệ thống của mình

Chúng tôi đã thấy hai loại thử nghiệm cho đến nay;

Hãy hiểu ví dụ sau

Chúng tôi áp dụng kiểm tra đơn vị hàm tích hợp sẵn của Python () đối với đầu ra đã biết. Ta kiểm tra xem tổng() của số (2, 3, 5) có bằng 10 không

Dòng trên sẽ trả về kết quả đúng vì giá trị là chính xác. Nếu chúng ta truyền sai đối số, nó sẽ trả về lỗi Assertion. Ví dụ -

Chúng ta có thể đặt đoạn mã trên vào tệp và thực hiện lại tại dòng lệnh

đầu ra

$ python sum.py
Everything is correct

Trong ví dụ sau, chúng tôi sẽ chuyển bộ dữ liệu cho mục đích thử nghiệm. Tạo một tệp mới có tên test_sum2. py

Ví dụ - 2

đầu ra

Everything is correct
Traceback (most recent call last):
  File "", line 13, in 
File "", line 9, in test_sum_tuple
AssertionError: It should be 10

Giải trình -

Trong đoạn mã trên, chúng tôi đã chuyển đầu vào sai cho test_sum_tuple(). Đầu ra không giống với kết quả dự đoán

Cách trên hay nhưng nếu sai nhiều lỗi thì sao. Trình thông dịch Python sẽ báo lỗi ngay lập tức nếu gặp lỗi đầu tiên. Để loại bỏ vấn đề này, chúng tôi sử dụng trình chạy thử nghiệm

Các ứng dụng chạy thử nghiệm được thiết kế đặc biệt để kiểm tra đầu ra, chạy thử nghiệm và cung cấp các công cụ để sửa chữa và chẩn đoán các thử nghiệm và ứng dụng

Chọn người chạy thử

Python chứa nhiều người chạy thử nghiệm. Thư viện Python tích hợp phổ biến nhất được gọi là unittest. Unittest có thể di chuyển sang các khung khác. Hãy xem xét ba người chạy thử nhiều nhất sau đây

  • đơn vị nhất
  • mũi Hoặc mũi2
  • người khó tính

Chúng tôi có thể chọn bất kỳ trong số họ theo yêu cầu của chúng tôi. Hãy giới thiệu ngắn gọn

đơn vị nhất

Unittest được tích hợp vào thư viện chuẩn Python kể từ 2. 1. Điều tốt nhất về unittest, nó đi kèm với cả khung thử nghiệm và người chạy thử nghiệm. Có một vài yêu cầu của unittest để viết và thực thi mã

  • Mã phải được viết bằng cách sử dụng các lớp và chức năng
  • Chuỗi các phương thức xác nhận riêng biệt trong lớp TestCase ngoài các câu lệnh xác nhận tích hợp

Hãy thực hiện ví dụ trên bằng cách sử dụng trường hợp unittest

Thí dụ -

đầu ra

.F
-
FAIL: test_sum_tuple (__main__.TestingSum)
--
Traceback (most recent call last):
  File "", line 11, in test_sum_tuple
AssertionError: 9 != 10 : It should be 10

----------------------------------------------------------------------
Ran 2 tests in 0.001s

FAILED (failures=1)
Traceback (most recent call last):
  File "", line 14, in 
  File "/usr/lib/python3.8/unittest/main.py", line 101, in __init__
    self.runTests()
  File "/usr/lib/python3.8/unittest/main.py", line 273, in runTests
    sys.exit(not self.result.wasSuccessful())
SystemExit: True

Như chúng ta có thể thấy ở đầu ra, nó hiển thị dấu chấm (. ) để thực hiện thành công và F cho một lần thất bại

mũi

Đôi khi, chúng ta cần viết hàng trăm, hàng nghìn dòng test cho ứng dụng;

Người chạy thử nghiệm mũi có thể là một sự thay thế phù hợp cho người chạy thử nghiệm unittest vì nó tương thích với bất kỳ bài kiểm tra nào sử dụng khung unittest. Có hai loại mũi - mũi và mũi2. Chúng tôi khuyên bạn nên sử dụng nose2 vì đây là phiên bản mới nhất

Làm việc với nose2, chúng ta cần cài đặt nó bằng lệnh sau

Chạy lệnh sau trong thiết bị đầu cuối để kiểm tra mã bằng mũi2

Đầu ra như sau

FAIL: test_sum_tuple (__main__.TestSum)
--
Traceback (most recent call last):
  File "test_sum_unittest.py", line 10, in test_sum_tuple
    self.assertEqual(sum((2, 3, 5)), 10, "It should be 10")
AssertionError: It should be 10

--
Ran 2 tests in 0.001s

FAILED (failures=1)

Nose2 cung cấp nhiều cờ dòng lệnh để lọc bài kiểm tra. Bạn có thể tìm hiểu thêm từ tài liệu chính thức của nó

người khó tính

Trình chạy thử nghiệm pytest hỗ trợ thực hiện các trường hợp thử nghiệm nhỏ nhất. Lợi ích thực tế của pytest là viết các trường hợp kiểm tra pytest. Các trường hợp kiểm tra pytest nói chung là chuỗi các phương thức trong tệp Python bắt đầu

Pytest cung cấp các lợi ích sau -

  • Nó hỗ trợ câu lệnh khẳng định tích hợp thay vì sử dụng các phương thức khẳng định*() đặc biệt
  • Nó cũng cung cấp hỗ trợ làm sạch cho các trường hợp thử nghiệm
  • Nó có thể chạy lại từ các trường hợp cuối cùng
  • Nó có một hệ sinh thái gồm hàng trăm plugin để mở rộng chức năng

Hãy hiểu ví dụ sau

Thí dụ -

Viết bài kiểm tra đầu tiên

Ở đây chúng ta sẽ áp dụng tất cả các khái niệm mà chúng ta đã học trong phần trước. Đầu tiên, chúng ta cần tạo một tên tệp test. py hoặc bất cứ thứ gì. Sau đó, tạo đầu vào và thực thi mã đang được kiểm tra, ghi lại đầu ra. Sau khi chạy mã thành công, khớp đầu ra với kết quả mong đợi

Đầu tiên chúng ta tạo file my_sum file và viết code vào đó

Chúng tôi đã khởi tạo biến tổng lặp qua tất cả các giá trị trong arg

Bây giờ, chúng ta tạo một tên tệp test. py với đoạn mã sau

Thí dụ -

đầu ra

.
----------------------------------------------------------------------
Ran 1 test in 0.000s

OK

Giải trình

Trong đoạn mã trên, chúng tôi đã nhập sum() từ gói my_sum mà chúng tôi đã tạo. Chúng ta đã định nghĩa Checkclass, kế thừa từ unittest. Trường hợp thử nghiệm. Có một phương pháp kiểm tra -. test_list_int(), để kiểm tra số nguyên

Sau khi chạy mã, nó trả về dấu chấm (. ) có nghĩa là không có lỗi trong mã

Hãy hiểu một ví dụ khác

Ví dụ - 2

đầu ra

Peter Decosta has been added with id 0
The user associated with id 0 is Peter

Các chức năng cơ bản của Python và đầu ra của bài kiểm tra đơn vị

Mô-đun unittest tạo ra ba kết quả có thể xảy ra. Dưới đây là kết quả tiềm năng

  1. OK - Nếu vượt qua tất cả các bài kiểm tra, nó sẽ trả về OK
  2. Thất bại - Nó sẽ đưa ra một ngoại lệ AssertionError, nếu bất kỳ thử nghiệm nào không thành công
  3. Lỗi - Nếu có bất kỳ lỗi nào xảy ra thay vì Lỗi xác nhận

Hãy xem các chức năng cơ bản sau đây

Phương thứcMô tả. khẳng địnhEqual(a, b)a == b. khẳng địnhTrue(x)bool(x) là Đúng. khẳng địnhFalse(x)bool(x) là Sai. khẳng địnhIs(a, b)a là b. khẳng địnhIsNone(x)x là Không có. khẳng địnhIn(a, b)a trong b. khẳng địnhIsInstance(a, b)isinstance(a, b). khẳng địnhNotIn(a, b)a không có trong b. assertNotIsInstance(a,b)not isinstance(a, b). khẳng địnhIsNot(a, b)a không phải là b

Ví dụ kiểm tra đơn vị Python

đầu ra

Start set_name test

The length of user_id is =  4
[0, 1, 2, 3]
The length of user_name is =  4
['name0', 'name1', 'name2', 'name3']

Finish set_name test


Start get_name test

The length of user_id is =  4
The lenght of user_name is =  4
Testing for get_name no user test
.F
======================================================================
FAIL: test_1_get_name (__main__.Test)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "C:/Users/DEVANSH SHARMA/PycharmProjects/Hello/multiprocessing.py", line 502, in test_1_get_name
    self.assertEqual('There is no such user', self.person.get_name(i))
AssertionError: 'There is no such user' != ' No such user Find'
- There is no such user
+  No such user Find


----------------------------------------------------------------------
Ran 2 tests in 0.002s

FAILED (failures=1)

Kịch bản thử nghiệm nâng cao

Chúng ta phải làm theo các bước đã cho trong khi tạo thử nghiệm cho ứng dụng

  • Tạo đầu vào cần thiết
  • Thực thi mã, lấy đầu ra
  • Khớp đầu ra với kết quả mong đợi

Tạo đầu vào như giá trị tĩnh cho đầu vào như chuỗi hoặc số là một nhiệm vụ hơi phức tạp. Đôi khi, chúng ta cần tạo một thể hiện của một lớp hoặc một ngữ cảnh

Dữ liệu đầu vào mà chúng ta tạo ra được gọi là vật cố định. Chúng tôi có thể sử dụng lại đồ đạc trong ứng dụng của mình

Khi chúng tôi chạy mã nhiều lần và chuyển các giá trị khác nhau mỗi lần và mong đợi kết quả giống nhau, quá trình này được gọi là tham số hóa

Xử lý lỗi dự kiến

Trong ví dụ trước, chúng ta chuyển số nguyên để kiểm tra sum();

sum() sẽ báo lỗi như mong đợi. Nó sẽ xảy ra do thử nghiệm thất bại

Chúng ta có thể sử dụng. assertRaises() để xử lý các lỗi dự kiến. Nó được sử dụng bên trong với tuyên bố. Hãy hiểu ví dụ sau

Thí dụ -

đầu ra

..
----------------------------------------------------------------------
Ran 2 tests in 0.006s

OK

Python unittest Bỏ qua bài kiểm tra

Chúng ta có thể bỏ qua một phương thức kiểm tra riêng lẻ hoặc TestCase bằng cách sử dụng kỹ thuật kiểm tra bỏ qua. Thất bại sẽ không được tính là thất bại trong TestResult

Xem xét ví dụ sau để bỏ qua phương thức vô điều kiện

Thí dụ -

đầu ra

________số 8

Giải trình

Trong ví dụ trên, phương thức bỏ qua () có tiền tố là @token. Nó nhận một đối số là một thông điệp tường trình nơi chúng tôi có thể mô tả lý do bỏ qua. Ký tự s biểu thị rằng một bài kiểm tra đã được bỏ qua thành công

Chúng ta có thể bỏ qua một phương thức hoặc khối cụ thể dựa trên điều kiện cụ thể

Ví dụ - 2

đầu ra

Fsx.
======================================================================
FAIL: test_add (__main__.suiteTest)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "C:/Users/DEVANSH SHARMA/PycharmProjects/Hello/multiprocessing.py", line 539, in test_add
    self.assertEqual(res, 100)
AssertionError: 50 != 100

----------------------------------------------------------------------
Ran 4 tests in 0.001s

FAILED (failures=1, skipped=1, expected failures=1)

Giải trình

Như chúng ta có thể thấy ở đầu ra, các điều kiện b == 0 và a>b là đúng nên phương thức test_mul() đã bỏ qua. Mặt khác, test_mul đã được đánh dấu là lỗi dự kiến

Sự kết luận

Chúng ta đã thảo luận về khái niệm cực kỳ quan trọng liên quan đến kiểm thử đơn vị Python. Là người mới bắt đầu, chúng ta cần viết các phương thức thông minh, có thể bảo trì để xác thực mã của mình. Khi chúng tôi nhận được một lệnh phù hợp trong bài kiểm tra đơn vị Python, chúng tôi có thể chuyển sang các khung khác như pytest và tận dụng các tính năng nâng cao hơn