내가 표준 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와 그 변종에 관한 것입니다.
물론이 모든 것을 하나의 모듈에 포함 할 필요는 없습니다. (물론 내가 이런 식으로 정리하는 것이 가장 명확하지만, 테스트 할 유형마다 하나의 별도 테스트 모듈을 만들 수도 있습니다. 각 모듈은 추상 기본 클래스를 사용하여 모듈을 작성합니다.
오, 아주 좋은, 10x 알렉스 – zaharpopov
이 패턴을 사용하려고합니다. 'unitTest' 프레임 워크가 파생 클래스뿐만 아니라'MappingTestBase' 컨텍스트 내에서 테스트를 실행하기 때문에 에러가 발생합니다 (예 :'TypeError : 'NoneType'객체는 호출 가능하지 않습니다.) 이런 일이 발생하지 않도록하는 방법이 있습니까? ? – user200783
@PaulBaker, 확실하게, 예를 들어 'TestLoader' 클래스를 사용하여 매우 명확하게 실행하려는 테스트 스위트를 빌드 할 수 있습니다. https://docs.python.org/2/library/unittest.html#unittest.TestLoader를 참조하십시오. 예를 들어 그것을 서브 클래 싱하고'getTestCaseNames'를 오버라이드하여 테스트 메소드를 실행하고 싶지 않은 클래스에 대해'[]'를 반환하거나'self.dicttype이 None' 인 경우에만 반환하도록 모든 테스트 메소드를 꾸밀 수 있습니다. 접근 방식은 잘 작동합니다. –