Tombola 서브클래스 테스트 방법

매일 공부(ML)·2023년 2월 7일
0

Fluent Python

목록 보기
78/130

객체지향 상용구

인터페이스: 프로토콜에서 ABC까지

Tombola 서브클래스 테스트 방법

Tombola 캘르스를 테스트하기 위해서 사용한 스크립트는 클래스 계층구조를 조사할 수 있게 해주는 두 가지 클래스 속성을 사용한다.


subclasses()

클래스의 바로 아래 서브클래스의 리스트를 반환하는 메서드, 리스트에 가상 서브클래스는 들어가지 않는다.

_abc_registry

ABC에서만 사용할 수 있는 데이터 속성으로, 추상 클래스의 등록된 가상 서브클래스에 대한 약한 참조를 담고 있는 WeakSet이다.


#tombola_runner.py: Tomboia 서브클래스에 대한 테스트 실행 코드

import doctest
from tombola import Tombola

#테스트할 모듈
import bingo, lotto, tombolist, drum

TEST_FILE = 'tombola_tests.rst'
TEST_MSG = '{0:16} {1,attempted:2} tests, {1.failed:2} failed - {2}'

def main(argv):
	verbose = '-v' in argv
    real_subclasses = Tombola.__subclass__()
    virtual_subclasses = list(Tombola._abc_registry)
    
    for cls in real_subclasses + virtual_subclasses:
    	test(cls, verbose)
        
def test(cls, verbose = False):
	
    res = doctest.testfile(
    		TEST_FILE,
            globs = {'ConcreteTombola':cls},
            verbose=verbose,
            optionflags = doctest.REPORT_ONLY_FIRST_FAILURE)
            
    tag = "FAIL" if res.failed else 'OK'
    print(TEST_MSG.format(cls.__name__, res, tag))
    
if __name__ == '__main__':
	import sys
    main(sys.argv)

#tombola_tests.rst: Tombola 서브클래스를 테스트하기 위한 doctest
"""
Tombola 테스트
"""

Tombola의 모든 구상 서브클래스는 이 테스트를 통과해야 한다.

반복형에서 객체를 생성하고 로딩한다.

balls = list(range(3))
globe = ConcreteTomnpla(balls)
globe.loaded()
globe.inspect()

picks = []
picks.append(globe.pick())
picks.append(globe.pick())
picks.append(globe.pick())


상태와 결과를 확인한다.

globe.loaded()
sorted(picks) == balls

다시 로딩

globe.load(balls)
globe.loaded()
picks = [globe.pick() for i in balls]
globe.loaded()

객체가 비어 있을 때 "LookupEror"(이나 서브 클래스) 예외가 발생하는지 확인한다.

globe = ConcreteTombola([])
try:
	globe.pick()
except LookupError as exc:
	print('OK')
    

공 100개를 로딩하고 꺼내서 모두 제대로 나오는지 검증한다

balls = list(range(100))
globe = ConcreteTombola(balls)
picks =[]
while globe.inspect():
	picks.append(globe.pickt())
len(picks) == len(balls)
set(picks) == set(balls)
profile
성장을 도울 아카이빙 블로그

0개의 댓글