Làm cách nào tôi có thể thấy đầu ra in bình thường được tạo trong quá trình chạy pytest?


400

Đôi khi tôi muốn chỉ cần chèn một số câu lệnh in trong mã của mình và xem những gì được in ra khi tôi thực hiện nó. Cách thông thường của tôi để "tập thể dục" là với các xét nghiệm pytest hiện có. Nhưng khi tôi chạy những thứ này, tôi dường như không thể thấy bất kỳ đầu ra tiêu chuẩn nào (ít nhất là từ trong PyCharm, IDE của tôi).

Có cách nào đơn giản để xem đầu ra tiêu chuẩn trong quá trình chạy pytest không?


Chỉ thất bại hay luôn?

17
-s vô hiệu hóa tính năng chụp mỗi lần kiểm tra
hpk42

3
@delnan - Tôi muốn thấy nó luôn
Des

Câu trả lời:


565

Công -stắc vô hiệu hóa chụp thử nghiệm.


86
-s=--capture=no
hobs

URL bị hỏng. Có lẽ đây là một ý chí giúp đỡ: docs.pytest.org/en/latest/capture.html
code_dredd

1
Điều này làm cho đầu ra được xen kẽ với đầu ra Pytest. Những gì bạn có thể muốn là cho Pytest để nắm bắt đầu ra như bình thường và hiển thị nó khi các bài kiểm tra vượt qua cũng như thất bại. Xem stackoverflow.com/a/59156707/369977
pR0Ps

51

Trong một bình luận được đánh giá cao cho câu trả lời được chấp nhận , Joe hỏi:

Có cách nào để in ra bàn điều khiển nắm bắt đầu ra để nó hiển thị trong báo cáo Junit không?

Trong UNIX, điều này thường được gọi là teeing . Lý tưởng nhất là phát bóng thay vì chụp sẽ là mặc định py.test. Không lý tưởng, không phải py.test hay bất kỳ plugin py.test của bên thứ ba nào hiện có (... mà tôi biết, dù sao ) cũng hỗ trợ phát bóng - mặc dù Python hỗ trợ rất nhiều cho việc phát bóng ngoài luồng .

Khỉ vá py.test để làm bất cứ điều gì không được hỗ trợ là không tầm thường. Tại sao? Bởi vì:

  • Hầu hết các chức năng py.test bị khóa đằng sau một _pytestgói riêng không có ý định nhập bên ngoài. Cố gắng làm như vậy mà không biết những gì bạn đang làm thường dẫn đến pytestgói công khai làm tăng các ngoại lệ tối nghĩa khi chạy. Cảm ơn rất nhiều, py.test. Kiến trúc thực sự mạnh mẽ bạn đã có ở đó.
  • Ngay cả khi bạn làm con số ra làm thế nào để con khỉ-vá các tin _pytestAPI một cách an toàn, bạn cần phải làm như vậy trước khi chạy công pytestgói chạy bởi bên ngoài py.testlệnh. Bạn không thể làm điều này trong một plugin (ví dụ: conftestmô-đun cấp cao nhất trong bộ thử nghiệm của bạn). Vào thời điểm py.test lười biếng bắt đầu nhập động plugin của bạn, bất kỳ lớp py.test nào bạn muốn vá khỉ đã được khởi tạo từ lâu - và bạn không có quyền truy cập vào trường hợp đó. Điều này ngụ ý rằng, nếu bạn muốn bản vá khỉ của mình được áp dụng một cách có ý nghĩa, bạn không còn có thể chạy py.testlệnh bên ngoài một cách an toàn . Thay vào đó, bạn phải kết thúc việc chạy lệnh đó bằng một setuptools tùy chỉnhtest lệnh đó (theo thứ tự):
    1. Khỉ vá các _pytestAPI riêng .
    2. Gọi pytest.main()chức năng công cộng để chạy py.testlệnh.

Câu trả lời này cho khỉ-patch py.test -s--capture=nocác tùy chọn để chụp stderr nhưng không xuất sắc. Theo mặc định, các tùy chọn này không bắt được thiết bị xuất chuẩn cũng như thiết bị xuất chuẩn. Điều này không hẳn là phát bóng, tất nhiên. Nhưng mọi hành trình vĩ đại đều bắt đầu với một phần tiền truyện tẻ nhạt mà mọi người đều quên trong năm năm.

Tại sao làm điều này? Bây giờ tôi sẽ nói với bạn. Bộ kiểm tra hướng py.test của tôi chứa các bài kiểm tra chức năng chậm. Hiển thị thiết bị xuất chuẩn của các thử nghiệm này rất hữu ích và yên tâm, ngăn không cho leycec tiếp cận killall -9 py.testkhi một thử nghiệm chức năng chạy dài khác không thể làm gì trong nhiều tuần. Tuy nhiên, việc hiển thị các tiêu chuẩn của các thử nghiệm này sẽ ngăn py.test báo cáo các dấu vết ngoại lệ về các lỗi thử nghiệm. Mà là hoàn toàn không có ích. Do đó, chúng tôi ép buộc py.test để bắt stderr nhưng không xuất sắc.

Trước khi chúng tôi nhận được nó, câu trả lời này giả định rằng bạn đã có testlệnh setuptools tùy chỉnh gọi py.test. Nếu bạn không, hãy xem phần phụ Tích hợp thủ công của trang Thực hành tốt được viết tốt của py.test .

