답변:
항상 외부 자원과 함께 TDD에서와 같이 파일 시스템 조작에 대한 하나 이상의 인터페이스를 작성하고 "모방"합니다. 파일 시스템 작업 자체가 아니라 "테이블 생성기"와 메타 데이터 수정 코드를 테스트하려고합니다 (파일 시스템에 액세스하기 위해 기성품 라이브러리 구현을 사용하고있을 것입니다).
"테스트"파일 시스템에 문제가 있습니까?
작업을 테스트하기에 충분한 내용이있는 템플릿 폴더 / 디렉토리 구조를 만듭니다.
단위 테스트를 설정하는 동안이 초기 구조를 복사하십시오 (템플릿을 압축하고 테스트 영역으로 압축 해제하는 것이 좋습니다). 테스트를 실행하십시오. 분해하는 동안 모든 것을 삭제하십시오.
조롱 문제는 먼저 프로젝트에 속하는 파일 시스템, OS 및 데이터베이스가 실제로 외부 리소스로 자격이 없으며 둘째로 낮은 수준의 시스템 호출을 조롱하는 데 시간이 걸리고 오류가 발생하기 쉽다는 것입니다.
실제 파일 시스템에는 모든 종류의 이상한 동작이 있기 때문에 통합 테스트에 반드시 필요한 종류입니다 (삭제 프로그램을 포함한 모든 프로세스에서 파일을 열면 Windows에서 파일 삭제를 허용하지 않는 방식).
TDD 방식은 먼저 통합 테스트 를 작성하는 것입니다. (TDD는 엄밀히 말하면 '단위 테스트'및 '통합 테스트'라는 고유 한 개념이 없으며 테스트 일뿐입니다). 충분할 것입니다. 그래서 일을 끝내고, 멈추고, 집에 가십시오 .
그렇지 않으면 파일을 정리하여 테스트하기가 쉽지 않은 내부 복잡성이 있습니다. 어떤 경우에는 단순히 그 복잡성을 없애고 클래스에 넣은 다음 해당 클래스에 대한 단위 테스트를 작성하십시오 . 데이터베이스, xml 파일 등의 경우에도 공통 클래스를 사용할 수 있음을 알 수 있습니다.
어떤 경우에도 테스트중인 단위가 잘못되었는지 여부를 통과하는 테스트를 작성하기 위해 작성중인 코드의 기본 핵심을 취해이를 '모방'하지는 않을 것입니다.
'unit test' and 'integration test'; they are just tests.
사실적으로는 이것이 내 경우에 가장 좋은 해결책이 될 것이라고 생각합니다. 가장 중요한 경우에 사용중인 파일 시스템 라이브러리를 테스트하고 응용 프로그램이 어떻게 응답 해야하는지 그. 다른 파일 시스템 라이브러리로 전환하면 새 라이브러리와 함께 작동하기 위해 많은 모의 / 테스트 코드를 다시 작성하고 싶지는 않지만 테스트 폴더 구조와 통합 테스트를 사용하면 훨씬 간단 해집니다.
귀하의 질문은 "파일 시스템 운영에 의존하는 클래스를 테스트하는 좋은 방법"으로 이해합니다. 나는 당신이 당신의 OS의 파일 시스템을 테스트하고 싶다고 가정하지 않습니다.
@Doc Brown의 답변이 가능한 한 작게 제안 된 것처럼 '파일 시스템 작업에 대한 인터페이스와 "모방" "하려는 노력을 유지하려면 Java 바이너리 스트림 또는 텍스트 리더 (또는 C # 또는 tdd 개발 클래스에서 직접 파일 이름을 가진 파일을 사용하는 대신 사용중인 프로그래밍 언어) .
예:
Java를 사용하여 클래스 CsvReader를 구현했습니다.
public class CsvReader {
private Reader reader;
public CsvReader(Reader reader) {
this.reader = reader;
}
}
테스트를 위해 다음과 같은 메모리 데이터에 사용했습니다.
String contentOfCsv = "TestColumn1;TestColumn2\n"+
"value1;value2\n";
CsvReader sut = new CsvReader(java.io.StringReader(contentOfCsv));
또는 테스트 데이터를 리소스에 포함
CsvReader sut = new CsvReader(getClass().getResourceAsStream("/data.csv"));
프로덕션에서는 파일 시스템을 사용합니다.
CsvReader sut = new CsvReader(new BufferedReader( new FileReader( "/import/Prices.csv" ) ));
이 방법으로 내 CsvReader는 파일 시스템에 의존하지 않고 파일 시스템에 대한 구현이있는 추상화 "리더"에 의존합니다.