2011-12-15 27 views
6

Im sử dụng unittest và nó in ".", "E" hoặc "F" cho "ok", "error" và "failed" sau mỗi lần kiểm tra. Làm thế nào để tắt nó? Im sử dụng Python 2.7 và các bản in này đến từ lớp Á hậu được xây dựng trong. Nghe có vẻ rất khó khăn để ghi đè lên các lớp vì nó được lồng vào nhau.Tắt một số bản in trong python unittest

chỉnh sửa: Tôi chỉ muốn loại bỏ các ký tự E. và F vì chúng không xuất hiện cùng lúc với một số bản ghi khác trong các bài kiểm tra của tôi.

+0

Tại sao bạn muốn thực hiện việc này? Chắc chắn nó là hữu ích để xem sự tiến bộ của các bài kiểm tra? –

+0

Trong trường hợp của tôi, nó thêm nhầm lẫn khi các thử nghiệm của tôi chạy song song, tôi in 1 thông điệp tường trình và các thông điệp nhật ký kiểm tra này được đồng bộ với "E" "F" hoặc "tương ứng". . – swan

+0

Làm cách nào để chạy các thử nghiệm này trong các quy trình riêng biệt, điều này có thể tách luồng đầu ra? –

Trả lời

1

Tùy thuộc khuôn khổ unittest bạn đang sử dụng (tiêu chuẩn, mũi ...), bạn có nhiều cách để giảm rườm rà:

python -m unittest -h 
... 
-q, --quiet  Minimal output 
... 
+1

* ".", "E" hoặc "F" * vẫn được in ở chế độ '-q'. – Constantinius

+0

Tôi không chạy thử nghiệm của tôi thông qua lệnh python -m unittest nhưng thay vào đó tôi chạy chúng song song bằng cách sử dụng này: http://code.activestate.com/recipes/391414/ – swan

+0

Trong Python 3.6 '-q' dường như ngăn chặn chữ cái, nhưng tôi cho rằng đó là một lỗi đã được sửa từ lâu rồi. Các đầu ra lỗi thử nghiệm đầy đủ sẽ vẫn được in. – Erhhung

9

Kết quả của unittest được ghi vào dòng sai số chuẩn, mà bạn có thể ống ở một nơi khác. Trên một hộp * nix này sẽ có thể như thế này:

python -m unittest some_module 2> /dev/null 

trên cửa sổ, điều này sẽ giống như thế này (nhờ Karl Knechtel):

python -m unittest some_module 2> NUL 

Nếu bạn chạy các bài kiểm tra từ trăn , bạn chỉ có thể thay thế các dòng stderr như thế:

import sys, os 

sys.stderr = open(os.devnull, 'w') 

... # do your testing here 

sys.stderr = sys.__stderr__ # if you still need the stderr stream 

Vì bạn chỉ muốn tắt các bản cập nhật cho các ký hiệu., F, E, bạn cũng có thể tạo lớp TestResult của riêng mình bằng cách ghi đè lên lớp mặc định. Trong trường hợp của tôi (Python 2.6), giao diện này sẽ trông giống như sau:

import unittest 

class MyTestResult(unittest._TextTestResult): 
    def addSuccess(self, test): 
     TestResult.addSuccess(self, test) 
    def addError(self, test, err): 
     TestResult.addError(self, test, err) 
    def addFailure(self, test, err): 
     TestResult.addFailure(self, test, err) 

Điều này sẽ tắt chức năng mặc định một cách hiệu quả.

Bây giờ chúng ta cũng cần một lớp mới TestRunner và ghi đè lên _makeResult phương pháp:

class MyTestRunner(unittest.TextTestRunner): 
    def _makeResult(self): 
     return MyTestResult(self.stream, self.descriptions, self.verbosity) 

Với Á hậu này bây giờ bạn có thể thưởng thức một thử nghiệm miễn phí đăng nhập.

Chỉ cần lưu ý: điều này không thể thực hiện được từ dòng lệnh.

+0

'2> NUL' sẽ hoạt động cho các cửa sổ nếu tôi đang suy nghĩ rõ ràng. –

+0

'os.devnull' là một chuỗi. Ý bạn là 'mở (os.devnull,' w ') '? – jcollado

+0

@jcollado: Vâng, cảm ơn bạn, tôi đã bỏ lỡ điều đó. – Constantinius

5

Đáp ứng trễ một chút, nhưng ai đó có thể thấy nó hữu ích. Bạn có thể bật. E và F tắt bằng cách đặt mức độ chi tiết thành 0:

testRunner = unittest.TextTestRunner(verbosity = 0) 

Bạn vẫn sẽ có kết quả cuối cùng và có thể có lỗi/ngoại lệ vào cuối bài kiểm tra trong tiêu chuẩn.

Được thử nghiệm bằng Python 2.4 và 2.7.

Các vấn đề liên quan