과학 연구 코드에 대한 단위 테스트를 작성하는 것이 가치가 있습니까?


89

자동화 된 회귀 테스트 세트를 포함하여 완전한 프로그램 (예 : 수렴 테스트)을 검증하는 테스트를 사용하는 것의 가치를 확신 합니다 . 프로그래밍 서적을 읽은 후에 단위 테스트 (즉, 단일 함수의 정확성을 확인하고 문제를 해결하기 위해 전체 코드를 실행하지 않는 테스트)를 작성해야한다는 잔소리를 들었 습니다. . 그러나 단위 테스트가 항상 과학적 코드 에 맞는 것은 아니며 인위적인 느낌이나 시간 낭비와 같은 결과를 낳습니다.

연구 코드에 대한 단위 테스트를 작성해야합니까?


2
이것은 약간의 열린 질문입니다.
qubyte

2
모든 "규칙"과 마찬가지로 비판적 사고가 항상 적용됩니다. 특정 루틴에 단위 테스트를 수행하는 확실한 방법이 있는지 자문 해보십시오. 그렇지 않다면, 단위 테스트가 그 시점에서 의미가 없거나 코드 디자인이 잘못되었습니다. 이상적으로 하나의 루틴은 가능한 한 다른 루틴과 독립적으로 하나의 태스크를 수행하지만 때때로 트레이드 오프되어야합니다.
Lagerbaer

stackoverflow대한 질문에 대해 비슷한 맥락에서 좋은 토론이 있습니다 .
naught101

답변:


85

몇 년 동안 나는 코드에 대한 단위 테스트를 작성하기에 충분한 시간이 없다는 오해를 받고 있었다. 테스트를했을 때, 그들은 부풀어 오르고 무거운 것들이 필요하다는 것을 알았을 때 단위 테스트를 작성해야한다고 생각하게 만들었 습니다 .

그런 다음 Test Driven Development 를 사용하기 시작했으며 완전한 계시라고 생각했습니다. 나는 이제 단위 테스트를 쓰지 않을 시간이 없다고 확신한다 .

내 경험상 테스트를 염두에두고 개발하면 더 깨끗한 인터페이스, 더 집중된 클래스 및 모듈 및 일반적으로 더 많은 테스트 가능한 SOLID 코드가 생깁니다.

단위 테스트가없고 수동으로 무언가를 테스트해야하는 레거시 코드로 작업 할 때마다 "이 코드에 이미 단위 테스트가있는 경우 훨씬 빠를 것"이라고 계속 생각합니다. 높은 커플 링으로 코드에 단위 테스트 기능을 추가하려고 할 때마다 "이것이 분리 된 방식으로 작성된 경우 훨씬 쉬울 것"이라고 계속 생각합니다.

내가 지원하는 두 개의 실험 스테이션을 비교하고 대조합니다. 하나는 잠시 동안 있었고 많은 레거시 코드를 가지고 있지만 다른 하나는 비교적 새롭습니다.

이전 랩에 기능을 추가 할 때 랩으로 내려 가서 필요한 기능의 의미와 다른 기능에 영향을주지 않고 해당 기능을 추가하는 방법을 통해 많은 시간을 소비하는 경우가 종종 있습니다. 코드는 단순히 오프라인 테스트를 허용하도록 설정되지 않았으므로 거의 모든 것이 온라인으로 개발되어야합니다. 오프라인으로 개발하려고한다면 합리적인 것보다 더 많은 모의 객체 가 생길 것입니다.

최신 랩에서는 일반적으로 책상에서 오프라인으로 개발하여 즉시 필요한 항목 만 조롱 한 다음 실험실에서 짧은 시간 만 보내서 해결되지 않은 나머지 문제를 해결함으로써 기능을 추가 할 수 있습니다. -선.

명확성을 위해 @ naught101이 물 은 이후로 ...

일부 임시 데이터 분석을 통해 실험 제어 및 데이터 수집 소프트웨어를 사용하는 경향이 있으므로 TDD와 수정 제어를 결합하면 기본 실험 하드웨어의 변경 사항과 시간에 따른 데이터 수집 요구 사항의 변경 사항을 모두 문서화 할 수 있습니다.

