문제

테스트가 꽤 많은 시간이 걸리는 테스트 파일이 있습니다 (클러스터에 계산을 보내고 결과를 기다립니다). 이 모든 것은 특정 테스트 케이스 클래스에 있습니다.

그들은 시간이 걸리고 더 나아질 가능성이 높지 않기 때문에, 나는이 테스트의 하위 집합이 실행되지 않는지 여부를 선택할 수 있기를 원합니다 (가장 좋은 방법은 명령 줄 인수, 즉 "입니다../tests.py --offline"또는 그와 비슷한 것), 그래서 나는 시간이있을 때 대부분의 테스트를 자주 그리고 빠르게 그리고 전체 세트를 한 번에 한 번에 실행할 수있었습니다.

지금은 그냥 사용합니다 unittest.main() 테스트를 시작합니다.

감사.

도움이 되었습니까?

해결책

기본값 unittest.main() 기본 테스트 로더를 사용하여 메인이 실행중인 모듈에서 테스트 수영을 만듭니다.

이 기본 동작을 사용할 필요는 없습니다.

예를 들어 세 가지를 만들 수 있습니다 UnitTest.TestSuite 인스턴스.

  1. "빠른"하위 집합.

    fast = TestSuite()
    fast.addTests( TestFastThis )
    fast.addTests( TestFastThat )
    
  2. "느린"하위 집합.

    slow = TestSuite()
    slow.addTests( TestSlowAnother )
    slow.addTests( TestSlowSomeMore )
    
  3. "전체"세트.

    alltests = unittest.TestSuite([fast, slow])
    

빠른 대 느린 것을 나타내도록 테스트 케이스 이름을 조정했습니다. UnitTest.TestLoader를 서브 클래스로하여 클래스 이름을 구문 분석하고 여러 로더를 생성 할 수 있습니다.

그러면 주 프로그램은 명령 줄 인수를 구문 분석 할 수 있습니다 optparse 또는 Argparse (2.7 또는 3.2 이후 사용 가능) 실행하려는 스위트, 빠르고 느리게 또는 전부를 선택하십시오.

또는, 당신은 그것을 믿을 수 있습니다 sys.argv[1] 세 가지 값 중 하나이며 이것만큼 간단한 것을 사용합니다.

if __name__ == "__main__":
    suite = eval(sys.argv[1])  # Be careful with this line!
    unittest.TextTestRunner().run(suite)

다른 팁

하나의 특정 테스트 만 실행하려면 사용할 수 있습니다.

$ python -m unittest test_module.TestClass.test_method

추가 정보 여기

실제로, 테스트 사례의 이름을 SYS.ARGV로 전달할 수 있으며 해당 사례 만 테스트됩니다.

예를 들어, 당신이 가지고 있다고 가정합니다

class TestAccount(unittest.TestCase):
    ...

class TestCustomer(unittest.TestCase):
    ...

class TestShipping(unittest.TestCase):
    ...

account = TestAccount
customer = TestCustomer
shipping = TestShipping

전화해도됩니다

python test.py account

계정 테스트 만 또는 심지어

$ python test.py account customer

두 경우를 모두 테스트합니다

나는 간단한 것을 사용하여 이것을하고 있습니다 skipIf:

import os

SLOW_TESTS = int(os.getenv('SLOW_TESTS', '0'))

@unittest.skipIf(not SLOW_TESTS, "slow")
class CheckMyFeature(unittest.TestCase):
    def runTest(self):
        …

이 방법 으로이 단일 라인으로 이미 존재하는 테스트 케이스를 장식하면됩니다 (테스트 스위트 또는 이와 유사한 테스트 스위트를 만들 필요가 없습니다. os.getenv() 내 단위 테스트 파일의 시작 부분에서 호출 라인), 기본값 으로이 테스트는 건너 뜁니다.

느리게 실행하고 싶다면 다음과 같이 스크립트를 호출합니다.

SLOW_TESTS=1 python -m unittest …

기본적으로 두 가지 방법이 있습니다.

  1. 클래스에 대한 자신의 테스트 제품군을 정의하십시오
  2. 실제 데이터를 반환 할 클러스터 연결의 모의 클래스를 만듭니다.

