Hướng dẫn PyTest: Là gì, Cách cài đặt, Khung, Xác nhận
PyTest là gì?
PyTest là một khung kiểm tra cho phép người dùng viết mã kiểm tra bằng cách sử dụng Python ngôn ngữ lập trình. 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 UI. PyTest chủ yếu được sử dụng để viết các thử nghiệm cho API. Nó giúp viết các thử nghiệm từ các thử nghiệm đơn vị đơn giản đến các thử nghiệm 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 thử nghiệm cụ thể hoặc một tập hợp con các thử nghiệm
- Tự động phát hiện các bài kiểm tra
- Bỏ qua bài kiểm tra
- Mã nguồn mở
Cách cài đặt PyTest
Sau đây là quy trình 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 nó bằng
py.test -h
Điều này sẽ hiển thị sự giúp đỡ
PyTest cơ bản đầu tiên
Bây giờ, chúng ta sẽ tìm hiểu cách sử dụng Pytest với một ví dụ PyTest cơ bản.
Tạo 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 trong thư mục
Thêm mã dưới đây vào nó và lưu
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(.) báo thành công.
Trong phần lỗi, bạn có thể thấy (các) phương thức bị lỗi và dòng lỗi. Ở đây x==y có nghĩa là 5==6 là 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.
Các xác nhận trong PyTest
Xác nhận 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 ở đó. Đoạn mã còn lại trong phương thức thử nghiệm đó không được thực thi và các xác nhận Pytest sẽ tiếp tục với phương thức thử nghiệm tiếp theo.
Ví dụ về khẳng định 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.
Hãy 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 như AssertionError: kiểm tra thất bại x=5 y=6
Cách PyTest xác định các tệp thử nghiệm và phương pháp thử nghiệm
Theo mặc định pytest chỉ xác định tên tệp bắt đầu bằng kiểm tra_ hoặc kết thúc bằng _kiểm tra như các tệp thử nghiệm. Tuy nhiên, chúng ta có thể đề cập rõ ràng đến các tên tệp khác (sẽ giải thích sau). Pytest yêu cầu tên phương pháp thử nghiệm phải bắt đầu bằng "Bài kiểm tra.” 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ệ
test_login.py - valid login_test.py - valid testlogin.py -invalid logintest.py -invalid
Lưu ý: Có, chúng tôi có thể yêu cầu pytest chọn testlogin.py và logintest.py một cách rõ ràng
Xem một số ví dụ về phương pháp thử nghiệm pytest hợp lệ và không hợp lệ
def test_file1_method1(): - valid def testfile1_method1(): - valid def file1_method1(): - invalid
Lưu ý: 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 chúng ta có file test_sample1.py. Giả sử chúng ta có nhiều tệp, chẳng hạn như test_sample2.py, test_sample3.py. Để chạy tất cả các thử nghiệm 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
Thao tác này sẽ chạy tất 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 đó.
Để chỉ chạy thử nghiệm từ một tệp cụ thể, chúng tôi có thể sử dụng py.test
py.test test_sample1.py
Chạy một tập hợp con của Toàn bộ bài kiểm tra 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 điều đó theo 2 cách
- Nhóm các tên kiểm tra 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 mã bên dưới vào đó
def test_file2_method1(): x=5 y=6 assert x+1 == y,"test failed" assert x == y,"test failed because x=" + str(x) + " y=" + str(y) def test_file2_method2(): x=5 y=6 assert x+1 == y,"test failed"
Vì vậy hiện tại chúng tôi có
• test_sample1.py • test_file1_method1() • test_file1_method2() • test_sample2.py • test_file2_method1() • test_file2_method2()
Tùy chọn 1) Chạy thử nghiệm bằng cách khớp chuỗi con
Ở đây để chạy tất cả các thử nghiệm có tên phương thức 1, chúng ta phải chạy
py.test -k method1 -v -k <expression> is used to represent the substring to match -v increases the verbosity
Vì vậy, chạy py.test -k method1 -v sẽ cung cấp cho bạn kết quả sau
test_sample2.py::test_file2_method1 FAILED test_sample1.py::test_file1_method1 FAILED ============================================== FAILURES ============================================== _________________________________________ test_file2_method1 _________________________________________ def test_file2_method1(): x=5 y=6 assert x+1 == y,"test failed" > assert x == y,"test failed because x=" + str(x) + " y=" + str(y) E AssertionError: test failed because x=5 y=6 E assert 5 == 6 test_sample2.py:5: AssertionError _________________________________________ test_file1_method1 _________________________________________ @pytest.mark.only def test_file1_method1(): x=5 y=6 assert x+1 == y,"test failed" > assert x == y,"test failed because x=" + str(x) + " y=" + str(y) E AssertionError: test failed because x=5 y=6 E assert 5 == 6 test_sample1.py:8: AssertionError ================================= 2 tests deselected by '-kmethod1' ================================== =============================== 2 failed, 2 deselected in 0.02 seconds ===============================
Ở đây bạn có thể thấy về phía 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 nhiều kết hợp khác nhau như: -
py.test -k method -v - will run all the four methods py.test -k methods -v – will not run any test as there is no test name matches the substring 'methods'
Tùy chọn 2) Chạy thử nghiệm theo đ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 pháp thử nghiệm bằng cách sử dụng các điểm đánh dấu pytest, @pytest.mark . Để sử dụng các điểm đánh dấu trong tệp thử nghiệm, chúng ta cần nhập pytest vào tệp thử nghiệm.
Ở đây chúng ta sẽ áp dụng các tên điểm đánh dấu khác nhau cho các phương pháp kiểm tra và chạy thử nghiệm cụ thể dựa trên tên điểm đánh dấu. Chúng ta có thể xác định các điểm đánh dấu trên mỗi tên bài kiểm tra bằng cách sử dụng
@pytest.mark.<name>.
Chúng tôi đang định nghĩa các điểm đánh dấu set1 và set2 trên các phương pháp thử nghiệm và chúng tôi sẽ chạy thử nghiệm bằng cách sử dụng các tên điểm đánh dấu. Cập nhật các tệp thử nghiệm bằng mã sau
test_sample1.py
import pytest @pytest.mark.set1 def test_file1_method1(): x=5 y=6 assert x+1 == y,"test failed" assert x == y,"test failed because x=" + str(x) + " y=" + str(y) @pytest.mark.set2 def test_file1_method2(): x=5 y=6 assert x+1 == y,"test failed"
test_sample2.py
import pytest @pytest.mark.set1 def test_file2_method1(): x=5 y=6 assert x+1 == y,"test failed" assert x == y,"test failed because x=" + str(x) + " y=" + str(y) @pytest.mark.set1 def test_file2_method2(): x=5 y=6 assert x+1 == y,"test failed"
Chúng tôi có thể chạy thử nghiệm được đánh dấu bằng cách
py.test -m <name> -m <name> mentions the marker name
Chạy py.test -m set1. Thao tác 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ộ thử nghiệm sẽ có nhiều tệp thử nghiệm và hàng trăm phương thức thử nghiệm sẽ mất một khoảng thời gian đáng kể để thực thi. Pytest cho phép chúng ta 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
pip install pytest-xdist
Bạn có thể chạy thử nghiệm ngay bây giờ bằng cách
py.test -n 4
-N chạy thử nghiệm bằng cách sử dụng nhiều công nhân. Ở lệnh trên sẽ có 4 công nhân chạy thử.
Lịch thi đấu Pytest
Fixtures được sử dụng khi chúng ta muốn chạy một số code trước mỗi phương pháp test. Vì vậy, thay vì lặp lại cùng một đoạn mã trong mọi thử nghiệm, chúng tôi xác định lịch thi đấu. Thông thường, đồ đạc được sử dụng để khởi tạo các kết nối cơ sở dữ liệu, truyền base, 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
@pytest.fixture
Phương pháp thử nghiệm có thể sử dụng thiết bị cố định Pytest bằng cách đề cập đến thiết bị cố định làm thông số đầu vào.
Tạo một tệp mới test_basic_fixture.py với mã sau
import pytest @pytest.fixture def supply_AA_BB_CC(): aa=25 bb =35 cc=45 return [aa,bb,cc] def test_comparewithAA(supply_AA_BB_CC): zz=35 assert supply_AA_BB_CC[0]==zz,"aa and zz comparison failed" def test_comparewithBB(supply_AA_BB_CC): zz=35 assert supply_AA_BB_CC[1]==zz,"bb and zz comparison failed" def test_comparewithCC(supply_AA_BB_CC): zz=35 assert supply_AA_BB_CC[2]==zz,"cc and zz comparison failed"
Đây
- Chúng tôi có một vật cố định có 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 thử nghiệm so sánh với từng giá trị.
Mỗi hàm kiểm tra có một đối số đầu vào có tên khớp với một lịch thi đấu có sẵn. Pytest sau đó gọi phương thức cố định tương ứng và các giá trị 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ờ hãy chạy thử và xem kết quả
py.test test_basic_fixture
test_basic_fixture.py::test_comparewithAA FAILED test_basic_fixture.py::test_comparewithBB PASSED test_basic_fixture.py::test_comparewithCC FAILED ============================================== FAILURES ============================================== _________________________________________ test_comparewithAA _________________________________________ supply_AA_BB_CC = [25, 35, 45] def test_comparewithAA(supply_AA_BB_CC): zz=35 > assert supply_AA_BB_CC[0]==zz,"aa and zz comparison failed" E AssertionError: aa and zz comparison failed E assert 25 == 35 test_basic_fixture.py:10: AssertionError _________________________________________ test_comparewithCC _________________________________________ supply_AA_BB_CC = [25, 35, 45] def test_comparewithCC(supply_AA_BB_CC): zz=35 > assert supply_AA_BB_CC[2]==zz,"cc and zz comparison failed" E AssertionError: cc and zz comparison failed E assert 45 == 35 test_basic_fixture.py:16: AssertionError ================================= 2 failed, 1 passed in 0.05 seconds =================================
Bài kiểm tra test_comparewithBB đã đạt vì zz=BB=35 và 2 bài kiểm tra còn lại đều thất bại.
Phương thức cố định chỉ có phạm vi trong tệp thử nghiệm đượ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 thông báo lịch thi đấu không tìm thấy 'supply_AA_BB_CC' cho các phương pháp thử nghiệm trong các tập tin khác.
Để sử dụng cùng một bản cố định cho nhiều tệp thử nghiệm, chúng tôi sẽ tạo các phương thức cố định trong một tệp có tên conftest.py.
Chúng ta hãy xem ví dụ PyTest bên dưới. Tạo 3 tệp conftest.py, test_basic_fixture.py, test_basic_fixture2.py với mã sau
conftest.py
import pytest @pytest.fixture def supply_AA_BB_CC(): aa=25 bb =35 cc=45 return [aa,bb,cc]
test_basic_fixture.py
import pytest def test_comparewithAA(supply_AA_BB_CC): zz=35 assert supply_AA_BB_CC[0]==zz,"aa and zz comparison failed" def test_comparewithBB(supply_AA_BB_CC): zz=35 assert supply_AA_BB_CC[1]==zz,"bb and zz comparison failed" def test_comparewithCC(supply_AA_BB_CC): zz=35 assert supply_AA_BB_CC[2]==zz,"cc and zz comparison failed"
test_basic_fixture2.py
import pytest def test_comparewithAA_file2(supply_AA_BB_CC): zz=25 assert supply_AA_BB_CC[0]==zz,"aa and zz comparison failed" def test_comparewithBB_file2(supply_AA_BB_CC): zz=25 assert supply_AA_BB_CC[1]==zz,"bb and zz comparison failed" def test_comparewithCC_file2(supply_AA_BB_CC): zz=25 assert supply_AA_BB_CC[2]==zz,"cc and zz comparison failed"
pytest sẽ tìm phần cố định 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
test_basic_fixture.py::test_comparewithAA FAILED test_basic_fixture.py::test_comparewithBB PASSED test_basic_fixture.py::test_comparewithCC FAILED test_basic_fixture2.py::test_comparewithAA_file2 PASSED test_basic_fixture2.py::test_comparewithBB_file2 FAILED test_basic_fixture2.py::test_comparewithCC_file2 FAILED
Kiểm tra tham số Pytest
Mục đích của việc tham số hóa một bài kiểm tra là chạy thử nghiệm dựa trên nhiều bộ đối số. Chúng tôi có thể thực hiện việc này bằng @pytest.mark.parametrize.
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 thử nghiệm. 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 mã bên dưới
import pytest @pytest.mark.parametrize("input1, input2, output",[(5,5,10),(3,5,12)]) def test_add(input1, input2, output): assert input1+input2 == output,"failed"
Ở đây phương pháp kiểm tra chấp nhận 3 đối số - input1, input2, output. Nó thêm input1 và input2 và so sánh với đầu ra.
Hãy chạy thử nghiệm bằng py.test -k test_add -v và xem kết quả
test_addition.py::test_add[5-5-10] PASSED test_addition.py::test_add[3-5-12] FAILED ============================================== FAILURES ============================================== __________________________________________ test_add[3-5-12] __________________________________________ input1 = 3, input2 = 5, output = 12 @pytest.mark.parametrize("input1, input2, output",[(5,5,10),(3,5,12)]) def test_add(input1, input2, output): > assert input1+input2 == output,"failed" E AssertionError: failed E assert (3 + 5) == 12 test_addition.py:5: AssertionError
Bạn có thể thấy các bài kiểm tra được 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] ĐÃ ĐẠT
test_addition.py::test_add[3-5-12] KHÔNG THÀNH CÔNG
Pytest Xfail/Bỏ qua kiểm tra
Sẽ có một số tình huống mà chúng ta không muốn thực hiện kiểm thử hoặc trường hợp thử nghiệm không liên quan đến 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 test hoặc bỏ qua các bài kiểm tra
Kiểm thử xfailed sẽ được thực hiện, nhưng nó sẽ không được tính là một phần kiểm thử thất bại hoặc đạt. Sẽ không có dấu vết nào được hiển thị nếu thử nghiệm đó thất bại. Chúng tôi có thể kiểm tra thất bại bằng cách sử dụng
@pytest.mark.xfail.
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 ta có thể bỏ qua các bài kiểm tra bằng cách sử dụng
@pytest.mark.skip.
Chỉnh sửa test_addition.py bằng mã bên dưới
import pytest @pytest.mark.skip def test_add_1(): assert 100+200 == 400,"failed" @pytest.mark.skip def test_add_2(): assert 100+200 == 300,"failed" @pytest.mark.xfail def test_add_3(): assert 15+13 == 28,"failed" @pytest.mark.xfail def test_add_4(): assert 15+13 == 100,"failed" def test_add_5(): assert 3+2 == 5,"failed" def test_add_6(): assert 3+2 == 6,"failed"
Đâ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 không thành công. Các thử nghiệm này sẽ được thực thi và sẽ là một phần của các thử nghiệm xfailed(khi thử nghiệm thất bại) hoặc xpassed(khi thử nghiệm đạt). Sẽ không có bất kỳ dấu vết nào cho những thất bại.
- test_add_5 và test_add_6 sẽ được thực thi và test_add_6 sẽ báo cá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.test test_addition.py -v và xem kết quả
test_addition.py::test_add_1 SKIPPED test_addition.py::test_add_2 SKIPPED test_addition.py::test_add_3 XPASS test_addition.py::test_add_4 xfail test_addition.py::test_add_5 PASSED test_addition.py::test_add_6 FAILED ============================================== FAILURES ============================================== _____________________________________________ test_add_6 _____________________________________________ def test_add_6(): > assert 3+2 == 6,"failed" E AssertionError: failed E assert (3 + 2) == 6 test_addition.py:24: AssertionError ================ 1 failed, 1 passed, 2 skipped, 1 xfailed, 1 xpassed in 0.07 seconds =================
XML kết quả
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.test test_sample1.py -v –junitxml=”result.xml”
result.xml sẽ ghi lại kết quả thực hiện kiểm tra. Tìm một tệp result.xml mẫu bên dưới
<?xml version="1.0" encoding="UTF-8"?> <testsuite errors="0" failures="1" name="pytest" skips="0" tests="2" time="0.046"> <testcase classname="test_sample1" file="test_sample1.py" line="3" name="test_file1_method1" time="0.001384973526"> <failure message="AssertionError:test failed because x=5 y=6 assert 5 ==6"> @pytest.mark.set1 def test_file1_method1(): x=5 y=6 assert x+1 == y,"test failed" > assert x == y,"test failed because x=" + str(x) + " y=" + str(y) E AssertionError: test failed because x=5 y=6 E assert 5 == 6 test_sample1.py:9: AssertionError </failure> </testcase> <testcase classname="test_sample1" file="test_sample1.py" line="10" name="test_file1_method2" time="0.000830173492432" /> </testsuite>
Từ chúng ta có thể thấy tổng cộng hai bài kiểm tra trong đó một bài bị lỗi. Bên dưới bạn có thể thấy thông tin chi tiết về từng bài kiểm tra đã thực hiện trong nhãn.
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://reqres.in/. Trang web này chỉ nhằm mục đích cung cấp API có thể kiểm tra được. Trang web này không lưu trữ dữ liệu của chúng tôi.
Ở đây chúng tôi sẽ viết một số bài kiểm tra cho
- liệt kê một số người dùng
- đăng nhập với người dùng
Tạo các tập tin dưới đây với mã được cung cấp
conftest.py – có một công cụ cố định sẽ cung cấp url cơ sở cho tất cả các phương pháp thử nghiệm
import pytest @pytest.fixture def supply_url(): return "https://reqres.in/api"
test_list_user.py – chứa các phương thức kiểm tra để liệt kê người dùng hợp lệ và không hợp lệ
- test_list_valid_user kiểm tra tìm nạp người dùng hợp lệ và xác minh phản hồi
- test_list_invaliduser kiểm tra tìm nạp người dùng không hợp lệ và xác minh phản hồi
import pytest import requests import json @pytest.mark.parametrize("userid, firstname",[(1,"George"),(2,"Janet")]) def test_list_valid_user(supply_url,userid,firstname): url = supply_url + "/users/" + str(userid) resp = requests.get(url) j = json.loads(resp.text) assert resp.status_code == 200, resp.text assert j['data']['id'] == userid, resp.text assert j['data']['first_name'] == firstname, resp.text def test_list_invaliduser(supply_url): url = supply_url + "/users/50" resp = requests.get(url) assert resp.status_code == 404, resp.text
test_login_user.py – chứa các phương thức thử nghiệm để kiểm tra chức năng đăng nhập.
- test_login_valid kiểm tra nỗ lực đăng nhập hợp lệ bằng email và mật khẩu
- test_login_no_password kiểm tra lần đăng nhập không hợp lệ mà không chuyển mật khẩu
- test_login_no_email kiểm tra nỗ lực đăng nhập không hợp lệ mà không cần cung cấp email.
import pytest import requests import json def test_login_valid(supply_url): url = supply_url + "/login/" data = {'email':'test@test.com','password':'something'} resp = requests.post(url, data=data) j = json.loads(resp.text) assert resp.status_code == 200, resp.text assert j['token'] == "QpwL5tke4Pnpja7X", resp.text def test_login_no_password(supply_url): url = supply_url + "/login/" data = {'email':'test@test.com'} resp = requests.post(url, data=data) j = json.loads(resp.text) assert resp.status_code == 400, resp.text assert j['error'] == "Missing password", resp.text def test_login_no_email(supply_url): url = supply_url + "/login/" data = {} resp = requests.post(url, data=data) j = json.loads(resp.text) assert resp.status_code == 400, resp.text assert j['error'] == "Missing email or username", resp.text
Chạy thử nghiệm bằng py.test -v
Xem kết quả như
test_list_user.py::test_list_valid_user[1-George] PASSED test_list_user.py::test_list_valid_user[2-Janet] PASSED test_list_user.py::test_list_invaliduser PASSED test_login_user.py::test_login_valid PASSED test_login_user.py::test_login_no_password PASSED test_login_user.py::test_login_no_email PASSED
Cập nhật các bài kiểm tra và thử các kết quả đầu ra khác nhau
Tổng kết
Trong hướng dẫn PyTest này, chúng tôi đã đề cập đến
- Cài đặt pytest bằng cách sử dụng cài đặt pip pytest=2.9.1
- Chương trình pytest đơn giản và chạy nó bằng lệnh py.test.
- Các câu lệnh khẳng định, khẳng định x==y, sẽ trả về Đúng hoặc Sai.
- Cách pytest xác định các tệp và phương pháp thử nghiệm.
- Kiểm tra các tập tin bắt đầu bằng kiểm tra_ hoặc kết thúc bằng _kiểm tra
- Phương pháp thử nghiệm bắt đầu bằng thử nghiệm
- Lệnh py.test sẽ chạy tất cả các tệp kiểm tra trong thư mục đó và các thư mục con. Để chạy một tệp cụ thể, chúng ta có thể sử dụng lệnh py.test
- Chạy một tập hợp con các phương pháp thử nghiệm
- Nhóm các tên kiểm tra theo chuỗi conmatching.py.test -k -v sẽ chạy tất cả các bài kiểm tra có trong tên của nó.
- Chạy kiểm tra bằng marker.Đánh dấu kiểm tra bằng @pytest.mark. và chạy thử nghiệm bằng pytest -m để chạy thử nghiệm được đánh dấu là .
- Chạy thử nghiệm song song
- Cài đặt pytest-xdist bằng pip install pytest-xdist
- Chạy thử nghiệm bằng py.test -n NUM trong đó NUM là số lượng công nhân
- Tạo các phương thức cố định để chạy mã trước mỗi lần kiểm tra bằng cách đánh dấu phương thức bằng @pytest.fixture
- Phạm vi của phương thức cố định nằm trong tệp mà nó được xác định.
- Một phương thức cố định có thể được truy cập trên nhiều tệp thử nghiệm bằng cách xác định nó trong tệp conftest.py.
- Một phương thức thử nghiệm có thể truy cập vào một vật cố định Pytest bằng cách sử dụng nó làm đối số đầu vào.
- Kiểm tra tham số hóa để chạy nó với nhiều bộ đầu vào.
@pytest.mark.parametrize(“input1, input2, out”,[(5,5,10),(3,5,12)])
def test_add (đầu vào1, đầu vào2, đầu ra):
khẳng định input1+input2 == đầu ra,”không thành công”
sẽ chạy thử nghiệm với đầu vào (5,5,10) và (3,5,12) - Bỏ qua/xfail kiểm tra bằng cách sử dụng @pytets.mark.skip và @pytest.mark.xfail
- Tạo kết quả kiểm tra theo định dạng XML bao gồm các chi tiết kiểm tra đã thực hiện bằng cách sử dụng py.test test_sample1.py -v –junitxml=”result.xml”
- Khung pytest mẫu để kiểm tra API