Nhập tệp bằng Python [ít nhất là cho đến gần đây] là một quy trình không tầm thường, thường yêu cầu thay đổi. Một số khía cạnh của quy trình nhập có thể được kiểm soát thông qua cờ dòng lệnh
testing/__init__.py testing/test_pkg_under_test.py pkg_under_test/1, cờ này có thể đảm nhận các giá trị này
root/ |- foo/ |- __init__.py |- conftest.py |- bar/ |- __init__.py |- tests/ |- __init__.py |- test_foo.py
0 [mặc định]. đường dẫn thư mục chứa từng mô-đun sẽ được chèn vào phần đầu nếu chưa có ở đó, sau đó được nhập bằng nội trangĐiều này yêu cầu tên mô-đun thử nghiệm phải là duy nhất khi cây thư mục thử nghiệm không được sắp xếp theo gói, vì các mô-đun sẽ đưa vào sau khi nhập
Đây là cơ chế cổ điển, có từ thời Python 2 vẫn còn được hỗ trợ
root/ |- foo/ |- __init__.py |- conftest.py |- bar/ |- __init__.py |- tests/ |- __init__.py |- test_foo.py
4. thư mục chứa từng mô-đun được thêm vào cuối nếu chưa có ở đó và được nhập bằngroot/ |- foo/ |- __init__.py |- conftest.py |- bar/ |- __init__.py |- tests/ |- __init__.py |- test_foo.py
2Điều này tốt hơn cho phép chạy các mô-đun thử nghiệm đối với các phiên bản gói đã cài đặt ngay cả khi gói được thử nghiệm có cùng gốc nhập. Ví dụ
testing/__init__.py testing/test_pkg_under_test.py pkg_under_test/
các thử nghiệm sẽ chạy với phiên bản đã cài đặt của
root/ |- foo/ |- __init__.py |- conftest.py |- bar/ |- __init__.py |- tests/ |- __init__.py |- test_foo.py
7 khiroot/ |- foo/ |- __init__.py |- conftest.py |- bar/ |- __init__.py |- tests/ |- __init__.py |- test_foo.py
8 được sử dụng trong khi vớiroot/ |- foo/ |- __init__.py |- conftest.py |- bar/ |- __init__.py |- tests/ |- __init__.py |- test_foo.py
0, họ sẽ chọn phiên bản cục bộ. Loại nhầm lẫn này là lý do tại sao chúng tôi ủng hộ việc sử dụng bố cụcGiống như
root/ |- foo/ |- __init__.py |- conftest.py |- bar/ |- __init__.py |- tests/ |- __init__.py |- test_foo.py
0, yêu cầu tên module test phải là duy nhất khi cây thư mục test không sắp xếp theo gói, vì module sẽ đưa vào sau khi importpytest root/
2. mới trong pytest-6. 0, chế độ này sử dụng để nhập mô-đun thử nghiệm. Điều này cho phép toàn quyền kiểm soát quá trình nhập và không yêu cầu thay đổiVì lý do này, điều này không yêu cầu tên mô-đun thử nghiệm phải là duy nhất
Tuy nhiên, một nhược điểm là các mô-đun thử nghiệm không thể nhập được lẫn nhau. Ngoài ra, các mô-đun tiện ích trong thư mục kiểm tra không thể nhập tự động vì thư mục kiểm tra không còn được thêm vào
Ban đầu, chúng tôi dự định đặt
pytest root/
2 làm mặc định trong các bản phát hành trong tương lai, tuy nhiên, hiện tại rõ ràng là nó có một số nhược điểm riêng nên mặc định sẽ vẫn làroot/ |- foo/ |- __init__.py |- conftest.py |- bar/ |- __init__.py |- tests/ |- __init__.py |- test_foo.py
0 trong tương lai gần
Xem thêm
biến cấu hình
Kịch bản chế độ nhập root/
|- foo/
|- __init__.py
|- conftest.py
|- bar/
|- __init__.py
|- tests/
|- __init__.py
|- test_foo.py
0 và root/
|- foo/
|- __init__.py
|- conftest.py
|- bar/
|- __init__.py
|- tests/
|- __init__.py
|- test_foo.py
4
Dưới đây là danh sách các tình huống khi sử dụng chế độ nhập
root/ |- foo/ |- __init__.py |- conftest.py |- bar/ |- __init__.py |- tests/ |- __init__.py |- test_foo.py0 hoặc
root/ |- foo/ |- __init__.py |- conftest.py |- bar/ |- __init__.py |- tests/ |- __init__.py |- test_foo.py4 trong đó pytest cần thay đổi
testing/__init__.py testing/test_pkg_under_test.py pkg_under_test/2 để nhập các mô-đun thử nghiệm hoặc tệp
testing/__init__.py testing/test_pkg_under_test.py pkg_under_test/3 và các sự cố mà người dùng có thể gặp phải do điều đó
Kiểm tra mô-đun / tệp testing/__init__.py
testing/test_pkg_under_test.py
pkg_under_test/
3 bên trong gói
Xem xét cách bố trí tệp và thư mục này
root/ |- foo/ |- __init__.py |- conftest.py |- bar/ |- __init__.py |- tests/ |- __init__.py |- test_foo.py
Khi thực hiện
________số 8
pytest sẽ tìm thấy
root/ |- foo/ |- __init__.py |- conftest.py |- bar/ |- __init__.py |- tests/ |- __init__.py |- test_foo.py76 và nhận ra rằng đó là một phần của gói do có một tệp
root/ |- foo/ |- __init__.py |- conftest.py |- bar/ |- __init__.py |- tests/ |- __init__.py |- test_foo.py77 trong cùng một thư mục. Sau đó, nó sẽ tìm kiếm ngược lên cho đến khi có thể tìm thấy thư mục cuối cùng vẫn chứa tệp
root/ |- foo/ |- __init__.py |- conftest.py |- bar/ |- __init__.py |- tests/ |- __init__.py |- test_foo.py77 để tìm thư mục gốc [trong trường hợp này là
root/ |- foo/ |- __init__.py |- conftest.py |- bar/ |- __init__.py |- tests/ |- __init__.py |- test_foo.py79]. Để tải mô-đun, nó sẽ chèn
pytest root/0 vào trước
testing/__init__.py testing/test_pkg_under_test.py pkg_under_test/2 [nếu chưa có] để tải
pytest root/2 dưới dạng mô-đun
pytest root/3
Logic tương tự áp dụng cho tệp
testing/__init__.py testing/test_pkg_under_test.py pkg_under_test/3. nó sẽ được nhập dưới dạng mô-đun
pytest root/5
Giữ nguyên tên gói đầy đủ là rất quan trọng khi các thử nghiệm trực tiếp trong một gói để tránh sự cố và cho phép các mô-đun thử nghiệm có tên trùng lặp. Điều này cũng được thảo luận chi tiết trong
Các mô-đun thử nghiệm độc lập / tệp testing/__init__.py
testing/test_pkg_under_test.py
pkg_under_test/
3
Xem xét cách bố trí tệp và thư mục này
root/ |- foo/ |- __init__.py |- conftest.py |- bar/ |- __init__.py |- tests/ |- __init__.py |- test_foo.py7
Khi thực hiện
________số 8
pytest sẽ tìm thấy
root/ |- foo/ |- __init__.py |- conftest.py |- bar/ |- __init__.py |- tests/ |- __init__.py |- test_foo.py76 và nhận ra rằng nó KHÔNG phải là một phần của gói do không có tệp
root/ |- foo/ |- __init__.py |- conftest.py |- bar/ |- __init__.py |- tests/ |- __init__.py |- test_foo.py77 nào trong cùng một thư mục. Sau đó, nó sẽ thêm
pytest root/9 vào
testing/__init__.py testing/test_pkg_under_test.py pkg_under_test/2 để nhập
pytest root/2 dưới dạng mô-đun
testing/__init__.py testing/test_pkg_under_test.py pkg_under_test/22. Điều tương tự cũng được thực hiện với tệp
testing/__init__.py testing/test_pkg_under_test.py pkg_under_test/3 bằng cách thêm
testing/__init__.py testing/test_pkg_under_test.py pkg_under_test/24 vào
testing/__init__.py testing/test_pkg_under_test.py pkg_under_test/2 để nhập dưới dạng
testing/__init__.py testing/test_pkg_under_test.py pkg_under_test/26
Vì lý do này, bố cục này không thể có các mô-đun thử nghiệm có cùng tên, vì tất cả chúng sẽ được nhập vào không gian tên nhập chung
Điều này cũng được thảo luận chi tiết trong
Gọi testing/__init__.py
testing/test_pkg_under_test.py
pkg_under_test/
27 so với testing/__init__.py
testing/test_pkg_under_test.py
pkg_under_test/
28
Chạy pytest với
testing/__init__.py testing/test_pkg_under_test.py pkg_under_test/29 thay vì
root/ |- foo/ |- __init__.py |- conftest.py |- bar/ |- __init__.py |- tests/ |- __init__.py |- test_foo.py70 mang lại hành vi gần như tương đương, ngoại trừ việc cái sau sẽ thêm thư mục hiện tại vào
testing/__init__.py testing/test_pkg_under_test.py pkg_under_test/2, đây là hành vi tiêu chuẩn của
root/ |- foo/ |- __init__.py |- conftest.py |- bar/ |- __init__.py |- tests/ |- __init__.py |- test_foo.py72