Khẳng định [Khẳng định] là một kiểm tra tiêu chuẩn mà bạn có thể bật hoặc tắt khi hoàn tất quá trình kiểm tra chương trình của mình
Cách đơn giản nhất để nghĩ về một khẳng định là ví nó với một câu nâng cao nếu [hoặc chính xác hơn là một câu lệnh nâng cao nếu không]. Một biểu thức đã được kiểm tra và nếu kết quả trả về là Sai thì một ngoại lệ sẽ được đưa ra
Khẳng định được thực hiện bởi câu lệnh assert , từ khóa mới nhất của Python, được giới thiệu từ phiên bản 1. 5.
Thành viên lập trình thường đặt các xác nhận khi bắt đầu một hàm để kiểm tra đầu vào hợp lệ và sau đó một lệnh gọi hàm để kiểm tra đầu ra hợp lệ
Câu lệnh khẳng định
Khi gặp câu lệnh xác nhận, Python sẽ đánh giá biểu thức đi kèm, điều này hy vọng là đúng. Nếu biểu thức là sai, Python sẽ đưa ra một lỗi khẳng định sai
cú pháp
khẳng định Biểu thức [, Đối số]
Nếu xác nhận không thành công, Python sử dụng ArgumentExpression làm đối số cho AssertionError. AssertionError ngoại lệ có thể bị bắt và xử lý giống như bất kỳ ngoại lệ nào khác bằng cách sử dụng câu lệnh try-Exception, nhưng nếu không được xử lý, chúng sẽ xử lý kết thúc chương trình và tạo ra một truy nguyên [traceback
Ví dụ
Đây là một chức năng chuyển đổi nhiệt độ từ Kelvin [độ C] sang độ F. Vì 0 độ Kelvin là độ đông nên hàm sẽ dừng nếu thấy nhiệt độ âm
PyTest là một khung thử nghiệm cho phép người dùng viết mã kiểm tra bằng ngôn ngữ lập trình Python. Nó giúp bạn viết các trường hợp thử nghiệm đơn giản và có thể mở rộng cho cơ sở dữ liệu, API hoặc giao diện người dùng. PyTest chủ yếu được sử dụng để viết bài kiểm tra cho API. Nó giúp viết các bài kiểm tra từ các bài kiểm tra đơn vị đơn giản đến các bài kiểm tra chức năng phức tạp
Tại sao nên sử dụng PyTest?
Một số ưu điểm của pytest là
- Rất dễ dàng để bắt đầu vì cú pháp đơn giản và dễ dàng của nó
- Có thể chạy thử nghiệm song song
- Có thể chạy một bài kiểm tra cụ thể hoặc một tập hợp con các bài kiểm tra
- Tự động phát hiện các bài kiểm tra
- Bỏ qua các bài kiểm tra
- Mã nguồn mở
Trong hướng dẫn Python PyTest này, bạn sẽ học
Cách cài đặt PyTest
Sau đây là quy trình về cách cài đặt PyTest
Bước 1] Bạn có thể cài đặt pytest bằng cách
pip install pytest==2.9.1
Sau khi cài đặt hoàn tất, bạn có thể xác nhận bằng cách
py.test -h
Điều này sẽ hiển thị trợ giúp
PyTest cơ bản đầu tiên
Bây giờ, chúng ta sẽ học cách sử dụng Pytest với một ví dụ cơ bản về PyTest
Tạo một thư mục study_pytest. Chúng tôi sẽ tạo các tệp thử nghiệm của mình trong thư mục này
Vui lòng điều hướng đến thư mục đó trong dòng lệnh của bạn
Tạo một tệp có tên test_sample1. py bên trong thư mục
Thêm mã dưới đây vào nó và lưu lại
import pytest def test_file1_method1[]: x=5 y=6 assert x+1 == y,"test failed" assert x == y,"test failed" def test_file1_method2[]: x=5 y=6 assert x+1 == y,"test failed"
Chạy thử nghiệm bằng lệnh
py.test
Bạn sẽ nhận được đầu ra như
test_sample1.py F. ============================================== FAILURES ======================================== ____________________________________________ test_sample1 ______________________________________ def test_file1_method1[]: x=5 y=6 assert x+1 == y,"test failed" > assert x == y,"test failed" E AssertionError: test failed E assert 5 == 6 test_sample1.py:6: AssertionError
Ở đây trong test_sample1. py F
F nói thất bại
Dấu chấm[. ] nói thành công
Trong phần lỗi, bạn có thể thấy [các] phương thức lỗi và dòng lỗi. Ở đây x==y có nghĩa là 5==6 sai
Tiếp theo trong hướng dẫn PyTest này, chúng ta sẽ tìm hiểu về xác nhận trong PyTest
Xác nhận trong PyTest
Các xác nhận của Pytest là các kiểm tra trả về trạng thái Đúng hoặc Sai. Trong Python Pytest, nếu một xác nhận không thành công trong một phương thức thử nghiệm, thì việc thực thi phương thức đó sẽ dừng lại ở đó. Đoạn mã còn lại trong phương thức kiểm tra đó không được thực thi và các xác nhận của Pytest sẽ tiếp tục với phương pháp kiểm tra tiếp theo
Các ví dụ về xác nhận Pytest
assert "hello" == "Hai" is an assertion failure. assert 4==4 is a successful assertion assert True is a successful assertion assert False is an assertion failure.
Xem xét
assert x == y,"test failed because x=" + str[x] + " y=" + str[y]
Đặt mã này vào test_file1_method1[] thay vì xác nhận
assert x == y,"test failed"
Chạy thử nghiệm sẽ báo lỗi là AssertionError. kiểm tra thất bại x=5 y=6
Cách PyTest Xác định Tệp Kiểm tra và Phương pháp Kiểm tra
Theo mặc định, pytest chỉ xác định tên tệp bắt đầu bằng test_ hoặc kết thúc bằng _test là tệp thử nghiệm. Tuy nhiên, chúng tôi có thể đề cập rõ ràng các tên tệp khác [giải thích sau]. Pytest yêu cầu tên phương thức thử nghiệm bắt đầu bằng “test. ” Tất cả các tên phương thức khác sẽ bị bỏ qua ngay cả khi chúng tôi yêu cầu chạy các phương thức đó một cách rõ ràng
Xem một số ví dụ về tên tệp pytest hợp lệ và không hợp lệ
________số 8Ghi chú. Có, chúng tôi có thể yêu cầu pytest chọn testlogin một cách rõ ràng. py và logintest. py
Xem một số ví dụ về phương pháp kiểm tra pytest hợp lệ và không hợp lệ
def test_file1_method1[]: - valid def testfile1_method1[]: - valid def file1_method1[]: - invalid
Ghi chú. Ngay cả khi chúng tôi đề cập rõ ràng file1_method1[] pytest sẽ không chạy phương thức này
Chạy nhiều thử nghiệm từ một tệp cụ thể và nhiều tệp
Hiện tại trong thư mục study_pytest ta có file test_sample1. py. Giả sử chúng ta có nhiều tệp, giả sử test_sample2. py , test_sample3. py. Để chạy tất cả các bài kiểm tra từ tất cả các tệp trong thư mục và thư mục con, chúng ta chỉ cần chạy lệnh pytest
py.test -h0
Điều này sẽ chạy tất cả các tên tệp bắt đầu bằng test_ và tên tệp kết thúc bằng _test trong thư mục đó và các thư mục con trong thư mục đó
To run tests only from a specific file, we can use py.test
py.test -h1
Chạy một tập hợp con của Toàn bộ thử nghiệm với PyTest
Đôi khi chúng tôi không muốn chạy toàn bộ bộ thử nghiệm. Pytest cho phép chúng tôi chạy thử nghiệm cụ thể. Chúng ta có thể làm theo 2 cách
- Nhóm các tên thử nghiệm bằng cách khớp chuỗi con
- Nhóm các bài kiểm tra theo điểm đánh dấu
Chúng tôi đã có test_sample1. py. Tạo một tệp test_sample2. py và thêm đoạn mã dưới đây vào nó
py.test -h2
Vì vậy, chúng tôi hiện có
py.test -h3
Tùy chọn 1] Chạy thử nghiệm bằng cách so khớp chuỗi con
Ở đây để chạy tất cả các bài kiểm tra có method1 trong tên của nó, chúng ta phải chạy
py.test -h4
Vì vậy, chạy py. test -k method1 -v sẽ cho bạn kết quả như sau
py.test -h5
Tại đây, bạn có thể thấy ở cuối 2 bài kiểm tra được bỏ chọn bởi '-kmethod1', đó là test_file1_method2 và test_file2_method2
Hãy thử chạy với các kết hợp khác nhau như. -
py.test -h6
Tùy chọn 2] Chạy thử nghiệm bằng điểm đánh dấu
Pytest cho phép chúng tôi đặt các thuộc tính khác nhau cho các phương thức kiểm tra bằng cách sử dụng các dấu pytest, @pytest. dấu. Để sử dụng các điểm đánh dấu trong tệp thử nghiệm, chúng tôi cần nhập pytest vào tệp thử nghiệm
Ở đây, chúng tôi sẽ áp dụng các tên đánh dấu khác nhau cho các phương thức kiểm tra và chạy các thử nghiệm cụ thể dựa trên tên đánh dấu. Chúng tôi có thể xác định các điểm đánh dấu trên mỗi tên kiểm tra bằng cách sử dụng
py.test -h7
Chúng tôi đang xác định các điểm đánh dấu set1 và set2 trên các phương thức thử nghiệm và chúng tôi sẽ chạy thử nghiệm bằng cách sử dụng tên điểm đánh dấu. Cập nhật các tệp thử nghiệm với đoạn mã sau
test_sample1. py
py.test -h8
test_sample2. py
py.test -h9
Chúng tôi có thể chạy bài kiểm tra được đánh dấu bằng cách
import pytest def test_file1_method1[]: x=5 y=6 assert x+1 == y,"test failed" assert x == y,"test failed" def test_file1_method2[]: x=5 y=6 assert x+1 == y,"test failed"0
Chạy py. kiểm tra -m set1. Điều này sẽ chạy các phương thức test_file1_method1, test_file2_method1, test_file2_method2
Chạy py. test -m set2 sẽ chạy test_file1_method2
Chạy thử nghiệm song song với Pytest
Thông thường, một bộ kiểm tra sẽ có nhiều tệp kiểm tra và hàng trăm phương pháp kiểm tra sẽ mất một khoảng thời gian đáng kể để thực hiện. Pytest cho phép chúng tôi chạy thử nghiệm song song
Để làm được điều đó, trước tiên chúng ta cần cài đặt pytest-xdist bằng cách chạy
import pytest def test_file1_method1[]: x=5 y=6 assert x+1 == y,"test failed" assert x == y,"test failed" def test_file1_method2[]: x=5 y=6 assert x+1 == y,"test failed"1
Bạn có thể chạy thử nghiệm ngay bây giờ bằng cách
import pytest def test_file1_method1[]: x=5 y=6 assert x+1 == y,"test failed" assert x == y,"test failed" def test_file1_method2[]: x=5 y=6 assert x+1 == y,"test failed"2
-n runs the tests by using multiple workers. In the above command, there will be 4 workers to run the test.
Đồ đạc Pytest
Fixtures được sử dụng khi chúng tôi muốn chạy một số mã trước mọi phương thức kiểm tra. Vì vậy, thay vì lặp lại cùng một mã trong mọi thử nghiệm, chúng tôi xác định đồ đạc. Thông thường, đồ đạc được sử dụng để khởi tạo kết nối cơ sở dữ liệu, vượt qua cơ sở, v.v.
Một phương thức được đánh dấu là vật cố định Pytest bằng cách đánh dấu bằng
import pytest def test_file1_method1[]: x=5 y=6 assert x+1 == y,"test failed" assert x == y,"test failed" def test_file1_method2[]: x=5 y=6 assert x+1 == y,"test failed"3
Một phương pháp thử nghiệm có thể sử dụng vật cố định Pytest bằng cách đề cập đến vật cố định làm tham số đầu vào
Tạo một tệp mới test_basic_fixture. py với đoạn mã sau
import pytest def test_file1_method1[]: x=5 y=6 assert x+1 == y,"test failed" assert x == y,"test failed" def test_file1_method2[]: x=5 y=6 assert x+1 == y,"test failed"4
Nơi đây
- Chúng tôi có một lịch thi đấu tên là supply_AA_BB_CC. Phương thức này sẽ trả về danh sách 3 giá trị
- Chúng tôi có 3 phương pháp kiểm tra so sánh với từng giá trị
Mỗi chức năng kiểm tra có một đối số đầu vào có tên phù hợp với một lịch thi đấu có sẵn. Sau đó, Pytest gọi phương thức cố định tương ứng và các giá trị được trả về sẽ được lưu trữ trong đối số đầu vào, ở đây là danh sách [25,35,45]. Bây giờ các mục danh sách đang được sử dụng trong các phương pháp thử nghiệm để so sánh
Bây giờ chạy thử nghiệm và xem kết quả
import pytest def test_file1_method1[]: x=5 y=6 assert x+1 == y,"test failed" assert x == y,"test failed" def test_file1_method2[]: x=5 y=6 assert x+1 == y,"test failed"5
import pytest def test_file1_method1[]: x=5 y=6 assert x+1 == y,"test failed" assert x == y,"test failed" def test_file1_method2[]: x=5 y=6 assert x+1 == y,"test failed"6
Bài kiểm tra test_comparewithBB được thông qua kể từ zz=BB=35 và 2 bài kiểm tra còn lại không đạt
Phương thức cố định chỉ có phạm vi trong tệp thử nghiệm đó, nó được xác định. Nếu chúng tôi cố gắng truy cập lịch thi đấu trong một số tệp thử nghiệm khác, chúng tôi sẽ gặp lỗi cho biết không tìm thấy lịch thi đấu ‘supply_AA_BB_CC’ cho các phương pháp kiểm tra trong các tệp khác
Để sử dụng cùng một lịch thi đấu cho nhiều tệp thử nghiệm, chúng tôi sẽ tạo các phương thức lịch thi đấu trong một tệp có tên là conftest. py
Hãy xem điều này bằng ví dụ PyTest bên dưới. Tạo 3 file conftest. py, test_basic_fixture. py, test_basic_fixture2. py với đoạn mã sau
thú nhận. py
import pytest def test_file1_method1[]: x=5 y=6 assert x+1 == y,"test failed" assert x == y,"test failed" def test_file1_method2[]: x=5 y=6 assert x+1 == y,"test failed"7
test_basic_fixture. py
import pytest def test_file1_method1[]: x=5 y=6 assert x+1 == y,"test failed" assert x == y,"test failed" def test_file1_method2[]: x=5 y=6 assert x+1 == y,"test failed"8
test_basic_fixture2. py
import pytest def test_file1_method1[]: x=5 y=6 assert x+1 == y,"test failed" assert x == y,"test failed" def test_file1_method2[]: x=5 y=6 assert x+1 == y,"test failed"9
pytest sẽ tìm kiếm lịch thi đấu trong tệp thử nghiệm trước và nếu không tìm thấy, nó sẽ tìm trong conftest. py
Chạy thử nghiệm bằng py. test -k test_comparewith -v để được kết quả như bên dưới
py.test0
Kiểm tra tham số hóa Pytest
Mục đích của tham số hóa một bài kiểm tra là để chạy một bài kiểm tra đối với nhiều bộ đối số. Chúng tôi có thể làm điều này bằng cách @pytest. dấu. tham số hóa
Chúng ta sẽ thấy điều này với ví dụ PyTest bên dưới. Ở đây chúng ta sẽ truyền 3 đối số cho một phương thức kiểm tra. Phương pháp kiểm tra này sẽ thêm 2 đối số đầu tiên và so sánh nó với đối số thứ 3
Tạo tệp thử nghiệm test_addition. py với đoạn mã dưới đây
py.test1
Ở đây, phương thức kiểm tra chấp nhận 3 đối số- input1, input2, output. Nó thêm đầu vào1 và đầu vào2 và so sánh với đầu ra
Hãy chạy thử nghiệm bằng py. kiểm tra -k test_add -v và xem kết quả
py.test2
Bạn có thể thấy các bài kiểm tra đã chạy 2 lần – một lần kiểm tra 5+5 ==10 và lần kiểm tra khác 3+5 ==12
test_addition. py. test_add[5-5-10] ĐÃ THÔNG QUA
test_addition. py. test_add[3-5-12] KHÔNG THÀNH CÔNG
Pytest Xfail / Bỏ qua các bài kiểm tra
Sẽ có một số tình huống mà chúng tôi không muốn thực hiện kiểm thử hoặc trường hợp kiểm thử không phù hợp trong một thời điểm cụ thể. Trong những tình huống đó, chúng tôi có tùy chọn Xfail bài kiểm tra hoặc bỏ qua các bài kiểm tra
Bài kiểm tra xfailed sẽ được thực hiện, nhưng nó sẽ không được tính là bài kiểm tra thất bại hoặc vượt qua một phần. Sẽ không có dấu vết hiển thị nếu thử nghiệm đó không thành công. Chúng tôi có thể xfail kiểm tra bằng cách sử dụng
@pytest. dấu. thất bại
Bỏ qua một bài kiểm tra có nghĩa là bài kiểm tra sẽ không được thực hiện. Chúng tôi có thể bỏ qua các bài kiểm tra bằng cách sử dụng
@pytest. dấu. nhảy
Chỉnh sửa test_addition. py với đoạn mã dưới đây
py.test3
Nơi đây
- test_add_1 và test_add_2 bị bỏ qua và sẽ không được thực thi
- test_add_3 và test_add_4 bị xfailed. Các bài kiểm tra này sẽ được thực hiện và sẽ là một phần của các bài kiểm tra xfailed [khi kiểm tra thất bại] hoặc xpassed [khi kiểm tra vượt qua]. Sẽ không có bất kỳ dấu vết nào cho các lỗi
- test_add_5 và test_add_6 sẽ được thực thi và test_add_6 sẽ báo lỗi với truy nguyên trong khi test_add_5 vượt qua
Thực hiện kiểm tra bằng py. kiểm tra test_addition. py -v và xem kết quả
py.test4
Kết quả XML
Chúng tôi có thể tạo kết quả kiểm tra ở định dạng XML mà chúng tôi có thể cung cấp cho các máy chủ Tích hợp liên tục để xử lý thêm, v.v. Điều này có thể được thực hiện bởi
py. thử nghiệm test_sample1. py -v –junitxml=”kết quả. xml”
Kết quả. xml sẽ ghi lại kết quả thực hiện kiểm tra. Tìm một kết quả mẫu. xml bên dưới
py.test5
From we can see a total of two tests of which one is failed. Below that you can see the details regarding each executed test under tag.
Khung Pytest Kiểm tra API
Bây giờ chúng ta sẽ tạo một khung pytest nhỏ để kiểm tra API. API được sử dụng ở đây là API miễn phí từ https. // yêu cầu. Trong/. Trang web này chỉ để cung cấp API có thể kiểm tra. Trang web này không lưu trữ dữ liệu của chúng tôi