Đừng không cài đặt pytest-Á hậu , một setuptools của bên thứ ba plug-in cung cấp một setuptools tùy chỉnh testcũng lệnh gọi py.test. Nếu pytest-runner đã được cài đặt, có lẽ bạn sẽ cần gỡ cài đặt gói pip3 đó và sau đó áp dụng phương pháp thủ công được liên kết ở trên.

Giả sử bạn đã làm theo các hướng dẫn trong Tích hợp thủ công được tô sáng ở trên, cơ sở mã của bạn bây giờ sẽ chứa một PyTest.run_tests()phương thức. Sửa đổi phương pháp này cho giống:

class PyTest(TestCommand):
             .
             .
             .
    def run_tests(self):
        # Import the public "pytest" package *BEFORE* the private "_pytest"
        # package. While importation order is typically ignorable, imports can
        # technically have side effects. Tragicomically, that is the case here.
        # Importing the public "pytest" package establishes runtime
        # configuration required by submodules of the private "_pytest" package.
        # The former *MUST* always be imported before the latter. Failing to do
        # so raises obtuse exceptions at runtime... which is bad.
        import pytest
        from _pytest.capture import CaptureManager, FDCapture, MultiCapture

        # If the private method to be monkey-patched no longer exists, py.test
        # is either broken or unsupported. In either case, raise an exception.
        if not hasattr(CaptureManager, '_getcapture'):
            from distutils.errors import DistutilsClassError
            raise DistutilsClassError(
                'Class "pytest.capture.CaptureManager" method _getcapture() '
                'not found. The current version of py.test is either '
                'broken (unlikely) or unsupported (likely).'
            )

        # Old method to be monkey-patched.
        _getcapture_old = CaptureManager._getcapture

        # New method applying this monkey-patch. Note the use of:
        #
        # * "out=False", *NOT* capturing stdout.
        # * "err=True", capturing stderr.
        def _getcapture_new(self, method):
            if method == "no":
                return MultiCapture(
                    out=False, err=True, in_=False, Capture=FDCapture)
            else:
                return _getcapture_old(self, method)

        # Replace the old with the new method.
        CaptureManager._getcapture = _getcapture_new

        # Run py.test with all passed arguments.
        errno = pytest.main(self.pytest_args)
        sys.exit(errno)

Để kích hoạt bản vá khỉ này, hãy chạy py.test như sau:

python setup.py test -a "-s"

Stderr nhưng không stdout bây giờ sẽ bị bắt. Tiện lợi!

Mở rộng bản vá khỉ ở trên sang tee stdout và stderr được để lại cho người đọc với một thùng đầy thời gian rảnh.


33

Khi chạy thử sử dụng -stùy chọn. Tất cả các câu lệnh in exampletest.pysẽ được in trên bàn điều khiển khi chạy thử.

py.test exampletest.py -s

31

Theo tài liệu pytest , phiên bản 3 của pytest có thể vô hiệu hóa tạm thời việc chụp trong một thử nghiệm:

def test_disabling_capturing(capsys):
    print('this output is captured')
    with capsys.disabled():
        print('output not captured, going directly to sys.stdout')
    print('this output is also captured')

20

pytest chụp các thiết bị xuất chuẩn từ các thử nghiệm riêng lẻ và chỉ hiển thị chúng trong các điều kiện nhất định, cùng với bản tóm tắt các thử nghiệm mà nó in theo mặc định.

Thông tin tóm tắt bổ sung có thể được hiển thị bằng tùy chọn '-r':

pytest -rP

cho thấy đầu ra bắt được của các bài kiểm tra đã qua.

pytest -rx

hiển thị đầu ra bị bắt của các thử nghiệm thất bại (hành vi mặc định).

Định dạng của đầu ra đẹp hơn với -r so với -s.


2
Đây là câu trả lời thực tế tôi đang tìm kiếm! Cảm ơn bạn. (Có thiết bị xuất chuẩn SAU KHI kết quả kiểm tra là mong muốn. Khi chúng được xen kẽ, các dòng in sẽ mất giá trị.)
bossylobster

18

Hãy thử pytest -s -v test_login.pyđể biết thêm thông tin trong giao diện điều khiển.

-v nó ngắn --verbose

-s có nghĩa là 'vô hiệu hóa tất cả việc bắt giữ'




1
nếu bạn đang sử dụng tệp pytest.ini, bạn có thể sử dụng: addopts = -s -v python_files = test_login.py
timj98

4

Nếu bạn đang sử dụng PyCharm IDE, thì bạn có thể chạy thử nghiệm riêng lẻ đó hoặc tất cả các thử nghiệm bằng thanh công cụ Run. Cửa sổ công cụ Run hiển thị đầu ra được tạo bởi ứng dụng của bạn và bạn có thể thấy tất cả các câu lệnh in trong đó như là một phần của đầu ra thử nghiệm.


Bạn có biết làm thế nào để in PyCharm trong khi thử nghiệm đang chạy không? (thay vì sau khi bài kiểm tra đã trôi qua)
Alexandre Huat

3

pytest --capture=tee-sysđã được thêm gần đây. Bạn có thể chụp cũng như xem đầu ra trên thiết bị xuất chuẩn / err.


-4

Các câu trả lời khác không hoạt động. Cách duy nhất để xem đầu ra bị bắt là sử dụng cờ sau:

pytest - hiển thị tất cả


6
--show-capture=alllà giá trị mặc định. Thêm nó không ảnh hưởng gì.
cuốc
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.