2012-02-12 2 views
4

단위 테스트 및 작성/예외 사용에 새로운 기능입니다. 현재 모범 사례를 배우고이를 내 프로젝트에 통합하기 위해 많은 노력을 기울이고 있습니다. 내가 읽은 몇 가지 것들의 테스트로서 간단한 계약 모듈을 썼다. 아래는 서로 의존하는 몇 가지 인수가있는 계약 클래스의 init입니다.클래스의 __init__ 메소드에 대한 단위 테스트하기

인수 의존성을 기반으로 init 메소드에 대한 테스트를 작성하는 방법은 무엇입니까?

미리 감사드립니다.

def __init__(self, code, description ,contract_type, 
      start_date ,end_date ,reminder_date, 
      customer=None, isgroup=False, vendor=None, 
      discount_perc=None): 

    contract_types = ['item','vendor'] 
    self.code = code 
    self.description = description 
    self.contract_type = contract_type 
    self.start_date = start_date 
    self.end_date = end_date 
    self.reminder_date = reminder_date 
    if contract_type not in contract_types: 
     raise AttributeError("Valid contract types are 'item' & 'vendor'") 
    if isgroup: 
     if customer: 
      raise AttributeError("Group contracts should not have 'customer' passed in") 
     self.is_group_contract = True 
    else: 
     if customer: 
      self.add_customer(customer) 
     else: 
      raise AttributeError('Customer required for non group contracts.') 
    if contract_type == 'vendor': 
     if vendor and discount_perc: 
      self.vendor = vendor 
      self.discount_perc = discount_perc 
     else: 
      if not vendor: 
       raise AttributeError('Vendor contracts require vendor to be passed in') 
      if not discount_perc: 
       raise AttributeError('Vendor contracts require discount_perc(Decimal)') 

이 유형의 질문이 적합하지 않은 경우 어디로가는 것이 좋을까요?

+0

IIRC, programmers.stackexchange.com은 코드 검토/리팩터링 질문에 더 좋습니다. –

+0

즉, 한 가지 아이디어는 일이 잘못 될 수있는 방법의 수를 단순히 줄이는 것입니다. 별도의'customer'와'isgroup' 매개 변수를 갖는 대신'customer'에 대한 특별한'GROUP' 값을 사용하여 그룹 계약을 표시하십시오. –

+1

두 개의 첫 번째 질문이 CodeReview에서 더 잘 맞지만 세 번째 테스트 (테스트)는 적합하다고 생각합니다. 어쩌면 질문을 두 개로 나눌 수 있습니다. – joaquin

답변

3

나는 다양한 입력 조합을 기반으로하는 (클래스 또는 정적이 아닌) 방법 테스트 예상 출력과 비슷한 __init__을 처리 할 것입니다. 그러나 그 외에도 싱글 톤 객체를 반환하거나 반환하지 않는 요구 사항에 따라 테스트 할 것입니다.
그러나 싱글 톤 테스트를 __new__- 관련 테스트 케이스로 추출하는 것을 선호 할 수 있습니다.

  1. 잘못된 인수 '유형의 처리 (빈 /하지 빈 문자열, 정수, 튜플, dicts 등) :

    결국 당신을위한 테스트를해야합니다.

  2. 잘못된 인수 조합 처리 (예외가 발생한 경우).
  3. 선택적 인수 존재/부재 처리 (기본값은 작동하고 사용자 정의도 수행함 등).
  4. 유효한 인수 조합 처리 (양수 흐름 작동).
  5. 결과 개체의 특성 유무와 값 (가장 확실하게 다른 방법에서는 해당 개체에 의존합니다).
  6. 결과 개체가 싱글 톤 (또는 아님)입니다.
  7. ???

또 다른 팁 : 클래스 속성에 contract_types = ['item','vendor']을 추출하면 비즈니스 로직 테스트 조직에 도움이됩니다.

관련 문제