2010-03-28 2 views
7

테스트 그룹에 대한 내 unittest 기반 클래스 테스트를 구성하는 데 문제가 있습니다. 예를 들어 "사전"인터페이스를 구현한다고 가정하고 5 가지 구현을 테스트하려고합니다.unittest는 클래스 패밀리에 대한 재사용을 테스트합니다.

사전 인터페이스를 테스트하는 테스트 클래스 하나를 작성합니다. 하지만 어떻게 모든 수업을 테스트하기 위해 잘 재사용 할 수 있습니까? 지금까지 내가 못생긴 :

DictType = hashtable.HashDict 

테스트 클래스에서 DictType을 사용하십시오. 다른 클래스를 테스트하기 위해 수동으로 DictType을 다른 것으로 변경합니다.

그렇지 않으면 어떻게해야합니까? unittest 클래스에 인수를 전달할 수 없으므로 더 좋은 방법이 있습니까?

답변

5

내가 표준 unittest으로이 문제를 해결하는 방법은 서브 클래 싱하는 것입니다. 데이터를 재정의하는 것은 결국 데이터를 무시하는 방법만큼이나 쉽습니다.

class MappingTestBase(unittest.TestCase): 
    dictype = None 
    # write all the tests using self.dictype 

과 서브 클래스 : 여기

class HashtableTest(MappingTestBase): 
    dictype = hashtable.HashDict 

class OtherMappingTest(MappingTestBase): 
    dictype = othermodule.mappingimpl 

, 서브 클래스는 dictype를 오버라이드 (override) 할 필요

그래서, 나는 테스트에 대한 기본 클래스가 있습니다. 때로는 MappingTestBase "후크 메소드"를 사용하는 것이 더 간단합니다. 테스트되는 유형이 모든 경우에서 정확히 동일한 인터페이스를 갖지 않을 경우, 필요에 따라 서브 클래스가 훅 메소드를 대체하도록함으로써이를 해결할 수 있습니다. 이는 "템플릿 메소드"디자인 패턴입니다 (예 : this page은 디자인 패턴에 관한 몇 가지 비디오 강연 모음을 주석으로 달고 타임 라인을 찍었습니다. 파트 II는 약 30 분 동안 Template Method와 그 변종에 관한 것입니다.

물론이 모든 것을 하나의 모듈에 포함 할 필요는 없습니다. (물론 내가 이런 식으로 정리하는 것이 가장 명확하지만, 테스트 할 유형마다 하나의 별도 테스트 모듈을 만들 수도 있습니다. 각 모듈은 추상 기본 클래스를 사용하여 모듈을 작성합니다.

+0

오, 아주 좋은, 10x 알렉스 – zaharpopov

+0

이 패턴을 사용하려고합니다. 'unitTest' 프레임 워크가 파생 클래스뿐만 아니라'MappingTestBase' 컨텍스트 내에서 테스트를 실행하기 때문에 에러가 발생합니다 (예 :'TypeError : 'NoneType'객체는 호출 가능하지 않습니다.) 이런 일이 발생하지 않도록하는 방법이 있습니까? ? – user200783

+0

@PaulBaker, 확실하게, 예를 들어 'TestLoader' 클래스를 사용하여 매우 명확하게 실행하려는 테스트 스위트를 빌드 할 수 있습니다. https://docs.python.org/2/library/unittest.html#unittest.TestLoader를 참조하십시오. 예를 들어 그것을 서브 클래 싱하고'getTestCaseNames'를 오버라이드하여 테스트 메소드를 실행하고 싶지 않은 클래스에 대해'[]'를 반환하거나'self.dicttype이 None' 인 경우에만 반환하도록 모든 테스트 메소드를 꾸밀 수 있습니다. 접근 방식은 잘 작동합니다. –

0

testscenarios에서 시나리오 목록을 설정할 수 있습니다. {: hashtable.HashDict dicttype}, {dicttype 코드는 그래서 귀하의 경우 시나리오는 [같은 목록이 될 것

목록의 각 값/시나리오에 대한 테스트 클래스의 버전 the example

보기를 생성 : otherimpl.class},] 테스트 코드에서 self.dicttype을 사용하십시오.

+0

아, 표준 단위 테스트만으로는 불가능합니다. 매우 dissapointing :-( – zaharpopov

+0

아직 - http://www.voidspace.org.uk/python/articles/unittest2.shtml 무엇을하고 있는지에 대한 참조 – Mark

관련 문제