Đây có phải là cách sử dụng chính xác của conftest.py?
Vâng, đúng vậy. Lịch thi đấu là một tiềm năng và sử dụng phổ biến conftest.py
. Các đồ đạc mà bạn sẽ xác định sẽ được chia sẻ giữa tất cả các bài kiểm tra trong bộ kiểm tra của bạn. Tuy nhiên, việc xác định đồ đạc trong thư mục gốc conftest.py
có thể là vô ích và nó sẽ làm chậm quá trình kiểm tra nếu tất cả các bài kiểm tra đó không được sử dụng.
Nó có công dụng khác không?
Có nó làm.
Lịch thi đấu : Xác định đồ đạc cho dữ liệu tĩnh được sử dụng bởi các bài kiểm tra. Dữ liệu này có thể được truy cập bởi tất cả các thử nghiệm trong bộ trừ khi được quy định khác. Đây có thể là dữ liệu cũng như người trợ giúp của các mô-đun sẽ được chuyển đến tất cả các thử nghiệm.
Tải plugin bên ngoài : conftest.py
được sử dụng để nhập các plugin hoặc mô-đun bên ngoài. Bằng cách xác định biến toàn cục sau, pytest sẽ tải mô-đun và làm cho nó có sẵn để thử nghiệm. Plugin thường là các tệp được xác định trong dự án của bạn hoặc các mô-đun khác có thể cần thiết trong các thử nghiệm của bạn. Bạn cũng có thể tải một tập các plugin được xác định trước như được giải thích ở đây .
pytest_plugins = "someapp.someplugin"
Móc : Bạn có thể chỉ định các móc như phương pháp thiết lập và phá bỏ và nhiều hơn nữa để cải thiện các thử nghiệm của bạn. Đối với một bộ móc có sẵn, đọc ở đây . Thí dụ:
def pytest_runtest_setup(item):
""" called before ``pytest_runtest_call(item). """
#do some stuff`
Kiểm tra đường dẫn gốc : Đây là một chút tính năng ẩn. Bằng cách xác định conftest.py
trong đường dẫn gốc của bạn, bạn sẽ pytest
nhận ra các mô-đun ứng dụng của mình mà không chỉ định PYTHONPATH
. Trong nền, py.test sửa đổi của bạn sys.path
bằng cách bao gồm tất cả các mô hình con được tìm thấy từ đường dẫn gốc.
Tôi có thể có nhiều hơn một tập tin conftest.py không?
Có, bạn có thể và rất khuyến khích nếu cấu trúc kiểm tra của bạn hơi phức tạp. conftest.py
tập tin có phạm vi thư mục. Do đó, tạo đồ đạc mục tiêu và người trợ giúp là thực hành tốt.
Khi nào tôi muốn làm điều đó? Ví dụ sẽ được đánh giá cao.
Một số trường hợp có thể phù hợp:
Tạo một bộ công cụ hoặc móc cho một nhóm thử nghiệm cụ thể.
root / mod / conftest.py
def pytest_runtest_setup(item):
print("I am mod")
#do some stuff
test root/mod2/test.py will NOT produce "I am mod"
Đang tải một bộ đồ đạc cho một số bài kiểm tra nhưng không cho các bài kiểm tra khác.
root / mod / conftest.py
@pytest.fixture()
def fixture():
return "some stuff"
root / mod2 / conftest.py
@pytest.fixture()
def fixture():
return "some other stuff"
root / mod2 / test.py
def test(fixture):
print(fixture)
Sẽ in "một số thứ khác".
Móc ghi đè thừa kế từ gốc conftest.py
.
root / mod / conftest.py
def pytest_runtest_setup(item):
print("I am mod")
#do some stuff
root / conftest.py
def pytest_runtest_setup(item):
print("I am root")
#do some stuff
Bằng cách chạy bất kỳ thử nghiệm nào bên trong root/mod
, chỉ có "Tôi là mod" được in.
Bạn có thể đọc thêm về conftest.py
đây .
BIÊN TẬP:
Điều gì sẽ xảy ra nếu tôi cần các hàm trợ giúp cũ đơn giản được gọi từ một số thử nghiệm trong các mô-đun khác nhau - chúng có sẵn cho tôi nếu tôi đặt chúng trong một conftest.py không? Hoặc tôi chỉ nên đặt chúng trong một mô-đun trợ giúp và nhập và sử dụng nó trong các mô-đun thử nghiệm của mình?
Bạn có thể sử dụng conftest.py
để xác định người trợ giúp của bạn. Tuy nhiên, bạn nên làm theo thông lệ. Người trợ giúp có thể được sử dụng như đồ đạc ít nhất trong pytest
. Ví dụ, trong các thử nghiệm của tôi, tôi có một người trợ giúp giả mà tôi tiêm vào các thử nghiệm của mình theo cách này.
root / helper / redis / redis.py
@pytest.fixture
def mock_redis():
return MockRedis()
root / tests / Stuff / conftest.py
pytest_plugin="helper.redis.redis"
root / tests / Stuff / test.py
def test(mock_redis):
print(mock_redis.get('stuff'))
Đây sẽ là một mô-đun thử nghiệm mà bạn có thể tự do nhập vào các thử nghiệm của mình. LƯU Ý rằng bạn có khả năng có thể đặt tên redis.py
như conftest.py
thể mô-đun của bạn redis
chứa nhiều bài kiểm tra hơn. Tuy nhiên, thực tế đó không được khuyến khích vì sự mơ hồ.
Nếu bạn muốn sử dụng conftest.py
, bạn chỉ cần đặt người trợ giúp đó vào thư mục gốc của mình conftest.py
và tiêm nó khi cần.
root / tests / conftest.py
@pytest.fixture
def mock_redis():
return MockRedis()
root / tests / Stuff / test.py
def test(mock_redis):
print(mock_redis.get(stuff))
Một điều khác bạn có thể làm là viết một plugin có thể cài đặt. Trong trường hợp đó, người trợ giúp của bạn có thể được viết ở bất cứ đâu nhưng nó cần xác định một điểm vào sẽ được cài đặt trong các khung kiểm tra tiềm năng khác của bạn. Xem này .
Nếu bạn không muốn sử dụng đồ đạc, tất nhiên bạn có thể xác định một người trợ giúp đơn giản và chỉ cần sử dụng nhập cũ đơn giản bất cứ nơi nào cần thiết.
root / tests / helper / redis.py
class MockRedis():
# stuff
root / tests / Stuff / test.py
from helper.redis import MockRedis
def test():
print(MockRedis().get(stuff))
Tuy nhiên, ở đây bạn có thể gặp vấn đề với đường dẫn vì mô-đun không nằm trong thư mục con của bài kiểm tra. Bạn sẽ có thể khắc phục điều này (không được kiểm tra) bằng cách thêm một __init__.py
người trợ giúp của bạn
root / tests / helper / __ init__.py
from .redis import MockRedis
Hoặc đơn giản là thêm mô-đun trợ giúp vào PYTHONPATH
.
It seems great. However, I feel the documentation could be better.