나는 그가 두 번째 접근법의 강력한 지지자이다. 단위 테스트 ~해야 한다 복잡한 시스템 (데이터베이스 나 클러스터와 같은)이 아닌 코드 단위 만 테스트하십시오. 그러나 나는 그것이 항상 가능하지 않다는 것을 이해합니다. 때로는 모형을 만드는 것이 너무 비싸거나 테스트의 목표는 실제로 복잡한 시스템에 있습니다.

옵션 (1)으로 돌아 가면 이런 식으로 진행할 수 있습니다.

suite = unittest.TestSuite()
suite.addTest(MyUnitTestClass('quickRunningTest'))
suite.addTest(MyUnitTestClass('otherTest'))

그런 다음 스위트 룸을 테스트 러너에게 전달합니다.

unittest.TextTestRunner().run(suite)

파이썬 문서에 대한 자세한 내용 : http://docs.python.org/library/unittest.html#testsuite-objects

사용하기 때문에 unittest.main() 당신은 그냥 달릴 수 있습니다 python tests.py --help 문서를 얻으려면 :

Usage: tests.py [options] [test] [...]

Options:
  -h, --help       Show this message
  -v, --verbose    Verbose output
  -q, --quiet      Minimal output
  -f, --failfast   Stop on first failure
  -c, --catch      Catch control-C and display results
  -b, --buffer     Buffer stdout and stderr during test runs

Examples:
  tests.py                               - run default set of tests
  tests.py MyTestSuite                   - run suite 'MyTestSuite'
  tests.py MyTestCase.testSomething      - run MyTestCase.testSomething
  tests.py MyTestCase                    - run all 'test*' test methods
                                               in MyTestCase

즉, 당신은 단순히 할 수 있습니다

python tests.py TestClass.test_method

또는 당신은 그것을 사용할 수 있습니다 unittest.SkipTest() 기능. 예를 들어 추가하십시오 skipOrRunTest 이와 같은 테스트 클래스에 대한 방법 :

def skipOrRunTest(self,testType):
    #testsToRun = 'ALL'
    #testsToRun = 'testType1, testType2, testType3, testType4,...etc'
    #testsToRun = 'testType1'
    #testsToRun = 'testType2'
    #testsToRun = 'testType3'
    testsToRun = 'testType4'              
    if ((testsToRun == 'ALL') or (testType in testsToRun)):
        return True 
    else:
        print "SKIPPED TEST because:\n\t testSuite '" + testType  + "' NOT IN testsToRun['" + testsToRun + "']" 
        self.skipTest("skipppy!!!")

그런 다음이 SkiporRuntest 메소드에 호출을 추가하십시오.

def testType4(self):
    self.skipOrRunTest('testType4')

나는 방법을 바탕으로 다른 해결책을 찾았습니다 unittest.skip 데코레이터 작품. 설정하여 __unittest_skip__ 그리고 __unittest_skip_why__.

레이블 기반

라벨링 시스템을 적용하여 일부 테스트에 레이블을 지정하고 싶었습니다. quick, slow, glacier, memoryhog, cpuhog, core, 등등.

그런 다음 실행하십시오 all 'quick' tests, 또는 run everything except 'memoryhog' tests, 기본 화이트리스트 / 블랙리스트 설정

구현

나는 이것을 두 부분으로 구현했다.

  1. 먼저 사용자 정의를 통해 테스트에 레이블을 추가하십시오 @testlabel 클래스 데코레이터)
  2. 관습 unittest.TestRunner 건너 뛰는 테스트를 식별하고 실행하기 전에 테스트 목록 컨텐츠를 수정합니다.

작업 구현은이 요점에 있습니다.https://gist.github.com/fragmuffin/a245f59bdcd457936c3b51aa2ebb3f6c

(완전히 작동하는 예제는 여기에 넣기에는 너무 길었습니다)

결과는 ...

$ ./runtests.py --blacklist foo
test_foo (test_things.MyTest2) ... ok
test_bar (test_things.MyTest3) ... ok
test_one (test_things.MyTests1) ... skipped 'label exclusion'
test_two (test_things.MyTests1) ... skipped 'label exclusion'

----------------------------------------------------------------------
Ran 4 tests in 0.000s

OK (skipped=2)

모두 MyTests1 클래스 테스트는 다음과 같이 건너 뜁니다 foo 상표.

--whitelist 또한 작동합니다

