2013-02-18 4 views
6

저는 Python 프로젝트의 테스트 스위트를 unittest에서 nose로 변환하고 있습니다. 프로젝트의 기존 프레임 워크 (unittest 기반)는 테스트 검색 및 실행을 위해 많이 사용자 정의 된 코드가 많이 들어있어 다소 부담 스럽습니다. 따라서 모든 것을보다 간소화하기 위해 코로 마이그레이션하려고합니다.Python 코 테스트 상속 : 서브 클래스에서 단위 테스트 픽스를로드하십시오.

그러나 테스트 스위트를 생성하는 코드에 문제가 있습니다.

프로젝트의 프레임 워크에는 테스트를 실행하는 두 가지 방법이 있습니다. 하나는

class TestSomething(unittest.TestCase): 

    def setUp(self): 
     ... 

    def test_x(self): 
     ... 

    def test_y(self): 
     ... 

suite = unittest.TestSuite() 
suite.addTest(unittest.makeSuite(TestSomething)) 

입니다. 이는 "간단한"방법이며, 모든 Nose 예제 및 튜토리얼에서 보여 주며 작동합니다. 그러나, 두 번째 방법은 다음 슈퍼 클래스에서 테스트를 다른 설치 구성을 포함하고 상속 다양한 서브 클래스에서 테스트 케이스를 만들고, 모든 테스트 로직을 포함하는 테스트 클래스를 정의하는 것입니다 :

class TestSomething(unittest.TestCase): 

    def test_x(self): 
     ... 

    def test_y(self): 
     ... 

class TestCase1(TestSomething): 

    def setUp(self): 
     ... 

class TestCase2(TestSomething): 

    def setUp(self): 
     ... 

suite = unittest.TestSuite() 

cases = [TestCase1,TestCase2] 
suite.addTests([unittest.makeSuite(case) for case in cases]) 

이 코가 실패 할 것입니다 와. 수퍼 클래스에 setUp()이 없으며 test_x() 및 test_y()에 사용 된 많은 변수가 아직 정의되지 않았기 때문에 분명히 작동하지 않는 테스트 메소드를 먼저 실행하려고 시도합니다.

어디서나이 예제를 찾지 못했지만 Nose (다소 조잡하고 탐색하기가 힘듭니다) 설명서에서도 언급하지 않았습니다. 코를 어떻게 작동시킬 수 있습니까? 어떤 도움이라도 대단히 감사하겠습니다.

답변

13

우선, unutbu는 에 Test으로 시작하는 이름을 지정하면 안됩니다. 왜냐하면 nose은 테스트 케이스와 같은 클래스를 자동으로 처리하기 때문입니다. 또한, nose 따라서하고, 그가 발견 한 모든 TestCase 서브 클래스를 실행 :

class Something(unittest.TestCase): 
    ... 

정확히 당신이 겪고있는 동일한 결과를 제공합니다.

class Something(object): 
    def test_x(self): 
     # here the various assertEqual etc. do not resolve, but you can use them 
     # as if they were present, since in real test-cases they will be inherited 
     # from unittest.TestCase. 
     ... 
    ... 

class TestCase1(unittest.TestCase, Something): 
    def setUp(self): 
     ... 

이 작업을 수행하려는 다른 방법은 설정하는 것입니다 클래스의 __test__ 속성 False에 : 나는 당신이 TestCase에서 상속과 믹스와 같이 클래스를 사용하지한다고 생각

class TestSomething(unittest.TestCase): 
    __test__ = False 
    def test_x(self): 
     ... 


class TestCase1(TestSomething): 
    __test__ = True #must put this 
    def setUp(self): 
     ... 

다른 방법

@tools.nottest 
class TestSomething(unittest.TestCase): 
    def test_x(self): 
     ... 

@tools.istest 
class TestCase1(TestSomething): 
    sef setUp(self): 
     ... 
+0

코 장식을 사용 : 테스트 케이스이며, 어느 것이하지 않은 클래스 표시 nose.istestnose.nottest을 사용할 수 있습니다 s는 속임수를했다. 되돌아 보면 지금은 매우 분명해 보입니다 만 때로는 가장 확실한 솔루션은 가장 애매한 솔루션입니다 ... 팁에 대해 많은 감사를드립니다! – Boris