2009-10-20 3 views
3

Object를 FileSystem으로 내보내는 JUnit-Test가 있습니다. 처음에는 내 테스트가 이렇게 보였습니다Unittest는 "assertEquals (..)"과 같은 어설 션을 가지고 있어야합니까?

public void exportTest { 
    //...creating a list with some objects to export...  
    JAXBService service = new JAXBService(); 
    service.exportList(list, "output.xml"); 
} 

보통 내 테스트에는 assertEquals (...)와 같은 어설 션이 포함되어 있습니다. 그래서 나는이 필요하십니까 다음

public void exportCustomerListTest() throws Exception { 
    // delete the old resulting file, so we can test for a new one at the end 
    File file = new File("output.xml"); 
    file.delete(); 

    //...creating a list with some objects to export... 

    JAXBService service = new JAXBService(); 
    service.exportCustomers(list, "output.xml"); 

    // Test if a file has been created and if it contains some bytes 
    FileReader fis = new FileReader("output.xml"); 
    int firstByte = fis.read(); 

    assertTrue(firstByte != -1); 
} 

에 코드를 변경하거나 첫 번째 방법은 충분했다? 나는 첫 번째 코드가 실제로 코드가 실행된다는 것을 "테스트"하지만 결과는 테스트하지 않기 때문에 묻는다. 또는 테스트가 통과하는 예외없이 내보내기 방법이 실행되면 "계약"에 의지 할 수 있습니까?

감사 예외없이

답변

4

글쎄, 당신은 당신의 코드가 완료 될 때까지 실행되는지 테스트하고 -하지만 당신은 출력에 대해 아무것도 테스트 아닙니다.

파일을 예상 출력으로 유지하고 실제 출력과 비교해 보시지 않겠습니까? expertCustomers의 과부하가 Writer 인 경우이 방법이 더 쉽습니다. 그러면 StringWriter을 전달하고 메모리에만 쓸 수 있습니다. 몇 가지 방법으로 테스트 할 수 있습니다. 파일 이름을 취하는 오버로드 테스트는 을 OutputStreamWriter으로 랩핑 한 다음보다 철저하게 테스트 된 메소드를 호출합니다. 정말로 올바른 파일이 존재했는지 확인해야합니다. 당신은 문제가 나타날 경우

1

이 파일의 생성 중에

assertTrue(new File("output.xml")).exist()); 

를 사용할 수 있습니다, 당신은 단위

(파일이 올바르게 파일 시스템에서 작성하고 다시로드되었다는 사실을이 아닌) 생성 프로세스를 테스트 할 수 있습니다

두 가지 파일이 1 대 1 인 테스트 인 "금 파일"접근 방식을 사용하거나 생성기의 다양한 출력을 테스트 할 수 있습니다 (콘텐츠 세대가 파일 저장과 분리되어 있다고 생각합니다)

1

다른 게시물에 동의합니다. 또한 첫 번째 테스트에서 테스트 스위트 나 테스트 러너에게이 특정 테스트가 실패했다는 사실을 알리지 않을 것이라고 덧붙일 것입니다.

0

경우에 따라 예외가 발생하지 않았 음을 입증 할 필요가 있습니다. 이 경우에 예외가 실패하면 테스트가 충분합니다. assertEquals 메소드를 호출하여 JUnit에서 얻은 것은 없습니다. AssertionException을 throw하지 않을 때 테스트가 통과되며 해당 메서드가 호출되기 때문에 테스트가 통과되지 않습니다. 널 (null) 입력을 할 수있는 방법을 고려,이 같은 테스트를 작성할 수 있습니다

@Test public void testNullAllowed() { 
     new CustomObject().methodThatAllowsNull(null); 
} 

바로 거기 시험의 충분한 수 있습니다 (별도의 테스트를 떠나거나 아마도이하는 일에 대해 테스트하는 흥미로운 아무것도 없다 널 값으로), 비록 당신이 주장을 잊지 않았다는 코멘트를 남겨두기를 신중하게했지만, 그것을 의도적으로 버렸다.

그러나 귀하의 경우에는 테스트를 거치지 않았습니다. 물론 그것은 날려 버리지 않았지만, 비어있는 방법도 폭발하지 않을 것입니다. 두 번째 테스트가 더 좋다. 적어도 비어 있지 않은 파일이 만들어 졌음을 입증해야한다. 그러나 당신은 그것보다 더 잘할 수 있고 적어도 합당한 결과가 만들어 졌는지 점검 할 수 있습니다.

관련 문제