TMTOWTDI, 잘 모르겠습니다. 다차원 해시 (때로는 4-5 레벨)를 발견 할 때마다 Test :: Deep을 사용해 왔습니다. 지금 당장은 이러한 해시를 입력하고 예상 데이터를 채운 다음 cmp_deeply(actual, expected, msg)
을 실행합니다. 누구도 이런 중첩 된 데이터를 테스트하는 단위에 대한 조언이 있습니까? - 현재의 방법은 대단히 비효율적 인 것처럼 보이고 때로는 데이터 구조의 단위 테스트 당 한 시간 이상 소요됩니다.Perl 유닛 심도 구조 테스트
답변
나는 일반적으로 is_deeply
에서 Test::More으로이 문제를 해결합니다. 나는 또한 일부 프로젝트에 Test::Differences을 사용했다 - 비평가에 대한 더 나은 결과를 갖는 것으로 보인다.
나는 다음 주석 자처럼 Test::More과 is_deeply
을 사용하고 있습니다. 필자는 테스트를 수동으로 실행하고 적절한 경우 Data::Dumper을 사용하여 예상 값을 저장하는 t/sample/디렉토리를 사용하여 다소 자동으로 비교했습니다. (오, 나는 YAML - TMTOWTDI와 함께 갔으면 좋겠다.)
즉. 덤프 생성기를 한 번 실행하고 덤프 된 구조를 검토하고 커밋 한 다음 버그가 발생하거나 의도 한 구조가 변경 될 때까지 is_deeply
에 의존하기 만하면됩니다.
아마도 OP는 실행 시간이 아닌 예상 값을 수동으로 입력하여 시간을 소비한다는 의미입니다. 구조가 잘 알려진 경우 Data :: Dumper 또는 Data :: Dump를 사용하여 프로그램에 포함 된 텍스트를 생성 한 다음 테스트에 통합 할 수 있습니다.
안녕하세요, 저는 이것이 뜻하는 바입니다. 혼란에 대해 유감입니다. Data :: Dumper로 장난을 치지 만, 대부분의 경우 가장자리 구조의 구조는 잘 알려진 구조와 크게 다릅니다. 보통 관심이있다). 또한 Data :: Dumpers 출력을 사용하는 경우 데이터 구조가 수 백 줄에 걸쳐 있고 파일 자체가 필요하므로 수천 줄에 걸쳐 테스트 파일을 만들지 않는 한 테스트를 분리해야합니다. –
구조체를 테스트하려는 경우 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
의 구조를 확인할 것, 나는 그것이 매우 유용하다고 .
- 1. 유닛 데이터 구조 테스트
- 2. 유닛 테스트 디렉토리 구조
- 3. 유닛 테스트 적절한 데이터 구조 생성
- 4. UI 테스트 대 유닛 테스트
- 5. 유닛 통신 프로토콜 테스트
- 6. 유닛 테스트 초보자
- 7. 유닛 테스트 콘솔 출력
- 8. 유닛 테스트 with Maven
- 9. 어떻게 유닛 테스트 DelegateCommand
- 10. 싱글 톤으로 유닛 테스트
- 11. 유닛 테스트 LinqToSqlDomainService
- 12. 유닛 테스트 및 설비
- 13. openGl 디스플레이의 유닛 테스트
- 14. 유닛 테스트 단위
- 15. 유닛 테스트 애플리케이션 레이어
- 16. 유닛 테스트 병렬 실행
- 17. 유닛 테스트 설정 방법
- 18. 유닛 테스트 용어
- 19. 유닛 테스트 조직
- 20. 상위 레벨에서 유닛 테스트
- 21. 스프링 유닛 테스트
- 22. 유닛 웹 GUI 테스트
- 23. Ruby의 비동기 유닛 테스트
- 24. 레일 유닛 테스트 협회
- 25. 유닛 테스트 NHibernate UserTypes
- 26. 유닛 테스트 설치자
- 27. iPhone 수락/유닛 테스트
- 28. 유닛 테스트 C#
- 29. WPF 유닛 테스트 DirectoryNotFoundException
- 30. 구문 분석을위한 Perl 프로그램 구조
이러한 데이터 구조는 얼마나 큰가요? 시간은 당신이 다루는 데이터의 크기에 관계없이 엄청난 양의 런타임입니다. – Ether
@Ether - 비교 루틴이 완전히 최적화되지 않았기 때문일 수 있습니까? 나는 항상 내 자신을 굴려야했다. (비교 공차와 커스텀 비교 방법 같은 멋진 요구 때문에) 재고가 얼마나 좋은지 모르겠다. 그러나 나는 원래 버전에 비해 광산을 크게 최적화 할 수 있었다는 것을 알고 있습니다. – DVK
@DVK : 전화하는 방법에 따라 다릅니다. 예를 들어, Test :: Deep에는 객체의 여러 부분을 정확히 비교하는 방법을 정확하게 지정할 수있게 해주는 커스터마이징 함수 (noclass(), methods(), str() 등)가 많이 있습니다. 하지만 IMHO에서는 거의 자신 만의 롤을 만들어야 할 필요가 없습니다. 직접해야하는 유일한 시간은 DateTime 개체를 부정확하게 비교하는 것입니다 (예 : 서로 N 초 이내에 있는지 확인). – Ether