2014-11-23 2 views
1

저는 EUnit으로 테스트를하고 있습니다. 테스트중인 단위 중 일부는 파일 (consult/1)을 통해 데이터 파일을 읽어야합니다. 내 테스트는 /priv에서 사용할 수있는 데이터에 대한 가정을하지만 데이터는 프로덕션 환경에 따라 다릅니다. 이것을 달성하는 가장 좋은 방법은 무엇입니까?테스팅과 프로덕션을 위해/priv에서 다른 데이터를 사용하는 것이 가장 좋습니다.

저는 얼랑 (Erlang)의 초보자이고 저에게보기 싫은 몇 가지 해결책을 생각했습니다. 예를 들어,

  • /PRIV에서 두 파일을 넣고 매크로를 사용하여 (예를 들어, "-ifdef (EUNIT는)") 파일에 전달하는 하나의 결정 :/1에 문의하십시오. 이것은 너무 연약하고/오류가 발생하기 쉬운 것 같습니다.
  • 오른쪽 파일을 /priv으로 복사하려면 보강 철근을 가져옵니다.

또한 근본적으로 잘못된 것을하려는 경우 자유롭게 지적하십시오. 그럴 수도 있습니다.

더 좋은 방법이 있나요?

답변

1

나는 두 가지 해결책 모두 효과가있을 것이라고 생각합니다. 그러한 테스트를 유지하는 것이 오히려 문제이며, 둘 다 일부 외부 설정 (파일이 있고, 라이트 데이터가 있음)에 의존합니다.

주어진 테스트에 로컬 파일의 내용을 유지하는 가장 쉬운 방법은 조롱입니다. file:consult/1 원하는 값을 반환합니다.

두 가지 작업을 수행 할 수 있습니다.

우선, file:consult/1을 테스트하지 않아야합니다. 그것은 표준 라이브러리의 일부이며 모든 라이트에서 작동한다고 가정 할 수 있습니다. 이 작업을 수행하는 대신이 파일에서 읽은 데이터를 사용하는 함수를 테스트해야합니다. 물론 "테스트에서 생성 된"데이터를 전달합니다. 데이터 소스와 구문 분석 (작동) 사이에 좋은 구분을 제공합니다. 그리고 나중에 file:consult을 외부 서비스 또는 이와 유사한 것으로 대체하는 것이 더 간단 할 수 있습니다.

다른 것은 테스트 할 때 문제가있는 것은 당신에게 나쁜 냄새의 징후가되어야한다는 것입니다. 시스템을 재 설계하는 것에 대해 조금 생각할 수도 있습니다. 나는 당신이해야한다는 말은 아니지만 그런 문제는 정당화하는 좋은 지표입니다. 일부 기능 x를 테스트하고 프로덕션 및 기타 테스트 (파일 하나 또는 다른 읽기)에서 한 방향으로 작동하려면이 동작을 테스트 용으로 주입해야합니다. 또는 다른 말로 표현하자면,이 함수는 매개 변수가되도록 파일을 읽어야합니다. 여전히 생산 코드의 기능을 일부 "읽을 수있는 기본 파일을"하고 싶은 경우에, 당신은 당신의 테스트를 위해 더 이상 그것은 당신이 생산에 짧은 버전을 사용 할 수 있도록이

function_with_file_consult(A, B, C) -> 
    function_with_file_consult(A, B, C, "default_file.dat"). 


function_with_file_consult(A, B, C, File) -> 
    [ ... actual function logic ... ] 

같은 것을 사용하고, 수 .

+0

감사합니다. @ mpm! 그냥 명확히하기 위해 : 나는 파일을 테스트하지 않을 것이다 : consult/1 그 자체이다. 그리고 나의 어플리케이션은 생산과 테스트에서 같은 행동을 할 것이다. file : consult/1은 여러 도시에 대한 정보가 들어있는 데이터 파일을 읽고, 예를 들어 알 수없는 도시를 참조 할 때 자신의 함수를 테스트하려고합니다. – Gustavo

+0

예, 알고 있습니다. 내 말은'file : consult'를 내부적으로 호출하는 함수를 테스트해서는 안된다는 것입니다. 물론 가능하다면.그리고 "당신은"다른 접근 방식이 더 유익 할 수도 있다고 생각할 가치가 있다는 것을 의미하지는 않습니다 (물론 그렇지 않을 수도 있음). – mpm

관련 문제