2016-11-06 15 views
5

Tôi đang sử dụng python's unittest và muốn viết một bài kiểm tra bắt đầu một vài chủ đề và chờ cho đến khi kết thúc. Các chủ đề thực hiện một hàm có một số xác nhận unittest. Nếu bất kỳ xác nhận nào thất bại, tôi muốn thử nghiệm, tốt, thất bại. Điều này dường như không đúng.Python unittest và đa luồng

EDIT: Minimal dụ Runnable (python3)

import unittest 
import threading 

class MyTests(unittest.TestCase): 

def test_sample(self): 
    t = threading.Thread(target=lambda: self.fail()) 
    t.start() 
    t.join() 

if __name__ == '__main__': 
    unittest.main() 

và đầu ra là:

sh-4.3$ python main.py -v                                                    
test_sample (__main__.MyTests) ... Exception in thread Thread-1:                                          
Traceback (most recent call last):                                                  
    File "/usr/lib64/python2.7/threading.py", line 813, in __bootstrap_inner                                        
    self.run()                                                       
    File "/usr/lib64/python2.7/threading.py", line 766, in run                                           
    self.__target(*self.__args, **self.__kwargs)                                              
    File "main.py", line 7, in <lambda>                                                 
    t = threading.Thread(target=lambda: self.fail())                                             
    File "/usr/lib64/python2.7/unittest/case.py", line 450, in fail                                          
    raise self.failureException(msg)                                                 
AssertionError: None                                                     

ok                                                          

----------------------------------------------------------------------                                         
Ran 1 test in 0.002s                                                     

OK  
+0

Tôi nghĩ rằng bạn đang đi sai về điều này. Cho chúng ta thấy một mẫu chức năng đang được kiểm tra. – Dan

+0

@Dan: Nó có thể là bất cứ điều gì, thậm chí là 'def test_fail (self) đơn giản nhất: self.fail()' –

+0

Vì vậy, bạn không bao giờ phải kích hoạt luồng trong các trường hợp thử nghiệm của mình. Nếu chức năng được thử nghiệm đang kích hoạt các luồng thì bạn có thể kiểm tra hành vi đó bằng cách nhai chức năng đích và thực hiện các xác nhận đối với các cuộc gọi. Bạn thậm chí có thể giả lập lớp luồng. – Dan

Trả lời

1

Python unittest khẳng định được truyền đạt bởi trường hợp ngoại lệ, vì vậy bạn phải đảm bảo rằng các trường hợp ngoại lệ kết thúc trong chủ đề chính. Vì vậy, đối với một chủ đề đó có nghĩa là bạn phải chạy .join(), vì điều đó sẽ ném ngoại lệ từ các chủ đề trên vào các chủ đề chính:

t = threading.Thread(target=lambda: self.assertTrue(False)) 
    t.start() 
    t.join() 

Ngoài ra hãy chắc chắn rằng bạn không có bất kỳ try/except khối mà có thể ăn lên ngoại lệ trước unittest có thể đăng ký chúng.

Chỉnh sửa: self.fail() thực sự không được thông báo khi được gọi từ một chuỗi, ngay cả khi có .join(). Không chắc chuyện gì xảy ra với điều đó.

+1

Tôi đã thử ví dụ của bạn. Nó không làm việc cho tôi (python3.x) và mang lại kết quả tương tự như mã của tôi. Bài kiểm tra vẫn trôi qua. –

0

Trong chủ đề chính của mình, tôi phát hiện các quy trình phụ không thành công bằng cách kiểm tra mã thoát của chúng (không khác không).

proc.join() 
self.assertEqual(proc.exitcode, 0, 'Sub-process failed, check output for stack trace') 
+1

Một tiến trình con không phải là một luồng. –