그러나 탐색 코드를 개발하는 상황에서도 시간이 지남에 따라 이러한 가정이 어떻게 발전하는지 볼 수있는 능력과 함께 가정을 체계화함으로써 큰 ​​이점을 볼 수있었습니다.


7
마크, 여기서 어떤 종류의 코드에 대해 이야기하고 있습니까? 재사용 가능한 모델? 나는이 이론적 근거가 탐색 적 데이터 분석 코드와 같은 것에 적용 할 수있는 것이 아니라는 점을 발견했다. 여기서는 많은 곳을 뛰어 다니며 종종 다른 곳에서 코드를 재사용 할 것을 기대하지 않는다.
naught101

35

과학적 코드는 일반적으로 문제의 수학적 구조로 인해 내가 작업 한 비즈니스 코드보다 더 자주 연동 기능의 별자리를 갖는 경향이 있습니다. 따라서 개별 기능에 대한 단위 테스트가 매우 효과적이라고 생각하지 않습니다. 그러나 나는 효과적이며 여전히 특정 기능을 목표로한다는 점에서 전체 프로그램 테스트와는 상당히 다른 단위 테스트 클래스가 있다고 생각합니다.

이러한 종류의 테스트에서 의미하는 바를 간단히 정의합니다. 회귀 테스트 는 코드가 변경 될 때 기존 동작의 변경 사항을 확인합니다 (어쨌든 유효성 검사). 단위 테스트 는 코드를 실행하고 사양에 따라 원하는 출력을 제공하는지 확인합니다. 원래 회귀 테스트 출력이 유효한지 확인해야했기 때문에 단위 테스트이므로 다르지 않습니다.

수치 단위 테스트에서 내가 가장 좋아하는 예는 유한 요소 구현의 수렴 속도를 테스트하는 것입니다. 그것은 간단하지는 않지만 PDE에 대해 알려진 해결책을 취하고 메쉬 크기 를 줄이는 데 몇 가지 문제를 겪고 나서 오차 표준을 곡선 C h r에 맞추고 여기서 r 은 수렴 률입니다. 파이썬을 사용하여 PETSc의 Poisson 문제에 대해이 작업을 수행합니다. 회귀에서와 같이 차이점을 찾지 않고 주어진 요소에 대해 특히 비율 r을 지정했습니다.hh아르 자형아르 자형아르 자형

PyLith 에서 나오는 단위 테스트의 두 가지 예 는 포인트 위치로, 이는 합성 결과를 쉽게 생성 할 수있는 단일 함수이며 메쉬에서 제로 부피 응집 셀을 생성합니다. 코드의 기능.

보존 및 일관성 테스트를 포함하여 이러한 종류의 테스트가 많이 있습니다. 작업은 회귀와 다르지 않지만 (테스트를 실행하고 표준과 비교하여 출력을 확인) 표준 출력은 이전 실행이 아닌 사양에서 나옵니다.


4
Wikipedia에 따르면 "구성 요소 테스트라고도하는 단위 테스트는 일반적으로 함수 수준에서 특정 코드 섹션의 기능을 확인하는 테스트를 말합니다." 유한 요소 코드의 수렴 테스트는 많은 기능을 포함하므로 단위 테스트가 될 수 없습니다.
David Ketcheson

그렇기 때문에 게시물의 맨 위에 단위 테스트에 대한 폭 넓은 견해를 분명히 밝히고 "보통"은 정확히 의미합니다.
Matt Knepley

내 질문은 더 널리 채택 된 단위 테스트 정의의 의미에서 의미되었습니다. 나는 이제 질문에서 이것을 완전히 명백하게 만들었습니다.
David Ketcheson

나는 나의 대답을 명확히했다
Matt Knepley

후자의 예제는 내가 의도 한 것과 관련이 있습니다.
David Ketcheson

28

