Có cách nào để xác định các thử nghiệm pytest nào sẽ chạy từ một tệp không?


190

Có cách nào để chọn pytestkiểm tra để chạy từ một tập tin? Ví dụ: một tệp foo.txtchứa danh sách các bài kiểm tra sẽ được thực hiện:

tests_directory/foo.py::test_001
tests_directory/bar.py::test_some_other_test

Hoặc, có cách nào để chọn nhiều bài kiểm tra, không có mẫu chung trong tên kiểm tra, từ các thư mục khác nhau với pytest không?

pytest -k <pattern> cho phép một mô hình duy nhất.

Một lựa chọn là phải pytest.markchống lại từng thử nghiệm, nhưng yêu cầu của tôi là chạy các kết hợp thử nghiệm khác nhau từ các tệp khác nhau.

Có cách nào để chỉ định nhiều mẫu và tên tệp thử nghiệm cho mỗi mẫu không?

Hoặc là

Có cách nào để xác định đường dẫn kiểm tra chính xác trong một tệp và cung cấp tệp đó làm đầu vào pytestkhông?

Hoặc là

Có một chức năng móc có thể được sử dụng cho mục đích này?

Câu trả lời:


231

Bạn có thể sử dụng -ktùy chọn để chạy các trường hợp thử nghiệm với các mẫu khác nhau:

py.test tests_directory/foo.py tests_directory/bar.py -k 'test_001 or test_some_other_test'

Điều này sẽ chạy các trường hợp thử nghiệm với tên test_001test_some_other_test bỏ chọn phần còn lại của các trường hợp thử nghiệm.

Lưu ý: Điều này sẽ chọn bất kỳ trường hợp thử nghiệm nào bắt đầu bằng test_001 hoặc test_some_other_test . Ví dụ: nếu bạn có test case test_0012 thì nó cũng sẽ được chọn.


1
Cảm ơn. Nhưng nếu có một bài kiểm tra có cùng tên trong foo.py và bar.py (giả sử test_001), thì nó sẽ kết thúc thực thi từ cả hai.
Sharad

2
đúng vậy, bất cứ điều gì phù hợp với mô hình sẽ được thực thi như tôi đã đề cập trong Ghi chú
supamaze

Nhưng đó là một vấn đề đối với tôi. Tôi muốn chọn kiểm tra để thực hiện từ tập tin nào.
Sharad

@NamGVU `-k <tên phương thức thử nghiệm>`
supamaze

4
Nó nên làpy.test path/to/test/file.py -k function_name_test
LittleZero

91

Chỉ định kiểm tra / chọn kiểm tra

Pytest hỗ trợ một số cách để chạy và chọn kiểm tra từ dòng lệnh.

Chạy thử nghiệm trong một mô-đun

pytest test_mod.py

Chạy thử nghiệm trong một thư mục

pytest testing/

Chạy thử nghiệm bằng biểu thức từ khóa

pytest -k "MyClass and not method"

Điều này sẽ chạy các kiểm tra có chứa các tên khớp với biểu thức chuỗi đã cho, có thể bao gồm các toán tử Python sử dụng tên tệp, tên lớp và tên hàm làm biến. Ví dụ trên sẽ chạy TestMyClass.test_somethingnhưng không TestMyClass.test_method_simple.

Chạy thử nghiệm bằng id nút

Mỗi thử nghiệm được thu thập được gán một duy nhất nodeidbao gồm tên tệp mô-đun, theo sau là các chỉ định như tên lớp, tên hàm và tham số từ tham số, được phân tách bằng:: ký tự.

Để chạy thử nghiệm cụ thể trong một mô-đun:

pytest test_mod.py::test_func

Một ví dụ khác chỉ định một phương thức thử nghiệm trong dòng lệnh:

pytest test_mod.py::TestClass::test_method

Chạy thử nghiệm bằng các biểu thức đánh dấu

pytest -m slow

Sẽ chạy tất cả các bài kiểm tra được trang trí với @pytest.mark.slowtrang trí.

Để biết thêm thông tin xem nhãn hiệu .

Chạy thử nghiệm từ các gói

pytest --pyargs pkg.testing

Điều này sẽ nhập pkg.testingvà sử dụng vị trí hệ thống tập tin của nó để tìm và chạy thử nghiệm từ đó.

Nguồn: https://docs.pytest.org/en/latest/usage.html#specifying-tests-selecting-tests


test_mod.py::TestClass::test_method hoạt động tốt nhất với tôi
StephenGodderidge

1
nên đánh dấu điều này là anser được chấp nhận
Adam Hughes

13

Nếu bạn có cùng tên phương thức trong hai lớp khác nhau và bạn chỉ muốn chạy một trong số chúng, thì điều này hoạt động:

pytest tests.py -k 'TestClassName and test_method_name'

6

Phương pháp 1 : Các xét nghiệm được chọn ngẫu nhiên. Dài và xấu.

python -m pytest test/stress/test_performance.py::TestPerformance::test_continuous_trigger test/integration/test_config.py::TestConfig::test_valid_config

Phương pháp 2: Sử dụng biểu thức từ khóa.

Lưu ý: Tôi đang tìm kiếm theo tên testcase. Tương tự được áp dụng cho tên TestClass.

Trường hợp 1: Dưới đây sẽ chạy bất cứ điều gì được tìm thấy. Vì chúng tôi đã sử dụng 'HOẶC'.

python -m pytest -k 'test_password_valid or test_no_configuration'

