2013-10-05 2 views
1

(예 : 단위 테스트의 어설 션) 생성자 개체를 인트로 스하는 기술이 있습니까?생성기 개체에 대한 어설 션

>>> raw_data = ["${}".format(RND.randint(10, 100)) for c in range(10)] 

>>> # a function that does some sort of of transform 
>>> fnx = lambda q: float(q.replace('$', '')) 

>>> d1 = [fnx(itm) for itm in raw_data] 
: 어떤 임의의 데이터를 생성

: 구체적

나는 작은과 같이 종종 지능형리스트 또는 발전기 식 내부 값에 적용 함수들의 시퀀스로 구성된 데이터 처리 파이프 라인을 가지고

다음 단계에서 다른 변환 함수는 d1 등의 항목에 적용됩니다.

>>> assert len(d1) == 10 

: prices_clean, 또는 등의 값의 최소/최대에의 길이 예를 들어 바로 위의 경우에

, 주장은, 내 단위 테스트 스위트의 핵심입니다 난 그냥이 중간 결과를 반복하기 위하여려고하고 주어진, 내가 실제로 발생 오브젝트 할 것, 목록이 필요하고, 훨씬 낮은 메모리 프로파일을 제공하지 않는, 즉 내가 무엇을 사용 : 물론

>>> d1 = (fnx(itm) for itm in raw_data) 

주장은 내가 언제 의지하는지에 달려있다. 사용 지능형리스트는 발전기 개체를 사용할 수 없습니다 :

>>> d1 
    <generator object <genexpr> at 0x106da9230> 

>>> assert len(d1) == 10 
    Traceback (most recent call last): 
    File "<pyshell#33>", line 1, in <module> 
    assert len(d1) == 10 
    TypeError: object of type 'generator' has no len() 

난 그냥 어설위한 발전기 객체)을 목록 (호출해야 다음 내 테스트 스위트가 불행한 실제 결과 (매우 느리게 실행되는 경우 DEBS 종종 전혀 실행하지 않음).

내가 유용하게 내성을 가질 수있는 생성기 개체의 특성을 살펴 봤지만 여기서 설명한 방법으로 어떻게 자주 사용할 수 있는지 알지 못했습니다.

+0

생성기는 객체 :

경우 발전기 요소의 적은 수의 생산 :

보통 나는 다음 중 하나를 수행 실제로 실제로 작동하고 반환 할 결과가 몇 개인 지 미리 알지 못합니다. 실제로 그것을 소비하는 것 이외의 발전기의 "길이"를 얻을 방법이 없습니다. – georg

+0

생성 된 순서를 검사하려면'the_sequence = list (the_generator)'를 수행 한 다음'the_sequence'에 대한 모든 assert를 수행하십시오. 이렇게하면 모든 * single * assert에 대해'list'를 호출하는 것을 피할 수 있습니다 (길이와 내용을 단일 실행으로 지정할 수 있기 때문에). – Bakuriu

답변

1

@ thg435는 주석을 사용하지 않았으므로이를 사용하지 않고 생성기의 길이를 알 수 없습니다.

assert len(list(d1)) == 10 

또는

assert sum(1 for x in d1) == 10