2014-10-06 4 views
2

는 NUNIT 콘솔 프로그램보다 훨씬 더 오래 걸립니다 라이브러리를 처리하고 있고, 나는 그 (것)들이 현저하게 빠르다는 것을 예상하지 않는다).OpenCover 나는이 프로젝트에 단위 테스트를 추가하기 위해 노력하고있어

이 테스트에서 OpenCover를 실행하면 20 분 정도 걸릴 수 있습니다.

현재 단위 테스트의 요지는 테스트 이미지가 많고 각 단위 테스트 (실제로 통합 테스트와 비슷 함)가 각 이미지를 읽고 그것에 대해 많은 효과를 실행한다는 것입니다.

나는 뭔가 잘못하고 있다고 생각하지만, 무엇을해야합니까? OpenCover에서 NUnit 러너보다 훨씬 많은 시간이 걸리는 이유는 무엇입니까?

답변

1

OpenCover은 어셈블리의 IL (파일 위치 정보가 유지되는 곳이기 때문에 PDB 파일을 찾을 수 있음)을 측정 한 다음 각 시퀀스 포인트 (중단 점을 넣을 수있는 위치 생각)와 각 조건부 분기 경로는 방문을 등록하고 방문 횟수를 늘리는 작업을 수행합니다.

알고리즘 코드의 경우 무거운 통합 테스트에서 실행 범위가 성능 문제가되므로 엄격한 통합 테스트 또는 단위 테스트에서만 적용 범위를 확인하십시오. 귀하의 경우 코드의 정확성을 테스트 할 수있는 작은 이미지 (이전에 제안 된대로)를 사용하십시오.

OpenCover (또는 어떤 버전 (가장 최신 버전이라고 가정)를 실행하는지 설명하지 않았지만 테스트 어셈블리를 제외하고 대상 어셈블리를 계측 만하고 있음을 확인하십시오.

마지막으로 OpenCover는 몇 개의 대기열과 스레드를 사용하지만 루프 등으로 인해 많은 양의 데이터를 처리하는 경우 데이터를 처리하는 데 시간이 필요하므로 4 개 이상의 코어가있는 시스템에서 훨씬 잘 작동합니다. 테스트를 실행할 때 작업 관리자를보고 무슨 일이 일어나는지 확인하십시오.

+0

설명을 주셔서 감사합니다 :) 단위 테스트 만 실행하고 전면 - 후면 통합 테스트는 실행하지 않는 것이 좋습니다. – thomasb

1

내가 OpenCover를 사용하지 않기 때문에 이것은 추측이지만 커버리지 분석 툴은 통과하는 모든 라인을 계측하도록되어있다. 이미지 조작을하고 있기 때문에, 각 픽셀은 일치하는 코드 라인을 분석하기 위해 OpenCover를 확실히 트리거 할 것이고, 많은 픽셀을 가지고 있습니다.

OpenCover가 한 줄의 코드를 작성하는 데 0.01ms가 걸리면 추측), 1280 * 1024 이미지로 작업하고 있으며 각 픽셀에 3 줄의 코드 (빨간색 채널 모자, 녹색 또는 파란색 모자)가 필요한 경우 1310720 * 0.01 * 3 = 약 39 초가됩니다. 하나의 테스트.

나는 하나의 테스트 만 가지고있는 것은 의심 스럽기 때문에 테스트 금액을 곱하십시오. 느린 이유에 대한 아이디어가있을 수 있습니다.

작은 규모로 알고리즘을 테스트 해보십시오. 전체 이미지를 작업 할 필요가없는 코드 와이드 작업을 수행하지 않으면 (어떤 이미지가 보이지 않습니까?) 코드를 작성하지 않아도됩니다. 또는 작은 이미지를 사용합니까?


편집 : 나는 문제가 테스트중인 모든 데이터에서 유래 말할 수 있습니다 (자체 OpenCover 모르고, 다시 한) 테스트 여기 스위트 룸을 살펴했다; evey 단일 이미지가로드되고 같은 테스트를 위해 처리됩니다. 이는 단위 테스트를 원하는 방식이 아닙니다.

테스트로드 lib 디렉토리에 대한 이미지 클래스에 각 이미지 유형은 다음 매번 모든 것을 테스트하지 마십시오 등 이미지 클래스 하나 회전, 하나 크기 조정 작업을 테스트! 테스트가 필요하기 때문에


는, 어쩌면 당신은 일부 데이터를 제외 할 OpenCover options을 탐험 할 수있다. 아마도 알고리즘의 바깥 껍질 만 계측하여 범위 분석을 수정하면 도움이 될 것입니다. filters을 보시면 알맞은 수준으로 달릴 수있는 것을 숨길 수 있습니다.

다른 방법으로 야간에 우선적으로 코드 범위를 실행할 수 있습니까?

+0

글쎄, 실제로 라이브러리는 이미지 와이드 수정 (필터 등)을합니다. 서로 다른 형식, 다른 임베디드 ICC 프로파일, 다른 색상 모드 (RGB/YMCM/...), 다른 메타 데이터 등 모든 이미지가 있기 때문에 모든 이미지가 있습니다. 따라서 테스트는 실제로 모든 이미지에서 실행해야합니다. 하지만 아마도 한 번로드하고 메모리에 유지해야합니다 ... – thomasb

+0

테스트를 분할하고 icc 프로파일, 색상 모드 등을 하드 코드합니다. 예를 들어 필터가 적색 채널을 평균화하고 각 픽셀의 평균을 제거하려는 경우 값, 알고리즘을 평균 계산 및 픽셀 조작으로 분할 한 다음 매우 작은 이미지를 사용하여 테스트해야합니다. – samy

+0

예, 말했듯이 테스트는 단위 테스트보다 통합 테스트입니다 (명령의 전체 체인이 존경받는). 나는 아직도이 검사가 필요하다. – thomasb

관련 문제