Code Complete, 2nd edition의 Test-Driven Development에 대해 읽은 이래로 단위 테스트 프레임 워크를 사용했습니다.개발 전략의 일부로 작성하는 다양한 테스트가 진단이므로 디버깅에 소요되는 시간을 줄임으로써 생산성이 크게 향상되었습니다. 부작용으로, 나는 과학적 결과에 훨씬 더 자신감이 있으며, 여러 차례에 걸쳐 단위 테스트를 사용하여 결과를 방어했습니다. 단위 테스트에 오류가있는 경우 일반적으로 이유를 매우 빨리 알아낼 수 있습니다. 내 응용 프로그램이 충돌하고 모든 단위 테스트가 통과되면 코드 범위 분석을 수행하여 내 코드의 어떤 부분이 실행되지 않는지 확인하고 디버거로 코드를 단계별로 실행하여 오류의 원인을 찾아냅니다. 그런 다음 버그가 수정되었는지 확인하기 위해 새로운 테스트를 작성합니다.

내가 작성한 많은 테스트는 순수한 단위 테스트가 아닙니다. 엄격하게 정의 된 단위 테스트 는 한 기능의 기능을 수행해야합니다. 모의 데이터를 사용하여 단일 기능을 쉽게 테스트 할 수 있다면 그렇게합니다. 다른 경우에는 주어진 함수의 기능을 수행하는 테스트를 작성하는 데 필요한 데이터를 쉽게 모의 할 수 없으므로 통합 테스트에서 해당 함수를 다른 함수와 함께 테스트합니다. 통합 테스트한 번에 여러 기능의 동작을 테스트하십시오. Matt이 지적한 것처럼 과학 코드는 종종 연동 함수의 별자리이지만 종종 특정 함수가 순차적으로 호출되며 중간 단계에서 출력을 테스트하기 위해 단위 테스트를 작성할 수 있습니다. 예를 들어, 프로덕션 코드에서 순서대로 5 개의 함수를 호출하면 5 개의 테스트를 작성합니다. 첫 번째 테스트는 첫 번째 함수 만 호출하므로 단위 테스트입니다. 그런 다음 두 번째 테스트는 첫 번째와 두 번째 함수를 호출하고 세 번째 테스트는 처음 세 함수를 호출합니다. 코드에서 모든 단일 함수에 대한 단위 테스트를 작성할 수 있더라도 통합 모듈 테스트를 작성합니다. 다양한 모듈 식 프로그램을 결합하면 버그가 발생할 수 있기 때문입니다. 마지막으로, 필요한 모든 단위 테스트 및 통합 테스트를 작성한 후 결과를 반복 할 수 있기를 원하기 때문에 사례 연구를 단위 테스트로 묶고 회귀 테스트에 사용합니다. 반복 할 수없고 다른 결과가 나오면 이유를 알고 싶습니다. 회귀 테스트의 실패는 실제 문제가 아닐 수 있지만 새로운 결과가 적어도 이전 결과만큼 신뢰할 수 있는지 파악해야합니다.

또한 단위 테스트와 함께 정적 코드 분석, 메모리 디버거 및 컴파일러 경고 플래그로 컴파일하여 간단한 오류와 사용하지 않는 코드를 포착 할 수 있습니다.



통합 테스트를 충분히 고려 하시겠습니까, 아니면 별도의 단위 테스트를 작성해야한다고 생각하십니까?
siamii

가능하고 가능한 곳마다 별도의 단위 테스트를 작성했습니다. 디버깅이 쉬워지고 분리 된 코드 (원하는 것)를 적용합니다.
Geoff Oxberry

19

필자의 경험으로는 과학 연구 코드의 복잡성이 증가함에 따라 프로그래밍에 매우 모듈 식 접근 방식이 필요합니다. 크고 오래된 기반 ( f77누구나) 이있는 코드에는 고통 스럽지만 앞으로 나아가 야합니다. 모듈이 코드의 특정 측면 (CFD 응용 프로그램의 경우 경계 조건 또는 열역학을 고려)을 중심으로 구축됨에 따라 단위 테스트는 새로운 구현을 확인하고 문제와 추가 소프트웨어 개발을 격리하는 데 매우 중요합니다.

이 단위 테스트는 코드 검증 보다 한 레벨 아래 (파동 방정식의 분석 솔루션을 복구 할 수 있습니까?)와 코드 검증 아래 2 레벨 (난류 파이프 흐름에서 올바른 피크 RMS 값을 예측할 수 있습니까) 이어야합니다 . (인수가 올바르게 전달되고, 포인터가 올바른 것을 가리키는가?) 및 "수학"(이 서브 루틴은 마찰 계수를 계산합니다. 일련의 숫자를 입력하고 손으로 솔루션을 계산하면 루틴이 동일한 결과를냅니다 결과?) 맞습니다. 기본적으로 컴파일러가 발견 할 수있는 것, 즉 기본 구문 오류보다 한 단계 높은 수준으로 이동합니다.

