Hacktoberfest 2026: những issue maintainer đã đánh dấu cho tháng Mười, đang mở và phù hợp người mới. Xem issue Hacktoberfest

Would you find it useful if you could reliably fail tests that have unawaited coroutines?

Đang mở
#67 5 bình luận 21 reaction 0 người được giao Xem trên GitHub

Maintainer thường phản hồi trong vòng 1 ngày

Chưa có ai nhận issue này.

Đánh giá

Độ khó
5/5
Thời gian dự kiến
Hơn một tuần
Mức phù hợp với người mới
20/100
Loại issue
Tính năng
Độ rõ ràng
Cần làm rõ
Mức độ hoạt động
Đình trệ
Công nghệ
python
Lĩnh vực
testing

Hướng nghiên cứu

Bắt đầu với ví dụ về coroutine chưa được await sử dụng pytest.mark.asyncio và test_something_broken, sau đó xem xét các API được đề xuất sys.set_unawaited_coroutine_tracking và sys.get_and_clear_unawaited_coroutines. Issue không xác định các tệp triển khai hoặc các bài kiểm thử, và việc hoàn thành phụ thuộc vào một Python API mới mà thiết kế vẫn còn mang tính giả định.

Do mô hình lập chỉ mục viết ra từ nội dung của issue.

Mô tả

Right now, this test passes:

async def do_something_broken():
    assert False

@pytest.mark.asyncio
async def test_something_broken():
    do_something_broken()

The reason is that we forgot the await in test_something_broken, so the broken code never actually ran. Oops. Python does issue a RuntimeWarning: coroutine 'do_something_broken' was never awaited, and recent pytest will print this at the end of tests, but this has a few issues:

  • if your CI is green then how often do you click through to check for non-fatal warnings?
  • since the warning isn't issued until the coroutine is garbage collected, on PyPy this can happen in some random other test, or if the test is near the end of the run it might never happen at all. E.g. with latest pypy3, pytest, and pytest-asyncio, the above test doesn't issue any warnings at all:
============================= test session starts ==============================
platform linux -- Python 3.5.3[pypy-5.8.0-beta], pytest-3.2.2, py-1.4.34, pluggy-0.4.0
rootdir: /tmp, inifile:
plugins: cov-2.5.1, catchlog-1.2.2, asyncio-0.7.0
collected 1 item                                                                

../../tmp/test.py .

=========================== 1 passed in 0.02 seconds ===========================

I'm considering proposing a new feature for Python 3.7, that would make it so pytest-asyncio could do:

# Ask Python to start maintaining a list of unawaited coroutines
sys.set_unawaited_coroutine_tracking(True)
try:
    ... run the test ...
finally:
    # Get the unawaited coroutines
    unawaited_coroutines = sys.get_and_clear_unawaited_coroutines()
    sys.set_unawaited_coroutine_tracking(False)
    if unawaited_coroutines:
        # Issue an error that points to the actual problem
        raise RuntimeError(f"Unawaited coroutines: {unawaited_coroutines}")

(Names etc. to be bikeshedded later; this is "API 2" in https://github.com/python-trio/trio/issues/79#issuecomment-325188030)

This way you could deterministically detect unawaited coroutines, reliably attribute them to the correct test, and cause it to fail with a useful error message.

Is this an API that you'd want to take advantage of if it were available?

Ngôn ngữ chính
Python
Star
1.7k
Fork
207
Merge trung bình
5 giờ 2 phút
Pull request đã merge (30 ngày)
11

Chuẩn bị môi trường

Chúng tôi chưa kiểm tra các tệp thiết lập môi trường của dự án này. Hãy bắt đầu từ README và xem hướng dẫn đóng góp lần đầu của chúng tôi để biết các bước chung.

Bắt đầu từ đâu

  1. Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
  2. Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
  3. Fork repository và làm thay đổi trên một nhánh.
  4. Mở pull request có tham chiếu số hiệu của issue.

Issue khác của pytest-dev/pytest-asyncio

Tất cả issue của pytest-dev/pytest-asyncio

Issue tương tự

Thêm issue về Python

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.