Nice programing

Maven으로 단위 테스트 중에 임시 파일에 쓰는 올바른 방법은 무엇입니까?

nicepro 2021. 1. 6. 20:49
반응형

Maven으로 단위 테스트 중에 임시 파일에 쓰는 올바른 방법은 무엇입니까?


작업 디렉토리에 기록하는 경로가 없으면 파일 시스템에 파일을 기록하는 단위 테스트를 작성했습니다. 따라서 프로젝트 디렉토리에서 실행하면 프로젝트 루트에 쓰고 프로젝트 부모 디렉토리에 있으면 부모 루트 디렉토리에 씁니다.

그렇다면 대상 디렉토리에 쓰는 올바른 방법은 무엇입니까? 대상 디렉토리 내부의 디렉토리 일 가능성이 있습니까?

target/파일로 간단히 지정 하면 프로젝트 대상 대신 상위 프로젝트 대상에 기록됩니다.

업데이트 : 실제로 테스트가 완료된 후 파일을 원합니다. 이 파일은 제 3 자에게 보내야하는 제 3자를위한 추출 형식입니다. 재 승인을 위해 파일 형식이 변경된 경우에만 실행할 수 있도록 테스트를 켜거나 끌 수 있습니다. 파일이 어디로 가는지 큰 문제는 아니지만 찾기 쉬운 것을 원합니다.


여기에 설명 된대로 TemporaryFolder JUnit @Rule을 사용해 볼 수 있습니다.

TemporaryFolder는 시스템 프로퍼티 java.io.tmpdir을 지정한 기본 임시 파일 디렉토리에 폴더를 만듭니다. newFile 메소드는 임시 디렉토리에 새 파일을 만들고 newFolder는 새 폴더를 만듭니다.

테스트 메소드가 완료되면 JUnit은 TemporaryFolder를 포함한 모든 파일과 디렉토리를 자동으로 삭제합니다. JUnit은 테스트 통과 여부에 관계없이 리소스 삭제를 보장합니다.


질문 업데이트 후

에서 사용하는 작업 디렉토리를 변경할 수 있습니다 maven-surefire-plugin.

<plugins>
    [...]
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <version>2.12.3</version>
        <configuration>
          <workingDirectory>${project.build.directory}</workingDirectory>
        </configuration>
      </plugin>
    [...]
</plugins>

작업 디렉토리를 .NET과 같은 테스트에 필요한 모든 것으로 변경할 수 있습니다 ${project.build.directory}/my_special_dir/.

surefire 플러그인의 작업 디렉토리는 실행중인 테스트에만 영향을 미치고 maven이 수행하는 테스트에만 영향을 미칩니다. IDE 내에서 테스트를 실행하면 작업 디렉토리가 다른 것입니다.


바퀴를 재발 명 할 필요가 없습니다 ...

JDK는 임시 파일을 생성하는 방법과 종료시 자동으로 삭제하는 방법을 제공합니다.

File file = File.createTempFile( "some-prefix", "some-ext");
file.deleteOnExit();

파일을 사용하면 테스트가 완료되면 자동으로 삭제됩니다. 그게 전부입니다.

임시 파일에 사용할 디렉토리를 지정하려면 오버로드 된 방법을 사용하십시오.

File file = File.createTempFile( "prefix", "ext", new File("/some/dir/path"));

나는 파일이 기록되어야하는 위치를 결정하는 루틴을 작성할 것입니다. 나중에 통합합니다. 일반적으로 파일 IO 또는 데이터베이스 액세스와 같은 단위 테스트에서 영구 데이터에 액세스하는 것을 (가능한 한) 피하려고합니다. 성능상의 이유와 기타 문제도 있습니다. .

이 asnwer를 살펴보십시오 : https://stackoverflow.com/a/8032504/395659


IDE와 Maven 모두에서 테스트를 실행할 수 있기를 원하므로 Maven 내에서 실행되고 있다고 가정하지 않도록 테스트를 작성하는 것이 가장 좋습니다.

임시 파일을 처리하는 가장 좋은 방법 중 하나는 junit 규칙을 사용하는 것 입니다. 이렇게하면 규칙에 따라 정리할 수 있습니다.


미리 말씀 드리 자면 저는 단위 테스트에서 그런 일을하는 것을 강력히 반대합니다. 나는 이것을 실제로 시도하지는 않았지만 작동해야합니다.

에서 테스트중인 프로젝트의 기본 디렉토리에 액세스 할 수 있다고 인용 된 문서에서 확실한 플러그인을 사용하고 있다고 가정합니다 System.getProperty("basedir"). 그것을 얻고 basedir / target 아래에 파일을 생성하십시오.

좀 더 "적절한"방법 (출력 디렉토리를 다른 것으로 구성했을 가능성이 있으므로 확실한 플러그인 구성을 다음과 같이 변경할 수 있습니다.

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.6</version>
    <configuration>
        <systemPropertyVariables>
            <myOutDir>${project.build.outputDirectory}</myOutDir>
        </systemPropertyVariables>
    </configuration>
</plugin>

그런 다음 System.getProperty("myOutDir")테스트에서 실제 출력 디렉토리를 가져올 수 있습니다 .


임시 파일은 임시 디렉토리에 생성되어야합니다. 전화를 사용하여 검색System.getProperty("java.io.tmpdir")

Temporary file should be temporary, i.e. should be removed when it is not needed. To acheive this do not forget to delete it in finally block or in code that runs after the test, i.e.:

File tmpFile = ...
try {
   // deal with tempFile
} finally {
    tempFile.delete();
}

and/or

public class MyTestCase {
    private File tmpFile = null;

    @Before
    public void setUp() {
        tmpFile = ...;
    }

    @Test
    public void setUp() {
        // deal with tmpFile
    }

    @After
    public void setUp() {
        tmpFile.delete();
    }
}

Use File.createTempFile(String prefix, String suffix) if it is possible, i.e. you can then use file with special name generated by createTempFile().

Use file.deleteOnExit(). This creates hook that removes file automatically when JVM is terminated. The file will remain only if JVM was killed with kill -9, so it did not have a chance to run shutdown code.

ReferenceURL : https://stackoverflow.com/questions/12400243/what-is-the-correct-way-to-write-to-temp-file-during-unit-tests-with-maven

반응형