CSV 파서에 대한 단위 테스트


14

CSV 파서를 단위 테스트하려면 어떤 테스트를 사용해야합니까?

나는이 간단한의 CSV 파서 C #에서, 그리고 나는 확실히 내가 모든 일반적인 (그리고 드문) 가장자리의 경우 좋은 단위 테스트 커버리지가되고 싶어요. 잠재적 문제와 경계 사례를 식별하기 위해 어떤 테스트를 사용해야합니까?


5
다양한 테스트 파일 작성을 위해 generatedata.com 을 확인 했습니까 ?
Aaron McIver

@Aaron-좋은 테스트는 반복 가능하므로 다양한 데이터를 사용하지 마십시오. 그러나 일회성 세대에 사용할 수 있으며 테스트 스위트를 위해 저장할 수 있습니다. 그러나 그때조차도 무작위로 보장 할 수없는 모든 다른 사례를 다루고 싶습니다.
Joel Coehoorn

Coehorn Good 테스트 결과는 반복 가능합니다. 원하는 결과가 일정하게 유지되는 한 다양한 데이터를 사용하는 것이 좋습니다. 테스트를 시작하지 않는 이유는 무엇입니까? 당신은 마법의 솔루션을 찾고 단순히 테스트를 작성하는 데 더 많은 시간을 할애합니다.
Aaron McIver

저자는 테스트 데이터가 아닌 테스트 사례를 찾고 있습니다. 다양한 것들에 대한 공개 테스트를 어디에서 찾아야하는지 알고 싶습니다.
ProdigySim

답변:


6

방금 https://github.com/maxogden/csv-spectrum을 찾았습니다 .

CSV 파싱 라이브러리에 대한 산성 테스트로 사용되는 여러 가지 CSV 파일. 확인 목적으로 CSV 버전의 JSON도 있습니다.

이 리포지토리의 목표는 전체 CSV 스펙트럼을 나타내는 테스트 사례를 캡처하는 것입니다.


흥미로운 것은 GitHub의 자체 CSV 파서가 테스트 CSV를 보여 주려고 할 때 테스트에 실패한다는 것입니다 ( github.com/maxogden/csv-spectrum/blob/master/csvs/… )
Ian Boyd

16

다음은 생각하고 테스트해야 할 몇 가지 경계 사례입니다.

  1. 기본 필드. ,foo,
  2. 기본 인용 필드. ,"foo",
  3. 줄 바꿈이 포함 된 인용 필드. ,"foo\nbar"
  4. 쉼표가 포함 된 인용 필드. ,"foo,bar"
  5. 따옴표가있는 따옴표 필드 ,"foo""bar"
  6. 빈 문자열과 널을 구별합니까? 그렇다면 ,,null ,"",이어야하며 빈 문자열을 제공해야합니다.
  7. 데이터 유형을 감지하고 올바른 작업을 수행하려고합니까? CSV는 종종 숫자 데이터에 사용됩니다. 적절하다고 생각되는 테스트를 추가하십시오.
  8. 데이터를 쓰는 경우 위의 모든 경우를 다루어야합니다.
  9. 필드 수가 다른 라인으로 무엇을합니까? (테스트 해보십시오.)
  10. 빈 줄 끝으로 무엇을합니까? (테스트 해보십시오.)
  11. 대용량 파일의 성능은 어떻습니까? (테스트하십시오. 문자열을 비효율적으로 사용하고 결과적으로 2 차 시간이 걸리는 간단한 CSV 파서가 너무 많이 보임에 따라 간단한 항목이 고통스럽게 느려집니다.)

10

CSV 파일에 대한 공식적인 사양은 없습니다. 그러나 대부분의 구현이 따르는 형식을 문서화하는 CSV 파일의 RFC 4180-공통 형식 및 MIME 형식 (특히 섹션 2)을 살펴보십시오.

섹션 2의 목록에서 구체적으로 다음과 같은 테스트 사례를 생성하는 것이 매우 간단 해 보입니다.

  1. 각 레코드는 줄 바꿈 (CRLF)으로 구분 된 별도의 줄에 있습니다. 예를 들면 다음과 같습니다.

    aaa, bbb, ccc CRLF zzz, yyy, xxx CRLF

  2. 파일의 마지막 레코드는 줄 바꿈이 있거나 없을 수 있습니다. 예를 들면 다음과 같습니다.

    aaa, bbb, ccc CRLF zzz, yyy, xxx

  3. 선택적인 헤더 행이 일반 레코드 행과 동일한 형식으로 파일의 첫 번째 행으로 표시 될 수 있습니다. 이 헤더는 파일의 필드에 해당하는 이름을 포함하고 나머지 파일의 레코드와 동일한 수의 필드를 포함해야합니다. MIME 유형). 예를 들면 다음과 같습니다.

    field_name, field_name, field_name CRLF aaa, bbb, ccc CRLF zzz, yyy, xxx CRLF

  4. 헤더와 각 레코드에는 쉼표로 구분 된 하나 이상의 필드가있을 수 있습니다. 각 줄은 파일 전체에서 같은 수의 필드를 포함해야합니다. 공백은 필드의 일부로 간주되므로 무시해서는 안됩니다. 레코드의 마지막 필드 뒤에 쉼표가 없어야합니다. 예를 들면 다음과 같습니다.

    aaa, bbb, ccc

  5. 각 필드는 큰 따옴표로 묶을 수 있습니다. 그러나 Microsoft Excel과 같은 일부 프로그램은 큰 따옴표를 전혀 사용하지 않습니다. 필드를 큰 따옴표로 묶지 않으면 큰 따옴표가 필드 안에 나타나지 않을 수 있습니다. 예를 들면 다음과 같습니다.

    "aaa", "bbb", "ccc"CRLF zzz, yyy, xxx

  6. 줄 바꿈 (CRLF), 큰 따옴표 및 쉼표가 포함 된 필드는 큰 따옴표로 묶어야합니다. 예를 들면 다음과 같습니다.

    "aaa", "b CRLF bb", "ccc"CRLF zzz, yyy, xxx

  7. 큰 따옴표를 사용하여 필드를 묶는 경우 다른 큰 따옴표를 앞에 두어 필드 안에 나타나는 큰 따옴표를 이스케이프해야합니다. 예를 들면 다음과 같습니다.

    "aaa", "b" "bb", "ccc"



4

이 디렉토리를 확인하고 * .t 파일의 코드를보십시오. :

http://cpansearch.perl.org/src/MAKAMAKA/Text-CSV-1.32/t/

(버전 번호 -1.32는 결국 변경되어 링크가 "죽음"이 될 수 있습니다. 시행 착오를 통해 버전 번호를 직접 늘리거나 상위 디렉토리로 이동하거나 여기를 클릭하십시오

https://metacpan.org/pod/Text::CSV

"찾아보기"를 통해 최신 버전의 소스 코드를 통해 클릭하십시오.)

Text :: CSV_XS는 CSV 파일을 구문 분석하기위한 성숙한 펄 모듈입니다. * .t 파일은 Perl 5로 작성되었으며, 모듈 자체 테스트를위한 많은 테스트 케이스가 포함되어 있으며 모듈 설치시 수행해야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.