2013-08-22 1 views
0

파이썬에서 테스트 파일 wirtten : test1.py test2.py ... 그 중 하나를 실행하기 전에 인수를 사용하는 initialize.py 파일을 초기화해야합니다.boilerplateless tests

테스트 파일은 가능한 한 가볍고 쓰기 쉬워 야합니다.

  1. 는 입력 인수를
  2. 시작
  3. 이 initialize.py
  4. 에 의해 생성 된 변수를 사용하여 테스트 파일을 시작하는 인수와 함께 initialize.py 파일을 취합니다

    나는 스크립트를 만들려면

      ,691 :

나는 몇 가지 방법에 대해 생각

  • 두 파일 가져 오기 : 가져 오기를 사용하면 주 스크립트에서 return 인수를 사용할 수 있지만 입력 인수를 제공 할 수 없으므로 작동하지 않습니다.
  • 두 파일을 함수로 변환하십시오 : initialize.py에서는 문제가 없습니다. 하지만 내가 말했듯이 나는 테스트 파일을 가능한 한 쉽고 가볍게 유지하고 싶다. 그래서 피할 수 있다면 더 좋다.
  • 완벽한 솔루션은 코드를 초기화하여 코드를 "복사"하여 테스트 파일 (또는 그 반대)의 시작점에 넣는 것입니다. 두 코드를 모두 포함하는 임시 파일을 만들 수도 있지만 매우 깨끗하다고는 생각하지 않습니다.
  • 요약 : 동일한 25 줄로 시작하는 파일이 100 개인 것처럼 나는이 파일을 한 파일에 넣고 매번 가져 오려고합니다. 나는 "첫 번째, 두 번째 thrid"나는

    #! /usr/bin/python 
    import sys 
    
    import subprocess 
    source_content = "#! /usr/bin/python\n"+"import sys\n" 
    
    sourcefile = "file2.py" 
    txt_file = open(sourcefile) 
    source_content += txt_file.read() 
    
    sourcefile = "file3.py" 
    txt_file = open(sourcefile) 
    source_content += txt_file.read() 
    
    destinationfile = "Copyfile2.py" 
    target = open (destinationfile, 'w') 
    target.write(source_content) 
    
    target.close() 
    
    chmodFile = "chmod 777 "+destinationfile 
    chmod = subprocess.Popen(chmodFile, shell=True) 
    chmod.wait() 
    arguments = str("./"+destinationfile+" ") 
    arguments += " ".join(map(str,sys.argv[1:len(sys.argv)])) 
    startTest = subprocess.Popen(arguments, shell=True) 
    startTest.wait() 
    
    에 성공

    을 ./File1.py 첫 를 시작하고 싶어

    #File1.py 
    var1 = sys.argv(1) 
    
    #File2.py 
    var2 = var1+"second" 
    
    #File3.py 
    var3 = var1+var2+"third" 
    print var3 
    

    :

    일을 볼 수있는 다른 방법은 3 개 개의 파일입니다

    하지만 test2에서 "#!/usr/bin/python"을 삭제하고 동일한 이름의 파일에서 var1을 sys.arg [1]로 바꾸고 테스트해야했습니다. 그리고 좋은 솔루션이라고 생각하지 않습니다 ...

    답변

    0

    unittest 모듈을 사용하는 것은 어떻습니까?

    import unittest 
    
    class BaseTest(unittest.TestCase): 
        def initialisation_script_stuff(blah,etc): 
         foo 
    
        def setUp(self): 
         common_setup_stuff() 
    
        def tearDown(self): 
         whatever 
    

    이제 각각의 테스트 파일에서 BaseTest를 상속 할 수 있습니다.

    from moo import BaseTest 
    
    class CoolTest(BaseTest): 
        def setUp(self): 
         BaseTest.setUp(self) 
         args = BaseTest.initialisation_script_stuff() 
         do_stuff(args) 
    
        def testNumberOne(self): 
         self.assertEqual(1,1) 
    

    또는 표준 단위 테스트 방법을 사용하지 않으려는 경우 ...

    all_tests\ 
        __init__.py 
        some_tests\ 
         __init__.py 
         test1.py 
         test2.py 
        other _tests\ 
         __init__.py 
         etc 
    

    일부 명명 규칙 :

    디렉토리 구조를 가정

    • 각 테스트 평 파일은
    • 각 테스트 평 파일 이름 시작이있는 테스트를 실행 run라는 기능이 있습니다 'test'사용
    • 각 테스트 그룹 폴더의 이름은 '_tests'로 끝납니다

    은 하나의 스크립트라는 run_tests.py 확인 (또는 그런 일을 ...)

    def run_tests(): 
        import os 
        import importlib 
        import re 
        dTests = {} 
        lFolders = [s for s in os.listdir('all_tests') if re.match('.*_tests$',s)] 
        for sFolder in lFolders: 
         sFolderPath = os.path.join('all_tests',sFolder) 
         lTestFileNames = [s for s in os.listdir(sFolderPath) if re.match('^test.*py$',s)] 
         for sFileName in lTestFileNames:   
          sSubPath = '{0}.{1}'.format(sFolder,sFileName.split('.')[0]) 
          dTests[sSubPath] = importlib.import_module('all_tests.{0}'.format(sSubPath)) 
        #now you have all the tests... 
        for k in dTests: 
         stuff = initialisation_stuff() 
         test_result = dTests[k].run(stuff) 
         do_whatever_you_want(test_result)    
    
    if __name__ == "__main__": 
        run_tests() 
    

    이제 테스트 파일에 전혀 보일러 플레이트 코드를 필요가 없습니다. 방금 수식을 따를수록 길어집니다.

    +0

    좋은 해결책이지만 각 테스트 파일에 글을 쓰는 것은 여전히 ​​많은 일입니다. 테스트 파일이라는 사실은 중요하지 않습니다. 같은 25 줄로 시작하는 100 개의 파일이있는 것처럼 나는 25 줄을 하나의 파일에 넣고 매번 가져 오려고합니다. – elbajo

    +0

    @ user2707890 : 분명히 더 많은 것이 있습니다 ... 그래서 당신은 많은 테스트 파일 (test1.py, test2.py 등)과 모든 테스트에 공통된 이니셜 라이저 기능을 가지고 있습니다. 퍼지 비트가 있습니다 : 테스트를 어떻게 그룹화합니까? 테스트 파일 당 하나? 그리고 어떻게 테스트를 할 계획입니까? 동일한 초기화 함수 인수를 사용하여 한 번에 모두? 테스트마다 또는 테스트 파일 단위로 지정된 초기화 프로그램 인수를 사용하여 한 번에 모두? 한번에 한? – Sheena

    +0

    테스트는 폴더에 그룹화되어 있지만 하나씩 또는 폴더별로 하나씩 실행할 수 있기를 원합니다. 두 개의 스크립트를 만들려고했으나 첫 번째 테스트를 만들 수 있다면 다른 하나를 쉽게 만들 수 있도록 초점을 맞추고 있습니다. 예, 파일 당 하나의 테스트입니다. (테스트 파일은 약 150 줄입니다) "전체 테스트"의 경우 모든 테스트에 대해 동일한 인수입니다. – elbajo