조롱 할 수없는 구체적인 외부 구현에 의존하는 코드 테스트를 어떻게 작성합니까?


17

배경 : 작업중인 모듈에 대한 일부를 만들어 동료들에게 단위 테스트 개념을 소개하려고합니다. 최근 요구 사항이 변경되었고 더 많은 추상화 / 상호 작용이 필요하므로 응용 프로그램을 수동으로 찌르지 않고도 작동을 "증명"하는 일련의 테스트를 개발하는 좋은 방법 인 것 같습니다.

그러나 문제는 모듈이 PDF 및 XSL과 같은 다루기 힘든 외부 요소에 의존한다는 것입니다. 기본적으로 데이터베이스에서 XML을 읽고 XSL 변환을 적용한 다음 ABCPDF라는 라이브러리를 사용하여 PDF로 변환합니다. 그런 다음이 PDF는 정적 템플릿을 기반으로 다른 PDF와 병합됩니다. XML을 테스트하고 값이 올바른지 확인할 수 있지만 잠재적 인 버그와 문제 중 상당수는 완성 된 문서의 실제 표시와 관련이 있습니다 (예 : 특정 HTML 영역이있는 텍스트 문자열이 줄 바꿈되는 시간과 같은 세부 사항) 이러한 것들을 테스트하는 것도 가능합니까? (이것은 아마도 통합 테스트이거나 .. 이름이 [허용 테스트가 아닌 다른 종류를 잊어 버렸고 단위가 아닌) 세 번째 종류의 테스트라는 것을 알고 있습니다. 필자가 아는 바에 따르면 PDF를 작성하고 다시 읽거나 HTML 문자열 (예 : 변환 된 XML)을 작성하고 손으로 파싱하여 특정 테이블 셀의 존재 여부를 확인하는 것보다 쉽게 ​​PDF를 모방 할 수 없기 때문에 다른 테이블 셀과의 관계.

이와 같은 상황에서 정보가 정확하고 PDF를 만들 거나 병합 할 수 있는지 또는 실제 디스플레이 문제에 대한 수동 테스트에 의존 할 있는 단위 테스트에만 집중해야 합니까?


6
"모의 할 수없는 외부 요인"은 처음에 단위 테스트를 수행하지 않는다는 힌트입니다 . 그것은 통합 테스트를 의미 합니다. 어느 쪽을 원하십니까? 시험 단위 당신의 코드 또는이의 통합 테스트 복합 것은? 동시에 이야기하기가 어렵 기 때문에 하나 또는 다른 것을 선택하십시오.
S.Lott

2
나는 "수용 불가"를 사지 않습니다. 나는 "모의하는 법을 모른다"는 사실을 받아 들일 것입니다. 이것은 당신의 실제 질문이 "어떻게 모의합니까?"라는 것을 의미합니다.
Rein Henrichs

아마도 :) 사용 된 XML을 조롱하는 데 익숙하지만 서식이 중요한 실제 PDF 또는 HTML 문서를 조롱하는 방법에는 익숙하지 않습니다.
웨인 몰리나

1
"기능"(응용 프로그램 종단 간) 또는 "시스템"(여러 응용 프로그램 종단 간) 테스트를 의미한다고 생각합니다.
Gary Rowe

@ 게리-네, 기능적 단어였습니다. 나는 이제 Rails를 배워서 기억합니다 : 단위 테스트 모델, 기능 테스트 컨트롤러, 통합 테스트.
웨인 몰리나

답변:


13

장치가 아닌 기능 테스트

알려진 xml 입력을 사용하여 PDF를 출력하고 수동으로 (그리고 세 심하게) 그것이 올바른지 확인하십시오. 그런 다음 참조로 저장하십시오.

동일한 xml 입력을 사용하는 향후 테스트는 이진 파일을 참조와 비교할 수 있습니다.

