2015-01-23 3 views
2

여기서는 유닛 테스트가 필요한 서브 루틴에 대한 의사 코드를 제공하고 있습니다.Perl에서 Unit 테스트를 위해 서브 루틴을 조롱 할 수 있습니까?

sub get_detail_team(param1,param2){ 

    my $dbh = connect to databasehandle 
    my sql = get_sql_details(param1,param2) 
    my $sth = $dbh->prepare($sql) 
     $sth->execute() 
    my $result = $sth->fetchall_arrayref(); 

return get_html_content($result,prama) 
} 

get_sql_details() 및 get_html_content()는 동일한 패키지에 서브 루틴이다. get_detail_team() 함수를 어떻게 단위 테스트 할 수 있습니까?

나는이 Test::Mockmodule을 사용해 보았지만 정확한 결과를 얻지 못했습니다.

+2

예상대로 작동하지 않는 모의 코드를 표시 할 수 있습니까? – Schwern

답변

5

나는 이것이 조롱을위한 좋은 후보라고 생각하지 않습니다.

첫 번째 문제는 get_detail_team이며 두 가지 작업을 수행하면 데이터가 형식이됩니다. 형식화 된 데이터는 데이터 구조보다 테스트하기가 어렵습니다. 기능에서 형식을 분리하면 테스트하기가 훨씬 쉬워지고 형식 작성기를 더 쉽게 추가 할 수 있습니다. 나중에 하나의 추출 방법 리팩토링 ...

sub get_detail_team_data($param1, $param2) { 
    my $dbh = connect_to_database; 
    my $sql = get_sql_details($param1, $param2); 
    my $sth = $dbh->prepare($sql) 
    $sth->execute(); 
    return $sth->fetchall_arrayref(); 
} 

sub get_detail_team($param1, $param2) { 
    my $detail_team = get_detail_team_data($param1, $param2); 
    return get_html_content($detail_team); 
} 

이제 데이터 만 테스트 할 수 있습니다. get_detail_team_data을 보면 약 get_sql_details 인 얇은 래퍼 일뿐입니다. get_sql_details을 테스트하려면 SQL을 가져 와서 가정 된 데이터를 가져 오는 지 확인하십시오 (get_detail_team_data). 기본 통합 테스트가 get_sql_detailsget_detail_team_data에 초점을 맞출 수도 있습니다. 따라서 데이터베이스 연결 문제가 발생합니다.

나는 모든 외부 서비스가 제거되었다는 것을 너무 조롱하는 팬이 아닙니다. SQL을 작성하려면 SQL 데이터베이스가 필요합니다. 그렇지 않으면 실제로 기능을 테스트하지 않습니다. 프로덕션 데이터베이스와 일치하는 스키마가있는 테스트 데이터베이스가 있다고 가정합니다. 테스트 결과 스크립트의 끝 부분에서 원하는 데이터로 롤백하고 롤백 할 수 있습니다.

가장 간단한 방법은 connect_to_database을 작성하여 테스트 환경 변수를 테스트 데이터베이스에 연결하는 것입니다. 전체 시스템이 전체 테스트 스위트가 이용할 수있는 구성 정보를 찾는 위치를 제어하는 ​​환경 변수를 갖는 것이 더 좋습니다.

get_detail_team은 많은 테스트를해볼 가치가 없습니다. 단지 얇은 래퍼 일뿐입니다. 기본 통합 테스트를 작성하고 데이터 구조를 전달할 수있는 get_html_content 테스트에 집중하십시오.

관련 문제