나는 당신의 응용 프로그램에서 적어도 몇 가지 중요한 모듈을 위해 그것을 추천 할 것입니다. 그러나 그것이 매우 지루하고 시간 소모적이라는 것을 알아야하므로 무제한 인력이 없다면 복잡한 코드의 100 %에는 권장하지 않습니다.


단위 테스트 할 부분과 그렇지 않은 부분을 선택하기위한 구체적인 예나 기준이 있습니까?
David Ketcheson

@DavidKetcheson 내 경험은 우리가 사용하는 응용 프로그램 및 언어에 따라 제한됩니다. 약 200 만 줄의 F90을 사용하는 범용 CFD 코드의 경우 작년 또는 2 년 동안 코드의 일부 기능을 실제로 분리하려고 시도했습니다. 모듈을 만들고 코드 전체에서 사용하는 것은 이것을 달성하지 못하므로 이러한 모듈을 실제로 비교하고 실제로 라이브러리로 만들어야합니다. 따라서 USE 문은 거의 없으며 나머지 코드와의 모든 연결은 일상적인 호출을 통해 수행됩니다. 물론 라이브러리의 나머지 부분뿐만 아니라 unittest 할 수있는 루틴.
FrenchKheldar

@DavidKetcheson 내가 대답했듯이, 경계 조건과 열역학은 코드의 두 가지 측면으로, 우리가 실제로 분리하여 단위 테스트를 수행하는 것이 합리적이었습니다. 좀 더 일반적인 방법으로, 나는 작은 것부터 시작하여 깨끗하게하려고합니다. 이상적으로 이것은 2 인 작업입니다. 한 사람은 인터페이스를 설명하는 루틴과 문서를 작성하고 다른 사람은 소스 코드를 보지 않고 인터페이스 설명만으로 단위 테스트를 작성해야합니다. 그런 식으로 루틴의 의도를 테스트했지만 구성하기가 쉽지 않다는 것을 알고 있습니다.
FrenchKheldar

1
단위 테스트 외에 다른 유형의 소프트웨어 테스트 (통합, 시스템)를 포함하지 않는 이유는 무엇입니까? 시간과 비용 외에도 이것이 가장 완벽한 기술 솔루션이 아닐까요? 참고 문헌은 1 (Sec 3.4.2) 및 2 (5 페이지)입니다. 다시 말해, 소스 코드는 전통적인 소프트웨어 테스트 레벨 3 ( "테스트 레벨")에 의해 테스트되어서는 안 됩니까?
ximiki

14

과학 코드에 대한 단위 테스트는 다양한 이유로 유용합니다.

특히 세 가지는 다음과 같습니다.

  • 단위 테스트는 다른 사람들이 코드의 제약 조건을 이해하는 데 도움이됩니다. 기본적으로 단위 테스트는 문서 형식입니다.

  • 단위 테스트는 단일 코드 단위가 올바른 결과를 반환하는지 확인하고 세부 사항을 수정할 때 프로그램 동작이 변경되지 않는지 확인합니다.

  • 단위 테스트를 사용하면 연구 코드를 쉽게 모듈화 할 수 있습니다. 병렬화 또는 GPGPU 시스템에서 코드를 실행하려는 경우와 같이 새 플랫폼에서 코드를 대상으로하려고 시도하는 경우 특히 중요 할 수 있습니다.

무엇보다도 단위 테스트는 코드를 사용하여 생성 한 연구 결과가 유효하고 검증 가능하다는 확신을줍니다.

귀하의 질문에 회귀 테스트를 언급했습니다. 대부분의 경우 회귀 테스트는 단위 테스트 및 / 또는 통합 테스트의 자동화 된 정기적 실행을 통해 수행됩니다 (이 코드는 결합 될 때 코드 조각이 올바르게 작동하는지 테스트합니다. 과학 컴퓨팅에서는 출력을 실험 데이터 또는 신뢰할 수있는 이전 프로그램의 결과). 대규모 복잡한 구성 요소 수준에서 이미 통합 테스트 또는 단위 테스트를 사용하고있는 것 같습니다.