파일 수준 비교가 만족스럽지 않은 경우 테스트가 끝날 때 PDF를 표시하고 스크린 샷을 만든 다음 자동 테스트를 참조 스크린 샷과 비교하십시오.


이 수준의 최종 결과에만 관심이 있기 때문에 +1입니다. PDF를 얻는 방법에 대한 구현을 변경하면 기능 테스트를 변경할 필요가 없습니다.
게리 로우

2
좋은 조언을 얻으려면 +1하십시오. 이것이 현재 프로젝트에서 수행하는 작업입니다. PDF 비교를 수행하기위한 사용자 정의 도구 세트를 구축하여 타임 스탬프와 같은 문서에서 변경되는 부분을 생략 할 수 있습니다. 주의 사항 : 다른 (버전의) PDF 렌더러로 전환하면 레이아웃이 미묘하게 변경되어 오 탐지 신호 힙과 바이너리를 직접 비교할 수 있습니다.
Péter Török

5

일반적으로 이와 같은 경우 인터페이스로 사용할 수있는 구현 뒤에서 테스트 할 수없는 모든 것을 추상화합니다. 합리적인 것처럼 보이기 때문에 PDF 빌더와 같은 바보 같은 일을 할 것입니다.

public class PdfBuilder : IPdfBuilder
{
  public byte[] BuildPdf(...)
  {
    // actual untestable code here
  }
}

public interface IPdfBuilder
{
  byte[] BuildPdf(...);
}

그런 다음 테스트에서 IPdfBuilder를 조롱하여 원하는 작업을 수행 할 수 있습니다. 이것은 종종 IoC 컨테이너 사용을 시작해야 함을 의미합니다 ( /programming/871405/why-do-i-need-an-ioc-container-as-opposed-to-straightforward-di-code/programming/21288/which-net-dependency-injection-frameworks-are-worth-looking-in to start) (지금 사용하지 않는 경우)

단위 테스트가 아닌 테스트를 통합 테스트라고도합니다. 복잡한 통합 테스트는 그다지 가치가없는 경우가 많으므로 해당 부분을 추상화하고 해당 추상화에서 비즈니스 로직의 양을 줄이면 단위 테스트에서 테스트 할 수 있습니다.

이것이 명확하지 않은 경우 알려주십시오.


테스트 할 수없는 코드를 숨기려면 +1입니다. 당신이 올바른 결과를 얻기 위해 해당 인터페이스를 통과해야하는 어떤 운동 등에 대한 단위 테스트 때까지 당신은 수동 테스트를 할 수 있다는 귀하의 회귀 단위 테스트를 얻기 위해 적절하게 생성되는.
Ethel Evans

1

나는 아주 비슷한 것을 지었고 기본 시각적 테스트를 사용했습니다. 테스트를 자동화 할 필요는 없으므로 예상되는 결과를 찾는 것만으로도 아무런 문제가 없습니다 (분명히 다양한 상황에서). 종종 그림은 영상이 관련된 수천 번의 테스트 가치가 있습니다. 자동화 된 단위 테스트를 광범위하게 사용하지만 일부 사람들은 GUI 테스트 또는 시각적 IMHO에 들어갈 때 약간 벗어날 수 있다고 생각합니다. 특정 제품의 경우,이 "충분한"접근 방식으로는 YMMV가 충분하지 않다는 것을 알고 있습니다.

그러나 나는 조롱 할 수없는 외부성에 대해 약간 걱정할 것이다. 이것은 타이트한 커플 링의 징후 일 수 있습니다. 일반적으로 피할 수있는 좋은 방법이지만 자세한 내용 없이는 코드를 너무 많이 추측하지는 않습니다.


매우 밀접하게 결합되어 있지만 느슨하게 결합 할 수있는 바이 인이 없으며 리팩토링에 자원이 없기 때문에 해결할 수없는 영역입니다 (그러나 완전히 다른 문제 세트입니다).
Wayne Molina
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.