Hãy nói rằng hai điều trên là thực sự chính xác, 2 bài kiểm tra sẽ được chạy.

Trường hợp 2: Bây giờ một tên không chính xác và một tên chính xác khác.

python -m pytest -k 'test_password_validzzzzzz or test_no_configuration' 

Chỉ có một được tìm thấy và chạy.

Trường hợp 3 : Nếu bạn muốn tất cả các bài kiểm tra chạy hoặc không có ai, thì hãy sử dụng AND

python -m pytest -k 'test_password_valid and test_no_configuration'

Cả hai sẽ được chạy nếu đúng hoặc không có.

Trường hợp 4: Chỉ chạy thử trong một thư mục:

python -m pytest test/project1/integration -k 'test_password_valid or test_no_configuration'

Trường hợp 5: Chạy thử nghiệm chỉ từ một tệp.

python -m pytest test/integration/test_authentication.py -k 'test_password_expiry or test_incorrect_password'

Trường hợp 6: Chạy tất cả các bài kiểm tra ngoại trừ trận đấu.

python -m pytest test/integration/test_authentication.py -k 'not  test_incorrect_password'

1

Theo tài liệu về Run tests by id id

vì bạn có tất cả các id nút trong foo.txt, chỉ cần chạy

pytest `cat foo.txt | tr '\n' ' '`

Điều này giống với lệnh bên dưới (với nội dung tệp trong câu hỏi)

pytest tests_directory/foo.py::test_001 tests_directory/bar.py::test_some_other_test

1

Câu trả lời của tôi cung cấp một cách để chạy một tập hợp con kiểm tra trong các tình huống khác nhau.

Chạy tất cả các thử nghiệm trong một dự án

pytest

Chạy thử nghiệm trong một thư mục

Để chạy tất cả các bài kiểm tra từ một thư mục, hãy sử dụng thư mục làm tham số pytest:

pytest tests/my-directory

Chạy thử nghiệm trong một tệp / mô-đun thử nghiệm duy nhất

Để chạy một tệp đầy các bài kiểm tra, hãy liệt kê tệp có đường dẫn tương đối làm tham số pytest:

pytest tests/my-directory/test_demo.py

Chạy một chức năng kiểm tra duy nhất

Để chạy một chức năng kiểm tra, hãy thêm ::và tên chức năng kiểm tra:

pytest -v tests/my-directory/test_demo.py::test_specific_function

-v được sử dụng để bạn có thể thấy chức năng nào đã được chạy.

Chạy một lớp kiểm tra duy nhất

Để chỉ chạy một lớp, hãy làm như chúng ta đã làm với các hàm và thêm ::, sau đó tên lớp vào tham số tệp:

pytest -v tests/my-directory/test_demo.py::TestClassName

Chạy một phương thức kiểm tra đơn của một lớp kiểm tra

Nếu bạn không muốn chạy tất cả một lớp kiểm tra, chỉ cần một phương thức, chỉ cần thêm một tên khác ::và tên phương thức:

pytest -v tests/my-directory/test_demo.py::TestClassName::test_specific_method

Chạy một bộ thử nghiệm dựa trên tên thử nghiệm

Các -ktùy chọn cho phép bạn vượt qua trong một biểu thức để chạy thử nghiệm có tên nhất định theo quy định của các biểu hiện như một chuỗi con của tên thử nghiệm. Có thể sử dụng , hoặc , không tạo các biểu thức phức tạp.

Ví dụ: để chạy tất cả các hàm có _raise trong tên của chúng:

pytest -v -k _raises

0

Có thể sử dụng pytest_collect_file()hook, bạn có thể phân tích nội dung của tệp .txto .yamltrong đó các bài kiểm tra được chỉ định như bạn muốn và đưa chúng trở lại lõi pytest.

Một ví dụ đẹp được hiển thị trong tài liệu pytest . Tôi nghĩ những gì bạn đang tìm kiếm.


0

Đây là một câu trả lời một phần có thể, bởi vì nó chỉ cho phép chọn các tập lệnh kiểm tra, không phải các bài kiểm tra riêng lẻ trong các tập lệnh đó.

Và nó cũng bị hạn chế bởi việc tôi sử dụng chế độ tương thích kế thừa so với unittestcác tập lệnh, vì vậy không đảm bảo nó sẽ hoạt động với pytest riêng.

Đây là:

  1. tạo ra một chế độ độc tài mới, nói subset_tests_directory.
  2. ln -s tests_directory/foo.py
  3. ln -s tests_directory/bar.py

  4. hãy cẩn thận về việc nhập mà ngầm giả định các tập tin đang ở test_directory. Tôi đã phải sửa một vài trong số đó bằng cách chạy python foo.py, từ bên trong subset_tests_directoryvà sửa nếu cần.

  5. Một khi các kịch bản thử nghiệm thực thi chính xác, chỉ cd subset_tests_directorypytestở đó. Pytest sẽ chỉ nhận các kịch bản mà nó nhìn thấy.

Một khả năng khác là symlinking trong thư mục thử nghiệm hiện tại của bạn, nói như ln -s foo.py subset_foo.pysau đó pytest subset*.py. Điều đó sẽ tránh việc phải điều chỉnh nhập khẩu của bạn, nhưng nó sẽ làm lộn xộn mọi thứ cho đến khi bạn loại bỏ các liên kết tượng trưng. Làm việc cho tôi là tốt.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.