Python unittest에서 setUp ()과 setUpClass ()의 차이점은 무엇입니까?


101

Python 프레임 워크 에서 setUp()와 의 차이점은 무엇입니까 ? 설정이 다른 방법보다 한 가지 방법으로 처리되는 이유는 무엇입니까?setUpClass()unittest

내가 설정의 일부가 이루어집니다 이해하려면 setUp()setUpClass()가진뿐만 아니라, 기능 tearDown()tearDownClass().

답변:


149

클래스에 테스트 메서드가 두 개 이상있을 때 차이가 나타납니다. setUpClasstearDownClass전체 클래스에 대해 한 번 실행됩니다; setUp그리고 tearDown전에 각 시험 방법 후 실행됩니다.

예를 들면 :

class Example(unittest.TestCase):
    @classmethod
    def setUpClass(cls):
        print("setUpClass")

    def setUp(self):
        print("setUp")

    def test1(self):
        print("test1")

    def test2(self):
        print("test2")

    def tearDown(self):
        print("tearDown")

    @classmethod
    def tearDownClass(cls):
        print("tearDownClass")

이 테스트를 실행하면 다음이 인쇄됩니다.

setUpClass
setUp
test1
tearDown
.setUp
test2
tearDown
.tearDownClass

(도트는 ( .)이다 unittest테스트가 통과 할 때의 기본 출력.) 것을 관찰 setUptearDown전후에 표시 test1 하고 test2 반면에, setUpClass그리고 tearDownClass한 번만 표시 전체 테스트 케이스의 시작과 끝에서.


명령이 이거 아니야? : setUpClass의 setUp TEST1의 tearDown .SETUP TEST2 .tearDown tearDownClass
재이 샤르마

"." tearDown과 "."의 부재 앞에서 tearDownClass 앞
Jai Sharma

아, 미안합니다. 아니요, 문제없이 완료 unittest될 때까지 테스트를 통과 한 것으로 간주하지 않습니다 tearDown.
Benjamin Hodgson

따라서 test1 및 test2 메서드 각각에는 자체 setUp 및 tearDown 세트가 있어야합니다. 귀하의 답변에서 test1에는 tearDown 메서드가 없으므로 기본 출력 (.)을 인쇄해야합니다. 틀 렸으면 말해줘.
Jai Sharma

1
대답의 출력은 정확합니다. unittest의 출력에서 ​​직접 붙여 넣었습니다. setUptearDown각 각 한 번씩 실행됩니다 test(이 예에서는 총 이렇게 두 번) 방법 만 setUpClass하고 tearDownClass바로 각 한 번 실행됩니다.
Benjamin Hodgson

15

Python 프레임 워크 에서 setUp()와 의 차이점은 무엇입니까 ?setUpClass()unittest

주요 차이점 (Benjamin Hodgson의 답변에서 언급했듯이)은 setUpClass한 번만 setUp호출되고 모든 테스트 전에 호출 되는 반면 각 테스트 직전에 호출 된다는 것입니다 . (주의 : Python뿐만 아니라 다른 xUnit 테스트 프레임 워크의 동등한 메서드에도 동일하게 적용됩니다 unittest.)

로부터 unittest 문서 :

setUpClass()

개별 클래스의 테스트가 실행되기 전에 호출되는 클래스 메서드입니다. setUpClass는 클래스를 유일한 인수로 사용하여 호출되며 classmethod ()로 데코 레이팅되어야합니다.

@classmethod
def setUpClass(cls):
    ...

과:

setUp()

테스트 픽스처를 준비하기 위해 호출 된 메서드입니다. 이것은 테스트 메서드를 호출하기 직전에 호출됩니다. AssertionError 또는 SkipTest 이외의이 메서드에서 발생한 모든 예외는 테스트 실패가 아닌 오류로 간주됩니다. 기본 구현은 아무것도하지 않습니다.

설정이 다른 방법보다 한 가지 방법으로 처리되는 이유는 무엇입니까?

질문의이 부분은 아직 답변되지 않았습니다. Gearon의 답변에 대한 내 의견에 따르면이 setUp방법은 모든 테스트에 공통적 인 고정 장치 요소를 의미합니다 (각 테스트에서 해당 코드가 중복되는 것을 방지하기 위해). 중복을 제거하면 (일반적으로) 가독성이 향상되고 유지 관리 부담이 줄어들 기 때문에 유용합니다.

setUpClass방법은 데이터베이스 연결 열기, 파일 시스템에서 임시 파일 열기, 테스트를 위해 공유 라이브러리로드 등과 같이 한 번만 수행하면되는 값 비싼 요소를위한 것입니다. 각 테스트 전에 이러한 작업을 수행하면 속도가 느려집니다. 테스트 스위트가 너무 많아서 모든 테스트 전에 한 번만 수행합니다. 이것은 테스트의 독립성이 약간 저하되지만 일부 상황에서는 필요한 최적화입니다. 틀림없이, 실물을 사용하지 않고 데이터베이스 / 파일 시스템 / 라이브러리 / 무엇이든 조롱하는 것이 일반적으로 가능하기 때문에 단위 테스트에서 그런 일을해서는 안됩니다. 따라서 setUpClass거의 필요하지 않습니다. 그러나 위의 예 (또는 유사)를 테스트해야 할 때 유용합니다.

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