py.test, Nose 또는 Zope.testing과 같은 전용 테스트 런너를 사용하십시오. 모두 테스트를 선택하기위한 명령 줄 옵션이 있습니다.

예를 들어 코처럼보십시오 : https://pypi.python.org/pypi/nose/1.3.0

@Slott의 답변을 시도했습니다.

if __name__ == "__main__":
    suite = eval(sys.argv[1])  # Be careful with this line!
    unittest.TextTestRunner().run(suite)

그러나 그것은 나에게 다음과 같은 오류를 주었다.

Traceback (most recent call last):
  File "functional_tests.py", line 178, in <module>
    unittest.TextTestRunner().run(suite)
  File "/usr/lib/python2.7/unittest/runner.py", line 151, in run
    test(result)
  File "/usr/lib/python2.7/unittest/case.py", line 188, in __init__
    testMethod = getattr(self, methodName)
TypeError: getattr(): attribute name must be string

다음은 저를 위해 일했습니다.

if __name__ == "__main__":
    test_class = eval(sys.argv[1])
    suite = unittest.TestLoader().loadTestsFromTestCase(test_class)
    unittest.TextTestRunner().run(suite)

속성을 추가하여 실행하려는 Test_* 메소드를 선택하는 또 다른 방법을 찾았습니다. 기본적으로 메타 클라스를 사용하여 TestCase 클래스 내부의 콜블 즈를 사용하여 STEPDEBUG 속성이 UnitTest.skip 데코레이터가 있습니다. 더 많은 정보

데코레이터와 메타 클래스를 사용하여 모든 단위 테스트를 건너 뛰지 만 파이썬으로 하나

나는 그것이 위의 것보다 더 나은 솔루션인지 모르겠습니다.

전에이 작업을 수행하는 좋은 방법을 찾지 못했기 때문에 여기서 공유하십시오.

목표 : 테스트 파일 세트를 하나로 실행할 수 있도록 테스트 파일 세트를 얻을 수 있지만 여전히 그 중 하나를 선택할 수 있습니다.

문제 : Discover 방법을 사용하면 단일 테스트 케이스를 쉽게 선택할 수 없습니다.

디자인 : 아래를 참조하십시오. 이것 평평합니다 네임 스페이스는 테스트 케이스 클래스 이름으로 선택하고 "tests1.test_core"접두사를 떠나게합니다.

./run-tests TestCore.test_fmap

암호

  test_module_names = [
    'tests1.test_core',
    'tests2.test_other',
    'tests3.test_foo',
    ]

  loader = unittest.defaultTestLoader
  if args:
    alltests = unittest.TestSuite()
    for a in args:
      for m in test_module_names:
        try:
          alltests.addTest( loader.loadTestsFromName( m+'.'+a ) )
        except AttributeError as e:
          continue
  else:
    alltests = loader.loadTestsFromNames( test_module_names )

  runner = unittest.TextTestRunner( verbosity = opt.verbose )
  runner.run( alltests )

이것이 나를 위해 일한 유일한 것입니다.

if __name__ == '__main__':
unittest.main( argv=sys.argv, testRunner = unittest.TextTestRunner(verbosity=2))

내가 전화했을 때 나는 클래스 이름과 테스트 이름의 이름으로 전달해야했다. 수업 및 테스트 이름 조합이 암기되지 않기 때문에 약간 불편합니다.

python ./tests.py class_name.test_30311

클래스 이름과 테스트 이름을 제거하면 파일의 모든 테스트가 실행됩니다. CLI에서 명령을 변경하지 않기 때문에 내장 방법을 다루는 것이 훨씬 쉽다는 것을 알게됩니다. 매개 변수를 추가하십시오.

즐기세요, 키이스

테스트를 느린 테스트로 표시하고 환경 변수를 사용하여 건너 뛰는 데코레이터를 만들었습니다.

from unittest import skip
import os

def slow_test(func):
    return skipIf('SKIP_SLOW_TESTS' in os.environ, 'Skipping slow test')(func)

이제 테스트를 다음과 같이 느리게 표시 할 수 있습니다.

@slow_test
def test_my_funky_thing():
    perform_test()

설정하여 느린 테스트를 건너 뜁니다 SKIP_SLOW_TESTS 환경 변수:

SKIP_SLOW_TESTS=1 python -m unittest
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top