2011-02-08 3 views
2

TMTOWTDI, 잘 모르겠습니다. 다차원 해시 (때로는 4-5 레벨)를 발견 할 때마다 Test :: Deep을 사용해 왔습니다. 지금 당장은 이러한 해시를 입력하고 예상 데이터를 채운 다음 cmp_deeply(actual, expected, msg)을 실행합니다. 누구도 이런 중첩 된 데이터를 테스트하는 단위에 대한 조언이 있습니까? - 현재의 방법은 대단히 비효율적 인 것처럼 보이고 때로는 데이터 구조의 단위 테스트 당 한 시간 이상 소요됩니다.Perl 유닛 심도 구조 테스트

+0

이러한 데이터 구조는 얼마나 큰가요? 시간은 당신이 다루는 데이터의 크기에 관계없이 엄청난 양의 런타임입니다. – Ether

+0

@Ether - 비교 루틴이 완전히 최적화되지 않았기 때문일 수 있습니까? 나는 항상 내 자신을 굴려야했다. (비교 공차와 커스텀 비교 방법 같은 멋진 요구 때문에) 재고가 얼마나 좋은지 모르겠다. 그러나 나는 원래 버전에 비해 광산을 크게 최적화 할 수 있었다는 것을 알고 있습니다. – DVK

+0

@DVK : 전화하는 방법에 따라 다릅니다. 예를 들어, Test :: Deep에는 객체의 여러 부분을 정확히 비교하는 방법을 정확하게 지정할 수있게 해주는 커스터마이징 함수 (noclass(), methods(), str() 등)가 많이 있습니다. 하지만 IMHO에서는 거의 자신 만의 롤을 만들어야 할 필요가 없습니다. 직접해야하는 유일한 시간은 DateTime 개체를 부정확하게 비교하는 것입니다 (예 : 서로 N 초 이내에 있는지 확인). – Ether

답변

2

나는 일반적으로 is_deeply에서 Test::More으로이 문제를 해결합니다. 나는 또한 일부 프로젝트에 Test::Differences을 사용했다 - 비평가에 대한 더 나은 결과를 갖는 것으로 보인다.

4

나는 다음 주석 자처럼 Test::Moreis_deeply을 사용하고 있습니다. 필자는 테스트를 수동으로 실행하고 적절한 경우 Data::Dumper을 사용하여 예상 값을 저장하는 t/sample/디렉토리를 사용하여 다소 자동으로 비교했습니다. (오, 나는 YAML - TMTOWTDI와 함께 갔으면 좋겠다.)

즉. 덤프 생성기를 한 번 실행하고 덤프 된 구조를 검토하고 커밋 한 다음 버그가 발생하거나 의도 한 구조가 변경 될 때까지 is_deeply에 의존하기 만하면됩니다.

0

아마도 OP는 실행 시간이 아닌 예상 값을 수동으로 입력하여 시간을 소비한다는 의미입니다. 구조가 잘 알려진 경우 Data :: Dumper 또는 Data :: Dump를 사용하여 프로그램에 포함 된 텍스트를 생성 한 다음 테스트에 통합 할 수 있습니다.

+0

안녕하세요, 저는 이것이 뜻하는 바입니다. 혼란에 대해 유감입니다. Data :: Dumper로 장난을 치지 만, 대부분의 경우 가장자리 구조의 구조는 잘 알려진 구조와 크게 다릅니다. 보통 관심이있다). 또한 Data :: Dumpers 출력을 사용하는 경우 데이터 구조가 수 백 줄에 걸쳐 있고 파일 자체가 필요하므로 수천 줄에 걸쳐 테스트 파일을 만들지 않는 한 테스트를 분리해야합니다. –

1

구조체를 테스트하려는 경우 Data::Validate::Struct을 시도하십시오.

모든 수준의 깊이가 될 수있는 실제 데이터 구조, 중첩 된 해시/배열의 조합과 비교할 참조 데이터 구조를 정의해야합니다.

여기서 가장 중요한 점은이 모듈이 실제 데이터가 아닌 데이터 형식의 유효성을 검사한다는 것입니다.

예 :

my $exp = { 
'body' => { 
    'results' => [ 
     { 
      'template' => [ 
       { 
        'origin' => 'word', 
        'name' => 'word', 
        'id' => 'int', 
        'attributes' => [ 
         { 
          'value' => 'number', 
          'key' => 'word' 
         }, 
         { 
          'value' => 'text' , 
          'key' => 'word' 
         } 
        ], 
        'hostname' => 'hostname', 
       } 
      ] 
     } 
     ] 
    } 
}; 

다음

my $v = new_ok('Data::Validate::Struct', [ $exp ]); 
ok($v->validate($act), 'validate an exp against an act' . $v->errstr()); 

이 모듈에 Tests 좀보고 $exp

시도에 대한 $act의 구조를 확인할 것, 나는 그것이 매우 유용하다고 .