제가 말하고자하는 것은 연구 코드가 점점 복잡해지고 다른 사람들의 코드와 라이브러리에 의존함에 따라 오류가 발생할 때 오류가 발생하는 위치를 이해하는 것이 중요하다는 것입니다. 단위 테스트를 통해 오류를 훨씬 쉽게 찾아 낼 수 있습니다.

Scientific Computing의 모범 사례 에서 공동 저술 한 논문의 섹션 7 "실수 계획"에서 설명, 증거 및 참고 자료를 찾을 수 있습니다. 또한 방어 프로그래밍의 보완 개념을 소개합니다.


9

내 deal.II 클래스에서 나는 제대로 작동 (내가 의도적으로 "며 스트레스로 이동하지 않는 검사를하지 않는 소프트웨어를 가르 칠 않습니다 하지"제대로 작동하지 " 수도 제대로 작동되지 않음).

물론 나는 만트라에 의해 산다. 이것은 거래 방식이다.

더 진지하게, Matt는 이미 두 가지 테스트 클래스를 잘 정의하고 있다고 생각합니다. 우리는 하위 레벨에 대한 단위 테스트를 작성하며 상위 레벨에 대한 회귀 테스트로 자연스럽게 진행됩니다. 나는 우리의 테스트를 한쪽 또는 다른쪽으로 분리하는 명확한 경계를 그릴 수 있다고 생각하지 않습니다. 누군가가 출력을 보았고 그것이 상당히 합리적이라는 것을 발견 한 선을 밟는 사람이 많이 있습니다 (단위 테스트?) 마지막 정확도를 보지 않고 (회귀 테스트?)


소프트웨어 테스트에서 기존 수준 에 비해이 계층 (낮은 단위, 낮은 회귀)을 제안하는 이유는 무엇 입니까?
ximiki

@ ximiki-나는 의미하지 않습니다. 테스트에 귀하의 링크에 나열된 모든 카테고리를 포함하는 스펙트럼이 존재한다고 말하고 있습니다.
Wolfgang Bangerth

8

예, 아니오 변환 루틴, 문자열 매핑, 기본 물리학 및 수학 등과 같이 일상 생활을 편하게하는데 사용하는 기본 도구 세트의 기본 루틴에 대한 단위 테스트는 계산 클래스 또는 함수와 관련하여 일반적으로 긴 실행 시간이 필요할 수 있습니다. 실제로 단위 대신 기능 테스트로 테스트하는 것을 선호 할 수 있습니다. 또한, 레벨과 용도가 많이 변경 될 예정이거나 (예 : 최적화 목적으로) 내부 세부 사항이 어떤 이유로 든 변경 될 클래스 및 엔티티를 단위 테스트하고 강조합니다. 가장 일반적인 예는 디스크에서 매핑 된 거대한 행렬을 래핑하는 클래스입니다.


7

물론!

뭐로 충분하지 않아?

과학 프로그래밍은 다른 어떤 것보다 물리 시스템과 일치 시키려고 노력하고 있습니다. 테스트 이외의 작업을 수행했는지 어떻게 알 수 있습니까? 코딩을 시작하기 전에 코드 사용 방법을 결정하고 몇 가지 예제 실행을 수행하십시오. 가능한 경우를 잡으십시오. 예를 들어 신경망의 경우 단일 신경에 대한 일련의 테스트와 완전한 신경망에 대한 일련의 테스트를 수행 할 수 있습니다. 이렇게하면 코드 작성을 시작할 때 네트워크 작업을 시작하기 전에 뉴런이 작동하는지 확인할 수 있습니다. 이와 같은 단계에서 작업한다는 것은 문제가 발생했을 때 테스트 할 최신 '단계'코드 만 가지고 있다는 것을 의미합니다. 초기 단계는 이미 테스트되었습니다.

또한 테스트가 완료되면 코드를 다른 언어로 다시 작성해야하거나 (예 : CUDA로 변환) 업데이트 만하는 경우에도 이미 테스트 사례가 있으므로 테스트에 사용할 수 있습니다. 두 버전의 프로그램이 동일한 방식으로 작동하는지 확인하십시오.


+1 : "이러한 단계에서 작업한다는 것은 문제가 발생했을 때 테스트 할 최신 '단계'코드 만 있으면 초기 단계가 이미 테스트되었음을 ​​의미합니다."
ximiki

5

예.

단위 테스트없이 코드를 작성한다는 아이디어는 혐오입니다. 코드가 올바른지 증명 한 다음 증명이 올바른지 증명하지 않으면 = P.


3
... 그리고 당신은 그 증거가 정확하다는 증거를 증명합니다. 그리고 지금 ... 그것은 깊은 토끼 구멍입니다.
JM

2
거북은 계속해서 Dijkstra를 자랑스럽게 만듭니다!
aterrel

2
일반적인 경우를 해결 한 다음 증거 자체가 올바른지 확인하십시오! 거북이의 원환!
Aesin

5

나는이 질문에 독단적으로보다는 실용적으로 접근 할 것이다. "함수 X에서 무엇이 잘못 될 수 있습니까?" 코드에 일반적인 버그를 도입 할 때 출력에 어떤 일이 발생하는지 상상해보십시오. 잘못된 프리 팩터, 잘못된 인덱스 ... 그리고 그런 종류의 버그를 감지 할 수있는 단위 테스트를 작성하십시오. 주어진 함수에 대해 함수 자체의 코드를 반복하지 않고 그러한 테스트를 작성할 수있는 방법이 없다면,하지 말고 다음 단계의 테스트에 대해 생각하십시오.

과학 코드 에서 단위 테스트 (또는 실제로 모든 테스트)에서 훨씬 더 중요한 문제 는 부동 소수점 산술의 불확실성을 처리하는 방법입니다. 내가 아는 한 아직 좋은 일반적인 해결책은 없습니다.


단위 테스트를 사용하여 수동으로 테스트하든 자동으로 테스트하든 부동 소수점 표시와 정확히 동일한 문제가 있습니다. ACCU과부하 잡지 에서 Richard Harris의 우수한 기사 시리즈 를 강력히 추천 합니다.
Mark Booth

"주어진 함수에 대해 함수 자체의 코드를 반복하지 않고 그러한 테스트를 작성할 수있는 방법이 없다면 그렇게하지 마십시오." 정교하게 할 수 있습니까? 예를 들어 이것을 분명히 알 수 있습니다.
ximiki

5

Tangurena에 대해 유감스럽게 생각합니다. 여기에서 "테스트되지 않은 코드는 코드가 손상되었습니다"라는 문구가 있으며, 이는 상사로부터 나왔습니다. 단위 테스트를 수행하는 모든 좋은 이유를 반복하기보다는 몇 가지 세부 사항을 추가하고 싶습니다.

  • 메모리 사용량을 테스트해야합니다. 메모리를 할당하는 모든 기능을 테스트하여 해당 메모리에 데이터를 저장하고 검색하는 기능이 올바르게 수행되고 있는지 확인해야합니다. 이것은 GPU 세계에서 훨씬 더 중요합니다.
  • 이전에 간략하게 언급했지만 최신 사례 테스트는 매우 중요합니다. 이러한 테스트는 계산 결과를 테스트하는 것과 같은 방식으로 생각하십시오. 입력 매개 변수 또는 데이터가 허용 가능한 경계를 벗어나면 코드가 에지에서 동작하고 정상적으로 시뮬레이션에 실패하는지 확인하십시오 (시뮬레이션에서 정의). 이런 종류의 테스트 작성과 관련된 사고는 작업을 선명하게하는 데 도움이되며 단위 테스트를 작성했지만 프로세스가 유용하지 않은 사람을 거의 찾지 못하는 이유 중 하나 일 수 있습니다.
  • 테스트 프레임 워크를 사용하십시오 (좋은 링크를 제공 한 Geoff가 언급 한대로). CMake의 CTest 시스템과 함께 BOOST 테스트 프레임 워크를 사용했으며 단위 테스트 (유효성 검증 및 회귀 테스트)를 빠르게 작성하는 쉬운 방법으로 권장 할 수 있습니다.

+1 : "입력 매개 변수 또는 데이터가 허용 가능한 경계를 벗어난 경우 코드가 가장자리에서 동작하고 정상적으로 시뮬레이션에 실패하는지 확인하십시오."
ximiki

5

입자 물리학에서 논문 분석 코드 의 세 번째 버전을 포함하여 여러 소규모 (예 : 단일 프로그래머) 코드에 좋은 효과를주기 위해 단위 테스트를 사용 했습니다.

처음 두 버전은 자체 무게와 상호 연결의 곱셈으로 무너졌습니다.

다른 사람들은 모듈 간의 상호 작용이 종종 과학적 코딩이 깨지는 장소라고 말했으며, 그것이 맞습니다. 그러나 각 모듈 수행하려는 작업을 결정적으로 보여줄 수 있으면 이러한 문제 를 진단 하는 것이 훨씬 쉽습니다 .


3

복잡한 지질학 도메인을 위해 화학적 솔버를 개발하는 동안 사용했던 약간 다른 접근법은 Copy and Paste Snippet으로 Unit Testing을 호출 할 수있는 방법이었습니다 .

대형 화학 시스템 모델러에 내장 된 원본 코드에 대한 테스트 하네스를 구축하는 것은 시간 내에 실현 가능하지 않았습니다.

그러나, 나는 다른 표현에 대한 단위 테스트로서 화학식에 대한 (부스트 스피릿) 파서가 어떻게 작동했는지를 보여주는 점점 더 복잡한 스 니펫 세트를 작성할 수있었습니다.

마지막으로 가장 복잡한 단위 테스트는 코드를 조롱 할 수 있도록 변경하지 않고도 시스템에 필요한 코드와 매우 유사했습니다. 따라서 단위 테스트 코드를 복사 할 수있었습니다.

이것을 학습 연습과 진정한 회귀 스위트 이상으로 만드는 것은 두 가지 요소입니다-단위 소스 테스트는 기본 소스에서 유지되고 해당 응용 프로그램에 대한 다른 테스트의 일부로 실행됩니다. 2 년 후 스피릿 변경)-실제 응용 프로그램에서 복사하여 붙여 넣은 코드가 최소한으로 수정 되었기 때문에 단위 테스트를 다시 참조하여 주석을 동기화하도록 유지할 수 있습니다.


