개별 Python 단위 테스트를 일시적으로 비활성화


128

unittestPython 에서 모듈을 사용할 때 개별 단위 테스트를 일시적으로 비활성화하려면 어떻게해야합니까?

답변:


230

unittest.skip데코레이터를 사용하여 개별 테스트 메서드 또는 클래스를 모두 비활성화 할 수 있습니다 .

@unittest.skip("reason for skipping")
def test_foo():
    print('This is foo test case.')


@unittest.skip  # no reason needed
def test_bar():
    print('This is bar test case.')

다른 옵션은 테스트 건너 뛰기 및 예상 된 실패 문서를 참조하세요 .


9
Python 3에서 아래 Akif의 대답은 @unittest.SkipTest작동 하지만 작동하지 않습니다@unittest.skip
lifebalance

7
저는 Python 3.6.1을 사용하고 @unittest.skip있으며 잘 작동합니다.
Pete

2
Python 3.4.0에서 @Pete @unittest.skip는 작동하지 않습니다.
lifebalance

자식 클래스가 건너 뛰는 것을 방지하는 방법은 무엇입니까?
reubenjohn

주석은 단일 테스트 방법에만 적용됩니다. 테스트 메서드가있는 부모 클래스를 만들려고하는데 일부 자식 클래스에만 메서드가 비활성화되어 있습니까? 부모 / 자식 클래스를 적절하게 디자인해야 할 수도 있지만 가능하다고 생각합니다. 장난감 예제를 사용하여 해결하려는 시나리오를 설명 할 수 있습니까?
yoni

26

데코레이터를 사용하여 함수를 래핑 할 수있는 테스트를 비활성화하고 googletest 또는 python 단위 테스트가 테스트 케이스를 실행하지 못하도록 할 수 있습니다.

def disabled(f):
    def _decorator():
        print f.__name__ + ' has been disabled'
    return _decorator

@disabled
def testFoo():
    '''Foo test case'''
    print 'this is foo test case'

testFoo()

산출:

testFoo has been disabled

11

최신 버전 (2.7-미출시)은 테스트 건너 뛰기 / 비활성화를 지원합니다. . 이 모듈을 가져 와서 기존 Python 설치에서 사용할 수 있습니다. 아마도 작동 할 것입니다.

그 전에는 건너 뛰고 싶은 테스트의 이름 xtest_testnametest_testname .


다음은이를 수행하는 빠른 elisp 스크립트입니다. 내 elisp는 약간 녹슬 어서 문제가 생기면 미리 사과드립니다. 테스트되지 않았습니다.

  (defun disable_enable_test ()
  (interactive "")
  (save-excursion
    (beginning-of-line)
    (search-forward "def")
    (forward-char)
    (if (looking-at "disable_")
    (zap-to-char 1 ?_)
      (insert "disable_"))))

+1,하지만 내가 일하고있는 전체 프로젝트에서 모든 사람이 파이썬 v2.6.2를 사용하고 있으며 이것이 변경 될 것이라고 생각하지 않습니다. : /,하지만 해결책입니다. 감사합니다
coelhudo

테스트 케이스를 활성화 / 비활성화하는 매크로를 제공하기 위해 편집기를 약간 조정할 수 있지만 저는 Emacs 사용자로서 말합니다. :)
Noufal Ibrahim

저도 Emacs 사용자입니다. 매크로를 만드셨습니까?
coelhudo

아니. 나는 그들이 실패하게했지만 그렇게 어렵지는 않습니다. 그래도 빠른 답변으로 답변을 업데이트했습니다.
Noufal Ibrahim

이 대답은 대답이 아니라 링크 일뿐입니다. 실제 현재 답변은 가장 많이 뽑힌 답변이 아닙니다. 네, 네 살입니다. 불필요한 elisp는 단순히 난독 화됩니다.
jwd630 2014

10

단순히 @unittest.SkipTest테스트 위에 데코레이터를 배치하는 것으로 충분합니다.


누가 그랬는지 모르겠어요. 그러나 문서를 읽고 있었고 SkipTest가 예외라고 말합니다. 어쨌든 skip은 테스트를 실행하지 않는다는 점에서 unittest.skip와 다른 점 (비활성화 상태로 만든다), 반면에 SkipTest 목적은 테스트가 실행되는 동안 예상치 못한 일이 발생하면 발생하는 것입니다. 내가 맞아? 흥미 롭 네요.
coelhudo

unittest.skip(이유없이) Python 2에서는 오류가 발생하지만 Python 3에서는 오류가 발생하지 않습니다.
Akif

5

밑줄을 사용하여 테스트 케이스 메서드의 이름을 바꿉니다. test_myfunc는 _test_myfunc가됩니다.


3

문서 2.1은 무시하거나 건너 뛰 방법을 지정하지 않습니다.

일반적으로 필요한 경우 주석을 차단합니다.


1

질문의 "일시적으로 비활성화 된"부분에 초점을 맞춘 가장 좋은 대답은 사용 사례에 따라 다소 다릅니다. 저를 여기에 가져온 유스 케이스는 함수에 대한 테스트 주도 개발을하고 있다는 것입니다. 이 과정에서 나는 연속적으로 테스트를 작성하고 디버깅을 위해 함수에서 중단 점을 자주 사용합니다. 테스트 실행기를 실행할 때마다 모든 테스트를 실행하면 이미 작동하는 테스트의 중단 지점에서 중단됩니다. 함수 작성을 마치면 모든 테스트가 실행되기를 원하기 때문에 "건너 뛰기"를 추가하거나 테스트 이름을 뭉치는 것은 내가 원하는 것이 아닙니다. "건너 뛰기"를 사용했다면 돌아가서 "건너 뛰기 해제"해야합니다.

내 사용 사례의 경우 솔루션은 테스트 코드가 아니라 테스트 실행기에 있습니다. 나는 pytest를 사용 합니다 . pytest를 사용하면 명령 줄에서 단일 테스트를 쉽게 지정할 수 있습니다.

pytest PYTHON_FILENAME.TEST_CLASS.TEST_NAME

(대문자를 값으로 대체하십시오).

나는 그 질문이 python-unitest라는 것을 이해합니다. 나는 그것을 오랫동안 사용하지 않았습니다. pytest와 비슷한 것이 있다면 놀라지 않을 것입니다. 그렇지 않은 경우 pytest로 쉽게 전환 할 수 있습니다. 코드를 수정할 필요가 없습니다. 설치하고 테스트 실행기 명령을 변경하십시오.

또한 PyCharm Pro를 사용합니다. 내 테스트 코드를 보여주는 페이지에서 각 테스트의 정의 옆에 작은 아이콘이 있습니다. 해당 아이콘을 클릭하고 해당 테스트를 개별적으로 실행할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.