문제

대규모 데이터 세트를 단위 테스트하는 가장 좋은 방법은 무엇입니까?내가 관리하고 있는 일부 레거시 코드에는 100개 이상의 멤버로 구성된 구조가 있습니다.우리가 작업 중인 코드의 다른 부분에서는 수백 개의 샘플로 구성된 데이터 세트를 생성하거나 분석합니다.

지금까지 내가 찾은 가장 좋은 접근 방식은 디스크에서 구조나 데이터 세트를 직렬화하고, 테스트 중인 작업을 수행하고, 결과를 디스크에 직렬화한 다음, 직렬화된 결과가 포함된 파일을 예상 결과가 포함된 파일과 비교하는 것입니다.이는 그다지 빠르지 않으며 단위 테스트의 "디스크를 건드리지 마십시오" 원칙을 위반합니다.그러나 제가 생각할 수 있는 유일한 대안(수백 개의 멤버와 데이터 포인트를 초기화하고 테스트하는 코드 작성)은 참을 수 없을 정도로 지루해 보입니다.

더 나은 해결책이 있습니까?

올바른 솔루션이 없습니다

다른 팁

달성하려는 것이 실제로 단위 테스트인 경우 기본 데이터 구조를 모의하고 데이터를 시뮬레이션해야 합니다.이 기술을 사용하면 입력을 완벽하게 제어할 수 있습니다.예를 들어, 작성하는 각 테스트는 단일 데이터 포인트를 처리할 수 있으며 각 조건에 대해 매우 간결한 테스트 세트를 갖게 됩니다.시중에는 여러 오픈 소스 모의 프레임워크가 있습니다. 저는 개인적으로 Rhino Mocks(http://ayende.com/projects/rhino-mocks/downloads.aspx) 또는 NMock(http://www.nmock.org).

데이터 구조를 흉내내는 것이 불가능하다면 리팩토링을 권장합니다. 그러면 그렇게 할 수 있습니다 :-) 그만한 가치가 있습니다!또는 TypeMock을 사용해 볼 수도 있습니다(http://www.typemock.com/) 구체적인 클래스를 조롱할 수 있습니다.

그러나 대규모 데이터 세트에 대해 테스트를 수행하는 경우 실제로는 단위 테스트가 아닌 기능 테스트를 실행하고 있는 것입니다.이 경우 데이터베이스나 디스크에서 데이터를 로드하는 것이 일반적인 작업입니다.이를 피하는 대신 자동화된 빌드 프로세스의 나머지 부분과 병렬로 실행되도록 작업해야 성능 영향으로 인해 개발자가 방해를 받지 않습니다.

이는 여전히 실행 가능한 접근 방식입니다.하지만 저는 이것을 기능 테스트로 분류하거나 순수한 단위 테스트가 아닌 것으로 분류하겠습니다.좋은 단위 테스트는 발생할 수 있는 극단적인 사례의 좋은 분포를 제공하는 레코드의 샘플링을 취하고 이를 작성하는 것입니다.그런 다음 모든 데이터에 대한 대량 테스트를 통해 마지막 "수용" 또는 "기능" 테스트를 수행합니다.

나는 많은 양의 데이터를 테스트할 때 이 접근 방식을 사용해 왔으며 작은 단위를 유지 관리할 수 있기 때문에 충분히 잘 작동한다는 것을 알았습니다. 그런 다음 대량 테스트가 작동하고 모두 자동이라는 것을 알고 있습니다.

지금까지 찾은 가장 좋은 방법은 디스크에서 구조 또는 데이터 세트를 직렬화하고 테스트중인 작업을 수행하고 결과를 디스크로 직렬화 한 다음 예상 결과가 포함 된 파일에 대한 직렬화 된 결과를 포함하는 파일을 전환하는 것입니다.

테스트에서 디스크에서 직렬화하는 대신 위의 기술을 사용하는 코드를 작성했으며 직렬화 된 데이터를 컴파일러가 실행 파일에 배치 할 수있는 바이트 배열로 변환했습니다.

예를 들어 직렬화 된 데이터를 다음으로 변환 할 수 있습니다.

unsigned char mySerialisedData[] = { 0xFF, 0xFF, 0xFF, 0xFF, ... };

test()
{
    MyStruct* s = (MyStruct*) mySerialisedData;

}

더 장점의 예를 보려면 (C#) 이것을 참조하십시오. 단위 테스트. 테스트에 대한 입력으로 일부 하드 코딩 된 직렬화 된 데이터를 사용하여 어셈블리 서명을 테스트하는 예를 보여줍니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top