2016-06-09 2 views
1

주어진 디렉토리에서 ".test"파일을 읽는 테스트 러너에서 작업 중입니다. ".test가"의테스트 실패시 "for 루프"를 종료하지 않고 "assert"를 사용하여 파이썬의 모든 테스트 파일을 하나의 함수에서 실행

구조 :

---TEMPLATE--- 
template content 
---CONTEXT--- 
context to render on template 
---RESULT--- 
expected result of the template. 

는 'n'을 더 있습니다. 내 테스트 디렉토리에 테스트 파일의. 나는 테스트 번호를 저장합니다. .test 파일을 키로 사용하고 .test 파일의 이름을 사전 "tests"에 저장합니다.

그 후 사전 "테스트"를 반복하고 .test 파일의 내용을 읽고이를 변수에 저장하십시오.

---TEMPLATE--- part in "template_string", 
---CONTEXT--- part in "context_string", and 
---RESULT--- part in "expected_result" 

후 사용 jinja2.Environment 클래스를 CONTEXT_STRING와 template_string 렌더링 및 "결과"varibale에 저장합니다.

"결과"를 "예상 _ 결과"와 비교하십시오.

현재 테스트 러너 코드 :

class TestTempates(TestCase): 
    def test_method(self): 
     tests = { dictionary of .test file } 
     results = {} #to store status of test case at there index (pass or error). 
     env = jinja2.Environment() 
     passed = 0 
     error = 0  
     for index, fname in tests.items(): 
      file_path = dirpath + os.sep + fname 
      with open(file_path) as f: 
       # logic to read file content 
       template_string = #content of ---TEMPLATE--- part from file 
       context_string = #content of ---CONTEXT--- part from file 
       expected_result = #content of ---RESULT--- part from file 
      template = env.from_string(template_string) 
      context = json.loads(context_string) 
      result = template.render(context) 

      if result == expected_result: 
       results[index] = "Pass" 
       passed += 1 
      else: 
       sep = "-----------------------------" 
       error = "Error: results mismatch:\n%s\n%s\n%s\n%s" % \ 
         (sep, result, sep, expected_result) 
       results[index] = error 
       errors += 1 

비교 "결과"와 조건을 잘 작동 "다른이 경우"에와 "expected_result". 하지만 모든 테스트 파일이 실행될 때까지 "expected_result"와 일치하지 않는 테스트 파일이있을 때 "for 루프"를 종료하지 않고 "assert"또는 "assertEquals"를 사용하려고합니다. 그래서 Travis CI에서 테스트 러너를 사용할 수 있으므로 테스트 케이스가 실패 할 때 Travis 빌드가 실패합니다.

현재 상황에서는 트래비스 CI 빌드가 테스트 케이스 실패시 실패하지 않습니다.

답변

1

스 니펫 코드를 따라 문제를 해결할 수 있습니다.

suite = unittest.TestSuite() 

def test_main(self): 
    self.assertEquals(self.result, self.expected_output) 


def test_method(self): 
    """ 
    """ 
    # -- code to get tests objects to have all .tests content 
    for index, fname in tests.items(): 
     # get result and expected_output value 
     obj = type('Test', (unittest.TestCase,), {'test_main': test_main, 
        'result':result, 'expected_output':expected_output}) 

     suite.addTest(obj('test_main')) 

unittest.TextTestRunner(verbosity=2).run(suite)