2

더 큰 코드 기반에는 높은 수준의 항목에 대한 테스트 (단위 테스트 일 필요는 없음)가 유용합니다. 간단한 함수에 대한 단위 테스트는 도우미 함수가 sin대신을 사용하기 때문에 코드가 말도 안되는 일이 없도록하는 데 유용합니다 cos.

그러나 전체 연구 코드의 경우 테스트를 작성하고 유지하기가 매우 어렵습니다. 알고리즘은 의미있는 중간 결과없이 큰 경향이 있으며, 이는 명백한 테스트를 수행 할 수 있으며 결과가 나오기까지 종종 오랜 시간이 걸립니다. 물론 좋은 결과를 얻은 참조 실행에 대해 테스트 할 수 있지만 이것은 단위 테스트 의미에서 좋은 테스트가 아닙니다.

결과는 종종 진정한 솔루션의 근사치입니다. 간단한 함수가 엡실론까지 정확하다면 테스트 할 수 있지만, 결과 메쉬가 정확한지 여부를 확인하기는 매우 어렵습니다.

이러한 경우 자동 테스트는 종종 비용 / 이익 비율이 너무 높습니다. 더 좋은 것을 추천합니다 : 테스트 프로그램 작성. 예를 들어, 나는 중간 크기의 파이썬 스크립트를 작성하여 가장자리 크기 및 각도의 막대 그래프, 가장 크고 작은 삼각형의 면적 및 비율 등과 같은 결과에 대한 데이터를 작성했습니다.

정상적인 작동 중에 입력 및 출력 메쉬를 평가하는 데 사용할 수 있습니다. I는 알고리즘 변경 후에 새 너티 체크를 위해 사용. 알고리즘을 변경할 때 새 결과가 더 좋은지 항상 알지는 못합니다. 왜냐하면 어떤 근사가 가장 좋은 절대적인 측정 방법이 없기 때문입니다. 그러나 이러한 메트릭스를 생성함으로써 "새로운 변형은 궁극적으로 더 나은 각도 비를 갖지만 수렴 률은 더 나빠집니다"와 같은 몇 가지 요소에 대해 알 수 있습니다.

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