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)