2016-11-06 5 views
5

파이썬의 unittest을 사용 중이며 몇 개의 스레드를 시작하고 완료 될 때까지 기다리는 테스트를 작성하려고합니다. 스레드는 일부 unittest 어설 션이있는 함수를 실행합니다. 어설 션 중 하나라도 실패하면 테스트가 실패했으면합니다. 이것은 사실이 아닌 것 같습니다.Python unittest 및 multithreading

편집 : 최소 실행 가능한 예 (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() 

출력은 다음과 같습니다 당신이 예외가 끝날 수 있도록 그래서

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

내가 잘못 생각한 것 같습니다. 테스트중인 함수의 샘플을 보여주세요. – Dan

+0

@ Dan : 가장 단순한'test_fail (self) : self.fail()'이라도 뭐든지 될 수 있습니다. –

+0

테스트 케이스에서 스레드를 실행할 필요가 없습니다. 테스트중인 함수가 스레드를 실행하는 경우 대상 함수를 조롱하고 호출에 대해 어설 션함으로써 해당 동작을 테스트 할 수 있습니다. 스레딩 클래스를 조롱 할 수도 있습니다. – Dan

답변

1

파이썬 unittest 주장은 예외로 전달된다 주 스레드에서.

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

것은 당신이 먹을 수있는 try/except 블록이없는 있는지 확인하십시오 당신이 그 이상 메인 스레드로 스레드에서 예외가 발생합니다 같은 .join()을 실행해야 의미 스레드에 대한 그래서 unittest 전에 예외를 등록 할 수 있습니다.

: self.fail().join()이 있더라도 스레드에서 호출 할 때 실제로 통신되지 않습니다. 그게 뭔지 잘 모르겠다.

+1

나는 당신의 모범을 보았습니다. 그것은 나를 위해 (python3.x) 작동하지 않으며 내 코드와 동일한 결과를 얻을 수 있습니다. 테스트는 여전히 통과됩니다. –

0

내 주 스레드에서 종료 코드를 확인하여 실패한 하위 프로세스를 감지합니다 (0이 아닌 값은 실패 함).

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

하위 프로세스가 스레드가 아닙니다. –