2009-12-03 7 views
25

Python unittest 모듈을 사용하여 작성된 일부 단위 테스트의 래퍼 역할을하는 스크립트가 있습니다. 일부 파일을 청소 출력 스트림을 생성하고 몇 가지 코드를 생성 할뿐만 아니라, 내가 이미 출력을 결정하기 위해 사용되는 여러 명령 줄 인수를 꺼내 optparse을 사용하고Python, unit test - unittest.TestCase의 setUp에 명령 줄 인수를 전달합니다.

unittest.TestLoader().loadTestsFromTestCase() 

를 사용하여 제품군으로 테스트 케이스를로드 위치, 코드 재생성 여부 및 정리 작업 수행 여부를 지정합니다. 또한 테스트 케이스 내에서 사용할 구성 변수, 즉 엔드 포인트 URI를 전달하려고합니다.

나는 OptionParser을 TestCase의 setUp 메소드에 추가 할 수 있다는 것을 알고 있지만, 대신 setUp에 옵션을 전달하려고합니다. 가능합니까 loadTestsFromTestCase()? 반환 된 TestSuiteTestCases을 반복 할 수 있지만 TestCases에서 setUp을 수동으로 호출 할 수 있습니까?

** 나는 내가 시험을 반복하는 경우 setUp에 인수를 전달과 같은 수동 setUp를 호출 할 수 있음을 지적하고 싶었 ** 편집 : 그러나

(options, args) = op.parse_args() 
suite = unittest.TestLoader().loadTestsFromTestCase(MyTests.TestSOAPFunctions) 
for test in suite: 
    test.setUp(options.soap_uri) 

, 나는 xmlrunner를 사용하고 이것과 run 메소드는 TestSuite을 인수로 취합니다. 나는 그것이 setUp 메서드 자체를 실행할 것이라고 가정하므로 XMLTestRunner 내에있는 매개 변수가 필요합니다.

나는 이것이 의미가 있기를 바랍니다.

답변

43

글쎄, 나는 똑같은 일을하고 싶고 나 자신에게이 질문을하려고했다. 다음 코드가 중복되어 개선 되었으면합니다. 그것은 나를 그러나의 TestCase를 테스트하기 위해 인수를 보낼 수 않습니다 당신이 init 메소드의 속성을 정의하는 경우

import unittest 
import helpspot 

class TestHelpSpot(unittest.TestCase): 
    "A few simple tests for HelpSpot" 

    def __init__(self, testname, path, user, pword): 
     super(TestHelpSpot, self).__init__(testname) 
     self.hs = helpspot.HelpSpot(path, user, pword) 

    def test_version(self): 
     a = self.hs.version() 
     b = self.hs.private_version() 
     self.assertEqual(a, b) 

    def test_get_with_param(self): 
     a = self.hs.filter_get(xFilter=1) 

    def test_unknown_method(self): 
     self.assertRaises(helpspot.HelpSpotError, self.hs.private_wuggienorple) 

if __name__ == '__main__': 
    import sys 
    user = sys.argv[1] 
    pword = sys.argv[2] 
    path = sys.argv[3] 

    test_loader = unittest.TestLoader() 
    test_names = test_loader.getTestCaseNames(TestHelpSpot) 

    suite = unittest.TestSuite() 
    for test_name in test_names: 
     suite.addTest(TestHelpSpot(test_name, path, user, pword)) 

    result = unittest.TextTestRunner().run(suite) 
    sys.exit(not result.wasSuccessful()) 
+0

여기에 helpspot이란 무엇입니까? – SIslam

+0

HelpSpot은 UserScape의 고객 서비스 응용 프로그램입니다. 나는 API를위한 Python 인터페이스를 작성했다. - https://github.com/JohnSpeno/python-helpspot – jps

+0

'unittest.main()'과 비슷한 기능을하기 위해서는'sys.exit (not result.wasSuccessful())'끝에. – abergmeier

5

필자는 setUp에 인수를 전달하는 것에 대해서는이 점을 확실히 알려줄 것입니다. setUp은 테스트를 실행할 때 암시 적으로 호출되도록 의도되었으므로 명시 적으로 이와 같이 호출하면 안됩니다.

이 문제를 해결할 수있는 방법 중 하나는 전역 적으로 액세스 가능한 "컨텍스트"모듈에서 환경 변수 또는 값으로 설정해야하는 값을 설정하는 것입니다. 그러면 테스트 케이스에서 필요에 따라 액세스 할 수 있습니다. 테스트를 실행하는 측면에서보다 융통성이 있기 때문에 환경 변수를 사용하려고합니다 (명령 행 인수에 더 이상 의존하지 않습니다).

+4

그리고 다른 코드는 같은 이름의 환경 변수에 의존합니다. – GNUnit

0

는, 당신은 단순히 같은 생성자에서 그들 모두를 전달할 수 있습니다 ..

import unittest 
import helpspot 

class TestHelpSpot(unittest.TestCase): 
    "A few simple tests for HelpSpot" 

    def __init__(self, testname, path, user, pword): 
     super(TestHelpSpot, self).__init__(testname) 
     self.path = path 
     self.user = user 
     self.pword = pword 
.... 
.... 
.... 


if __name__ == '__main__': 
    True 

    suite = unittest.TestSuite() 
    suite.addTest(TestHelpSpot("test_version", path, user, pword))  

    unittest.TextTestRunner().run(suite) 
7
if __name__ == '__main__': 
    from optparse import OptionParser 
    parser = OptionParser() 
    parser.add_option("-z", "--zebra", 
         action="store_true", dest="zebra", default=False, 
         help="run like a zebra")  


    (options, args) = parser.parse_args() 

    if options.zebra: 
     zebrafy() 


    # remove our args because we don't want to send them to unittest 
    for x in sum([h._long_opts+h._short_opts for h in parser.option_list],[]): 
     if x in sys.argv: 
      sys.argv.remove(x) 


    unittest.main() 
+0

아주 좋습니다. 정확히 내가 무엇을 찾고 있었는지. –

+1

나는'-i' 옵션을 추가하고 싶었고 위의 코드를 사용했다 ... 나는 .. \ .. \ python \ python -m unittest -v "test_activation.test_activation"-i "input_file"'을 통해 테스트를 시작했다. . 왜 이것이'test_activation.py : error : no such option : -m'이라는 에러를 내는가? – Danijel

+0

이것은 나를 위해 작동하지 않았다.그러나 args를 제거하는 다음 행은 작동했습니다. del sys.argv [1 :] – Indrajeet

관련 문제